Excel 循环浏览多个工作表并删除给定范围内的所有空列

Excel 循环浏览多个工作表并删除给定范围内的所有空列,excel,vba,Excel,Vba,我想循环浏览多个工作表并删除给定范围内的每个空列 我明白了 错误2023和运行时错误13 关于if语句 Sub Delete\u all\u empty\u columns\u test2() 变暗区域(12)作为范围,Idx作为整数,C作为范围 设置区域(0)=Ark2.范围(“C6:W6”) 设置区域(1)=Ark4.范围(“D11:X11”) 设置区域(2)=Ark3.范围(“D11:X11”) 设置区域(3)=Ark3.范围(“AC11:AW11”) 设置区域(4)=图1.范围(“C6:

我想循环浏览多个工作表并删除给定范围内的每个空列

我明白了

错误2023和运行时错误13

关于if语句

Sub Delete\u all\u empty\u columns\u test2()
变暗区域(12)作为范围,Idx作为整数,C作为范围
设置区域(0)=Ark2.范围(“C6:W6”)
设置区域(1)=Ark4.范围(“D11:X11”)
设置区域(2)=Ark3.范围(“D11:X11”)
设置区域(3)=Ark3.范围(“AC11:AW11”)
设置区域(4)=图1.范围(“C6:W6”)
设定区域(5)=Ark12.范围(“C6:W6”)
设定区域(6)=Ark11.范围(“C6:W6”)
设定区域(7)=Ark11.范围(“AA6:AU6”)
设置区域(8)=Ark14.范围(“D11:X11”)
设置区域(9)=Ark8.范围(“D11:X11”)
设置区域(10)=Ark9.范围(“D11:X11”)
设置区域(11)=Ark10.范围(“D11:X11”)
设置区域(12)=表2.范围(“E13:X13”)
对于Idx=0到12
对于区域(12)中的每个C。单元格
如果C.Value=“0”或C.Value=“”或C.Value=“不适用”,则
删除
如果结束
下一个C
下一个Idx
端接头

虽然您可以轻松地在所有工作表(或工作表)中循环,但循环的简单性却被每个工作表上要执行的任务之间的复杂差异所击败。在设计代码时,您应该识别重复的任务。在这种情况下,是删除空白列

在实际编写代码时,您需要从核心向外工作。在这种情况下,核心是测试<代码>如果C.Value=“0”无法工作,因为范围的值是数组。下一个任务是循环遍历列。你不能用。。。每个列都是因为您需要先删除最后一列,因为删除某些列时,列的位置会发生变化

下面是根据上述逻辑生成的代码

Sub DeleteEmptyColumns(ByVal RngAddress As String, _
                       Ws As Worksheet)

    Dim C       As Long             ' loop counter: columns
    
    With Ws.Range(RngAddress)
        For C = (.Column + .Columns.Count - 1) To .Column Step -1
            With .Worksheet
                If WorksheetFunction.CountA(.Columns(C)) = 1 Then
                    .Columns(C).EntireColumn.Delete
                End If
            End With
        Next C
    End With
End Sub
使用两个参数调用sub,即要检查的列范围的地址和找到它的工作表。在下一步中,您需要一个过程来调用子例程。此过程的性质来自子例程的要求。给你

Sub DeleteEmptyColumns_Main()

    DeleteEmptyColumns "C6:W6", Ark2
    DeleteEmptyColumns "D11:X11", Ark4
    
'    Set Areas(2) = Ark3.Range("D11:X11")
'    Set Areas(3) = Ark3.Range("AC11:AW11")
'    Set Areas(4) = Sheet1.Range("C6:W6")
'    Set Areas(5) = Ark12.Range("C6:W6")
'    Set Areas(6) = Ark11.Range("C6:W6")
'    Set Areas(7) = Ark11.Range("AA6:AU6")
'    Set Areas(8) = Ark14.Range("D11:X11")
'    Set Areas(9) = Ark8.Range("D11:X11")
'    Set Areas(10) = Ark9.Range("D11:X11")
'    Set Areas(11) = Ark10.Range("D11:X11")
    
    DeleteEmptyColumns "E13:X13", Worksheets("Sheet2")
End Sub
我没有完成打字任务,但很容易。请注意,您甚至可以将单个列作为rngaddress参数传递,但必须指定为“C:C”。可以使用代码名(正如您的代码所做的)或选项卡名指定工作表,需要类似于
工作表(“MyTab”)
的语法,如上面最后一项所示-仅用于显示。最好坚持一种方法。代码名的[dis-]优点是,当用户更改选项卡名称时,它们不会更改

可以说,调用执行子例程的任务可以通过
Main
中的循环来简化,但这是另一个线程的另一个问题。我怀疑这种努力是否值得,因为重复的数量是有限的


所以,唯一要做的事情就是考虑子例程的范围。由于它不会从除
Main
之外的任何地方调用,因此应该与
Main
放在同一个模块中,它的作用域不必是公共的(这是默认值),因此应该标记为
Private

,您可以使用
iError
来测试单元格是否出错。