2014-09-11 80 views
1

我有以下代碼,它在我的工作簿中的所有工作表上執行一個宏,但排除列表字符串中的那些除外。不尋常的循環宏行爲

奇怪的是,它也忽略了其他紙張,沒有邏輯背後。

主頁,概述和設置在前面,然後我有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 

回答

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

+0

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

+0

非常好。就那麼簡單。謝謝Gareth,我不是這個參數的東西。 – 2014-09-11 15:08:12

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中的工作表上迭代只有。我使用正斜槓作爲分隔符,因爲它們是工作表名稱中的非法字符,而逗號不是。

+0

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