Vba 当i';我要求不要这样
有人知道为什么不是所有的工作表都被排除在我下面的代码中吗?“资产”表似乎仍包括在内。非常感谢Vba 当i';我要求不要这样,vba,excel,Vba,Excel,有人知道为什么不是所有的工作表都被排除在我下面的代码中吗?“资产”表似乎仍包括在内。非常感谢 Sub Run_Me_To_Fix_Columns() Dim ws As Worksheet '------------------------------------------------------------------ 'List the names of the worksheets to exclude from Sub resizingColumns '------------
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
Sub Run\u Me\u To\u Fix\u Columns()
将ws设置为工作表
'------------------------------------------------------------------
'列出要从子大小调整列中排除的工作表的名称
'------------------------------------------------------------------
Const excludeSheets As String=“控制、DIVA\u报告、资产”
'------------------------------------------------------------------
对于ActiveWorkbook.Worksheets中的每个ws
如果IsError(Application.Match(ws.Name,Split(excludeSheets,“,”),则
调用调整列大小(ws)
如果结束
下一个
端接头
子大小调整列(ws-As工作表)
与ws
宽度范围(“A:AZ”)。柱宽=10
以
对于i=1到24
Numbers=工作表function.Count(ws.Columns(i))
Text=工作表function.CountA(ws.Columns(i))-编号
如果数字<文本,则
ws.Columns(i).EntireColumn.AutoFit
如果结束
接下来我
端接头
在工具箱中拥有一些基本的调试技能总是一个好主意。例如,您可以在测试之前插入如下代码:
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
这将向您显示您正在检查的值(长度确保它们之前或之后没有意外的空白,这在工作表名称之前让我感到讨厌)
更进一步,我将实际指导您完成一个体面的调试会话,以便您可以获得该领域的一些技能。首先,使用工作表“Sheet1”到“Sheet5”创建一个新工作簿,并输入以下代码:
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]
您可以从该输出中看到,唯一的图纸输出是Sheet1
,尽管Sheet4
不在排除列表中。并且,从匹配
行中,Sheet3
和Sheet4
似乎都位于排除列表的位置2
因此,这会立即告诉您问题所在,Excel似乎做错了什么。但是,事实上,它正在做你让它做的事情。转到下一页,我们将看到以下小片段:
expression.Match(查找值、查找数组、匹配类型)
- 如果
为1,Match\u type
将查找小于或等于Match
的最大值<代码>查找_数组必须按升序排列:…-2,-1,0,1,2,…,A-Z,FALSE,TRUELookup\u value
- 如果
为0,则Match\u type
将查找与Match
完全相等的第一个值<代码>查找\u数组可以是任何顺序Lookup\u value
- 如果
为-1,Match\u type
将查找大于或等于Match
的最小值<代码>查找_数组必须按降序排列:TRUE、FALSE、Z-A、…2、1、0、-1、-2、…等等Lookup\u value
- 如果省略了
,则假定为1Match_type
Sheet1
会导致错误,因为排除列表中没有小于或等于它的条目
但是,对于表4
,有一个匹配项<代码>表2和表3
都小于或等于表4
,而表3
是其中最大的,因此它被“发现”在位置2
你可能会发现在你的情况下更奇怪的结果,因为你的工作表不是按字母顺序排序的
然后,解决方案是指定精确匹配,而不是使用默认值(添加到match
调用的0
参数):
您忘记请求[match_type]参数的精确匹配
Application.Match(ws.Name,Split(excludeSheets,“,”),0)
。我的错,它显示了错误。+1我完全同意:)感谢您的回复,我同意我需要学习更多关于VBA和调试的知识,因为我是一名初学者。不幸的是,我仍然收到一个错误,这一次我能够看到以下代码失败,ActiveWorkbook中的每个ws的类型不匹配13错误。工作表MsgBox“MATCH:”&ws.Name&“:“&Application.MATCH(ws.Name,Split(excludeSheets,”)Next
更多帮助。。我已经确认长度是相同的,似乎是工作表名称导致了问题,因为资产控制失败,但资产控制有效。。。很奇怪@cRIMSOnffs,这可能是因为只有一个按照匹配(…,1)
的要求排序。我最近更新的使用match(…,0)
应该可以解决您的问题。
If IsError(Application.Match(ws.Name, Split(excludeSheets, ","), 0)) Then