为什么当我要求它不被包含在VBA中?

有谁知道为什么不是所有的床单被排除在我的代码定义如下? 看来,表“资产”仍然被包括在内。 非常感谢

Sub Run_Me_To_Fix_Columns() Dim ws As Worksheet '------------------------------------------------------------------ 'List the names of the worksheets to exclude from Sub resizingColumns '------------------------------------------------------------------ Const excludeSheets As String = "Control,DIVA_Report,Asset" '------------------------------------------------------------------ For Each ws In ActiveWorkbook.Worksheets If IsError(Application.Match(ws.Name, Split(excludeSheets, ","))) Then Call resizingColumns(ws) End If Next End Sub Sub resizingColumns(ws As Worksheet) With ws ws.Range("A:AZ").ColumnWidth = 10 End With For i = 1 To 24 Numbers = WorksheetFunction.Count(ws.Columns(i)) Text = WorksheetFunction.CountA(ws.Columns(i)) - Numbers If Numbers < Text Then ws.Columns(i).EntireColumn.AutoFit End If Next i End Sub 

在你的工具箱里有一些基本的debugging技巧总是一个好主意。 例如,您可以testing之前插入如下所示的代码:

 For Each s In Split(excludeSheets, ",") MsgBox "EX: [" & s & "]: " & CStr(len(s)) Next For Each ws In ActiveWorkbook.Worksheets MsgBox "WS: [" & ws.Name & "]: " & CStr(len(ws.Name)) Next For Each ws In ActiveWorkbook.Worksheets MsgBox "MATCH: " & ws.Name & ": " & CStr(Application.Match(ws.Name, Split(excludeSheets, ","))) MsgBox "ISERR: " & ws.Name & ": " & CStr(IsError(Application.Match(ws.Name, Split(excludeSheets, ",")))) Next 

这将显示你正在检查的值(长度,以确保他们之前或之后没有意想不到的空白,以前用表名称咬我的东西)。


此外,我会实际引导您进行体面的debugging,以便您可以在该领域获得一些技能。 首先,使用“Sheet1”到“Sheet5”创build一个新的工作簿,然后input以下代码:

 Sub test() Dim ws As Worksheet Const excludeSheets As String = "Sheet2,Sheet3,Sheet5" For Each s In Split(excludeSheets, ",") MsgBox "EX: [" & s & "]: " & CStr(Len(s)) Next For Each ws In ActiveWorkbook.Worksheets MsgBox "WS: [" & ws.Name & "]: " & CStr(Len(ws.Name)) Next For Each ws In ActiveWorkbook.Worksheets MsgBox "MATCH: [" & ws.Name & "]: " & CStr(Application.Match(ws.Name, Split(excludeSheets, ","))) MsgBox "ISERR: [" & ws.Name & "]: " & CStr(IsError(Application.Match(ws.Name, Split(excludeSheets, ",")))) Next For Each ws In ActiveWorkbook.Worksheets If IsError(Application.Match(ws.Name, Split(excludeSheets, ","))) Then MsgBox "GOT: [" & ws.Name & "]" End If Next End Sub 

当你运行它时,你会看到下面的消息框:

 EX: [Sheet2]: 6 EX: [Sheet3]: 6 EX: [Sheet5]: 6 WS: [Sheet1]: 6 WS: [Sheet2]: 6 WS: [Sheet3]: 6 WS: [Sheet4]: 6 WS: [Sheet5]: 6 MATCH: [Sheet1]: Error 2042 ISERR: [Sheet1]: True MATCH: [Sheet2]: 1 ISERR: [Sheet2]: False MATCH: [Sheet3]: 2 ISERR: [Sheet3]: False MATCH: [Sheet4]: 2 ISERR: [Sheet4]: False MATCH: [Sheet5]: 3 ISERR: [Sheet5]: False GOT: [Sheet1] 

您可以从该输出中看到,尽pipeSheet4不在排除列表中,但唯一的工作表输出是Sheet1 。 而且,从MATCH行中, Sheet3Sheet4似乎都在排除列表的位置2中find。

所以这立即告诉你问题在哪里,Excel似乎做错了什么。 但是,事实上,它正在做你所说的事情。 进入Match函数的文档 ,我们看到这个小片段:

expression.Match (Lookup_value, Lookup_array, Match_type)

  • 如果Match_type为1,则Match查找小于或等于Lookup_value最大值。 Lookup_array必须按升序排列:…,2,-1,0,1,2,…,AZ,FALSE,TRUE。

  • 如果Match_type为0, Match查找与Lookup_value完全相同的第一个值。 Lookup_array可以以任何顺序。

  • 如果Match_type为-1,则Match查找大于或等于Lookup_value的最小值。 Lookup_array必须按降序排列:TRUE,FALSE,ZA,… Lookup_array ,-1,-2,…依此类推。

  • 如果省略Match_type ,则假定为1。

请注意,最后一条。 由于您select“最大小于或等于”的默认匹配types, Sheet1会导致错误,因为在排除列表中没有小于或等于它的条目。

但是,对于Sheet4 ,有一个匹配。 Sheet2Sheet3都小于或等于Sheet4 ,而Sheet3是其中最大的,因此为什么它在位置2中“find”。

您可能会发现在您的情况下,甚至陌生的结果,因为您的工作表我不是按字母顺序sorting。

然后,解决scheme是指定一个完全匹配,而不是使用默认(添加到Match调用的0参数):

 If IsError(Application.Match(ws.Name, Split(excludeSheets, ","), 0)) Then