Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 5762|回复: 10

[已解决]缺少函数或变量?

[复制链接]
发表于 2016-3-2 11:50 | 显示全部楼层 |阅读模式
本帖最后由 lingyuncelia1 于 2016-3-2 14:52 编辑

月光曲..jpg
为什么运行以下代码会弹出警告框:缺少函数或变量?l老显示“c”有问题,不明白“c”有什么问题。
Sub 四链法()
'同行四链法
For i = 1 To 9
    For k = 1234 To 6789
        a = Left(k, 1)
        b = Mid(k, 2, 1)
        c = Mid(k, 3, 1)
        d = Right(k, 1)
        If Val(d) > Val(c) > Val(b) > Val(a) Then
            For j = 1 To 9
                s = CStr(Cells(i, j))
                If s = a & b Or s = a & c Or s = a & d Or s = b & c Or s = b & d Or s = c & d _
                & s = a & b & c Or s = a & b & d Or s = a & c & d Or s = b & c & d _
                & s = a & b & c & d Then
                    n = n + 1
                    x = x & "," & Cells(i, j).Address
                End If
            Next
        End If
        If n = 4 Then
        Range(Mid(x, 2)).Font.Size = 36
        For Each Rng In Cells(i, 1).Resize(1, 9)
        If Rng.Font.Size = 11 Then
        Rng.Value = Replace(Rng.Text, a, "")
        Rng.Value = Replace(Rng.Text, b, "")
        Rng.Value = Replace(Rng.Text, c, "")
        Rng.Value = Replace(Rng.Text, d, "")
        End If
        Next
        End If
        n = 0: x = ""
    Next
Next
End Sub

最佳答案
2016-3-2 14:10
看看这样行不行(未经测试)
  1. Sub 四链法()
  2. '同行四链法
  3.     For i = 1 To 9
  4.         For k = 1234 To 6789
  5.             a = Left(k, 1)
  6.             b = Mid(k, 2, 1)
  7.             c = Mid(k, 3, 1)
  8.             d = Right(k, 1)
  9.             If d > c And c > b And b > a Then
  10.                 For j = 1 To 9
  11.                     s = CStr(Cells(i, j))
  12.                     If s = a & b Or s = a & c Or s = a & d Or s = b & c Or s = b & d Or s = c & d _
  13.                        Or s = a & b & c Or s = a & b & d Or s = a & c & d Or s = b & c & d _
  14.                        Or s = a & b & c & d Then
  15.                         n = n + 1
  16.                         x = x & "," & Cells(i, j).Address
  17.                     Else
  18.                         y = y & "," & Cells(i, j).Address
  19.                     End If
  20.                 Next
  21.             End If
  22.             If n = 4 Then
  23.                 Range(Mid(x, 2)).Font.Size = 36
  24.                 yy = Mid(y, 2)
  25.                 Range(yy).Replace a, ""
  26.                 Range(yy).Replace b, ""
  27.                 Range(yy).Replace c, ""
  28.                 Range(yy).Replace d, ""
  29.             End If
  30.             n = 0: x = "": y = ""
  31.         Next
  32.     Next
  33. End Sub
复制代码

月光曲.zip

14.07 KB, 下载次数: 4

发表于 2016-3-2 13:47 | 显示全部楼层
因为你模块2里有个名称为c的sub,改变量名或模块2里的sub名都可以。

评分

参与人数 1 +3 收起 理由
lingyuncelia1 + 3

查看全部评分

回复

使用道具 举报

发表于 2016-3-2 14:00 | 显示全部楼层
另外代码也有些其他问题,小改如下:
  1. Sub 四链法()
  2. '同行四链法
  3.     For i = 1 To 9
  4.         For k = 1234 To 6789
  5.             a = Left(k, 1)
  6.             b = Mid(k, 2, 1)
  7.             c = Mid(k, 3, 1)
  8.             d = Right(k, 1)
  9.             If d > c And c > b And b > a Then
  10.                 For j = 1 To 9
  11.                     s = CStr(Cells(i, j))
  12.                     If s = a & b Or s = a & c Or s = a & d Or s = b & c Or s = b & d Or s = c & d _
  13.                        Or s = a & b & c Or s = a & b & d Or s = a & c & d Or s = b & c & d _
  14.                        Or s = a & b & c & d Then
  15.                         n = n + 1
  16.                         x = x & "," & Cells(i, j).Address
  17.                     End If
  18.                 Next
  19.             End If
  20.             If n = 4 Then
  21.                 Range(Mid(x, 2)).Font.Size = 36
  22.                 For Each Rng In Cells(i, 1).Resize(1, 9)
  23.                     If Rng.Font.Size = 11 Then
  24.                         Rng.Value = Replace(Rng.Text, a, "")
  25.                         Rng.Value = Replace(Rng.Text, b, "")
  26.                         Rng.Value = Replace(Rng.Text, c, "")
  27.                         Rng.Value = Replace(Rng.Text, d, "")
  28.                     End If
  29.                 Next
  30.             End If
  31.             n = 0: x = ""
  32.         Next
  33.     Next
  34. End Sub
复制代码

评分

参与人数 1 +3 收起 理由
lingyuncelia1 + 3 赞一个

查看全部评分

回复

使用道具 举报

发表于 2016-3-2 14:03 | 显示全部楼层
vba里没有这种用法的:If Val(d) > Val(c) > Val(b) > Val(a) Then
另外vba里,"3">"1"是成立的。当字符型比较时,是按asc码大小比较的。所以代码里的Val可以不用。

评分

参与人数 1 +3 收起 理由
lingyuncelia1 + 3 来学习

查看全部评分

回复

使用道具 举报

发表于 2016-3-2 14:10 | 显示全部楼层    本楼为最佳答案   
看看这样行不行(未经测试)
  1. Sub 四链法()
  2. '同行四链法
  3.     For i = 1 To 9
  4.         For k = 1234 To 6789
  5.             a = Left(k, 1)
  6.             b = Mid(k, 2, 1)
  7.             c = Mid(k, 3, 1)
  8.             d = Right(k, 1)
  9.             If d > c And c > b And b > a Then
  10.                 For j = 1 To 9
  11.                     s = CStr(Cells(i, j))
  12.                     If s = a & b Or s = a & c Or s = a & d Or s = b & c Or s = b & d Or s = c & d _
  13.                        Or s = a & b & c Or s = a & b & d Or s = a & c & d Or s = b & c & d _
  14.                        Or s = a & b & c & d Then
  15.                         n = n + 1
  16.                         x = x & "," & Cells(i, j).Address
  17.                     Else
  18.                         y = y & "," & Cells(i, j).Address
  19.                     End If
  20.                 Next
  21.             End If
  22.             If n = 4 Then
  23.                 Range(Mid(x, 2)).Font.Size = 36
  24.                 yy = Mid(y, 2)
  25.                 Range(yy).Replace a, ""
  26.                 Range(yy).Replace b, ""
  27.                 Range(yy).Replace c, ""
  28.                 Range(yy).Replace d, ""
  29.             End If
  30.             n = 0: x = "": y = ""
  31.         Next
  32.     Next
  33. End Sub
复制代码

评分

参与人数 1 +3 收起 理由
lingyuncelia1 + 3 很给力

查看全部评分

回复

使用道具 举报

发表于 2016-3-2 14:21 | 显示全部楼层
另外12行的条件可以写成这样(未经测试):
If InStr(k & a & b & d & a & c & d & a & c & a & d & b & d, s) > 0 Then
意思是s包含在字符串 abcd abd acd ac ad bd 中就满足条件

评分

参与人数 1 +3 收起 理由
lingyuncelia1 + 3

查看全部评分

回复

使用道具 举报

发表于 2016-3-2 14:25 | 显示全部楼层
因为abd 含 bd,acd 含 ac,12行的条件可以继续简化:
If InStr(k & a & b & d & a & c & d  & a & d , s) > 0 Then
意思是s包含在字符串 abcd abd acd  ad  中就满足条件

评分

参与人数 1 +3 收起 理由
lingyuncelia1 + 3 我和小伙伴都惊呆了

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2016-3-2 14:43 | 显示全部楼层
grf1973 发表于 2016-3-2 13:47
因为你模块2里有个名称为c的sub,改变量名或模块2里的sub名都可以。

验证过,果然如此。
回复

使用道具 举报

 楼主| 发表于 2016-3-2 14:49 | 显示全部楼层
grf1973 发表于 2016-3-2 14:10
看看这样行不行(未经测试)

实验证明,OK。
回复

使用道具 举报

 楼主| 发表于 2016-3-2 14:56 | 显示全部楼层
grf1973 发表于 2016-3-2 14:21
另外12行的条件可以写成这样(未经测试):
If InStr(k & a & b & d & a & c & d & a & c & a & d & b & d ...

经测试,OK。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-4-19 20:59 , Processed in 0.311296 second(s), 18 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表