我有以下代码在我的工作簿中的所有工作表上执行宏,但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
答案 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中。我使用正斜杠作为分隔符,因为它们是工作表名称中的非法字符,而逗号则不是。