不寻常的循环宏行为
我有以下代码,它在我的工作簿中的所有工作表上执行一个宏,但排除列表字符串中的那些除外。不寻常的循环宏行为
奇怪的是,它也忽略了其他纸张,没有逻辑背后。
主页,概述和设置在前面,然后我有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
我觉得你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
的。这个函数告诉你一个字符串中给定子字符串的位置。 但是: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中的工作表上迭代只有。我使用正斜杠作为分隔符,因为它们是工作表名称中的非法字符,而逗号不是。
另一个有趣的解决方案和一个放在我的工具包。谢谢艾肯。 – 2014-09-11 15:09:52
+ 1是的,你说得对:) – 2014-09-11 11:33:10
非常好。就那么简单。谢谢Gareth,我不是这个参数的东西。 – 2014-09-11 15:08:12