首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >循环遍历多个工作表并删除给定范围内的每个空列。

循环遍历多个工作表并删除给定范围内的每个空列。
EN

Stack Overflow用户
提问于 2020-12-10 23:52:46
回答 1查看 50关注 0票数 0

我想循环遍历多个工作表,并删除给定范围内的每个空列。

我得到了

错误2023和运行时错误13

如果-声明上。

代码语言:javascript
运行
复制
Sub Delete_all_empty_columns_test2()

    Dim Areas(12) As Range, Idx As Integer, C As Range

    Set Areas(0) = Ark2.Range("C6:W6")
    Set Areas(1) = Ark4.Range("D11:X11")
    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")
    Set Areas(12) = Sheet2.Range("E13:X13")

    For Idx = 0 To 12
        For Each C In Areas(12).Cells
            If C.Value = "0" Or C.Value = "" Or C.Value = "N/A" Then
                C.EntireColumn.Delete
            End If
        Next C
    Next Idx

End Sub
EN

回答 1

Stack Overflow用户

发布于 2020-12-11 01:09:41

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

在实际编写代码时,您需要从核心向外工作。在这种情况下,核心是测试。If C.Value = "0"无法工作,因为范围的值是数组。下一个任务是遍历列。你不能用..。每个列都是因为您需要先删除最后一列,因为当其中一些列被删除时,列将更改位置。

下面是由上述逻辑产生的代码。

代码语言:javascript
运行
复制
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,要检查的列范围的地址和找到它的工作表。在接下来的步骤中,您需要一个过程来调用子程序。它的性质来自子例程的要求。这就是了。

代码语言:javascript
运行
复制
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

我没有完成打字任务,但做起来很容易。请注意,您甚至可以将单个列作为RngAddresss参数传递,但必须像"C:C“那样指定它。工作表可以使用CodeNames (正如您的代码那样)或选项卡名来指定,需要像上面最后一项所示的Worksheets("MyTab")那样的语法--只是为了显示。最好坚持一种方法。CodeNames的优点是,当用户更改选项卡名时,它们不会改变。

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

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

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65243920

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档