Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 当i';我要求不要这样_Vba_Excel - Fatal编程技术网

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(查找值、查找数组、匹配类型)

  • 如果
    Match\u type
    为1,
    Match
    将查找小于或等于
    Lookup\u value
    的最大值<代码>查找_数组必须按升序排列:…-2,-1,0,1,2,…,A-Z,FALSE,TRUE

  • 如果
    Match\u type
    为0,则
    Match
    将查找与
    Lookup\u value
    完全相等的第一个值<代码>查找\u数组可以是任何顺序

  • 如果
    Match\u type
    为-1,
    Match
    将查找大于或等于
    Lookup\u value
    的最小值<代码>查找_数组必须按降序排列:TRUE、FALSE、Z-A、…2、1、0、-1、-2、…等等

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

注意最后一条。由于您选择的默认匹配类型为“最大值小于或等于”,因此
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