不寻常的循环宏行为

问题描述:

我有以下代码,它在我的工作簿中的所有工作表上执行一个宏,但排除列表字符串中的那些除外。不寻常的循环宏行为

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

主页,概述和设置在前面,然后我有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

+0

+ 1是的,你说得对:) – 2014-09-11 11:33:10

+0

非常好。就那么简单。谢谢Gareth,我不是这个参数的东西。 – 2014-09-11 15:08:12

而不是使用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中的工作表上迭代只有。我使用正斜杠作为分隔符,因为它们是工作表名称中的非法字符,而逗号不是。

+0

另一个有趣的解决方案和一个放在我的工具包。谢谢艾肯。 – 2014-09-11 15:09:52