不寻常的循环macros行为

我有以下代码,在我的工作簿中的所有工作表上执行一个macros,除了在excludesheetsstring中的那些。

奇怪的是,它忽略了其他表单,没有任何逻辑。

主页,概述和设置在前面,然后我有18张,我想执行,然后原始,度量,概述老和团队最终被排除在外。

所有的string表都被跳过了,但是我想要的表中有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 

我认为你的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。

而不是使用Application.Match尝试使用InStr 。 这个函数告诉你一个给定的子串在一个string中的位置。 但是 :如果没有find指定的子string, 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中的工作表上进行迭代,您也可以轻松地反转逻辑。 我使用正斜杠作为分隔符,因为它们是工作表名称中的非法字符,而逗号不是。