不寻常的循环宏行为

时间:2014-09-11 11:20:10

标签: excel vba excel-vba

我有以下代码在我的工作簿中的所有工作表上执行宏,但excludes表字符串中的那些除外。

奇怪的是,它也忽略了其他纸张,背后没有任何逻辑。

主页,概述和设置位于前面,然后我有18张我想要执行的页面,然后最终排除原始,指标,概述旧和团队。

正在跳过所有字符串表,但我想要的表格中有9张也是。

有人可以帮忙吗?

Sub Error_Check()

Const excludeSheets As String = "Home Page,Overview,Setup,Original,Metrics,Overview old,Teams"

Dim ws As Worksheet

For Each ws In Sheets
ws.Activate

If IsError(Application.Match(ws.Name, Split(excludeSheets, ","))) Then

'Macro bit

End If


Next ws

    End Sub

2 个答案:

答案 0 :(得分:5)

我认为您的Match声明需要指定match_type参数,因为您已将其留空。

试试这个(注意0):

If IsError(Application.Match(ws.Name, Split(excludeSheets, ","),0)) Then

此参数指定精确值是匹配还是最大值。请参阅MS文档:

  

如果match_type为1,MATCH将找到小于或等于lookup_value的最大值。

     

如果match_type为0,MATCH将找到与lookup_value完全相等的第一个值。 Lookup_array可以按任何顺序排列。

     

如果match_type为-1,MATCH将找到大于或等于lookup_value的最小值。

     

如果省略match_type,则假定为1。

答案 1 :(得分:4)

而不是使用Application.Match尝试使用InStr。此函数告诉您字符串中给定子字符串的位置。 然而InStr如果找不到指定的子字符串则返回0,这使得它成为您问题的另一个简单解决方案,而无需Split()

而不是你的

If IsError([...]) Then

试试这个:

Const excludeSheets = "/Home Page/Overview/Setup/Original/Metrics/Overview old/Teams/"
[...]
If InStr(excludeSheets, "/" & ws.Name & "/") = 0 Then

就我个人而言,我发现这种方法更简洁,更易读,只需将比较运算符从=更改为>,再在工作表中迭代 ,即可轻松反转逻辑其名称在excludeSheets中。我使用正斜杠作为分隔符,因为它们是工作表名称中的非法字符,而逗号则不是。