同时删除两列

时间:2018-11-23 02:39:36

标签: excel vba excel-vba if-statement basic

以下代码仅删除列J:

If Application.WorksheetFunction.Sum(Range("J:J").SpecialCells(xlCellTypeVisible)) _
        = Application.WorksheetFunction.Sum(Range("L:L").SpecialCells( _
        xlCellTypeVisible)) Then

    Columns("J:J").Delete Shift:=xlToLeft 'instead of .Select and Selection.

End If

但是,我想同时删除两个列JL。我该怎么办?

2 个答案:

答案 0 :(得分:1)

您可以使用Union()轻松地修改当前代码。

更改此行:

Columns("J:J").Delete Shift:=xlToLeft 'instead of .Select and Selection.

对此

Union(Columns("J"), Columns("L")).Delete Shift:=xlToLeft

这将同时使用两个范围并将其删除。

您的代码块现在应如下所示:

If Application.WorksheetFunction.Sum(Range("J:J").SpecialCells( _
        xlCellTypeVisible)) = Application.WorksheetFunction.Sum( _
        Range("L:L").SpecialCells(xlCellTypeVisible)) Then

    Union(Columns("J"), Columns("L")).Delete Shift:=xlToLeft

End If

我还要补充一点,确保您在正确的工作表中删除列是一个好主意。请明确表示,并始终至少使用工作表来限定范围,工作簿也不是一个坏主意:

With ThisWorkbook.Worksheets(1)

    If Application.WorksheetFunction.Sum(.Range("J:J").SpecialCells( _
            xlCellTypeVisible)) = Application.WorksheetFunction.Sum( _
            .Range("L:L").SpecialCells(xlCellTypeVisible)) Then

        Union(.Columns("J"), .Columns("L")).Delete Shift:=xlToLeft

    End If

End With

您将1中的Worksheets(1)替换为以下任意一项:

  • 正确的工作表索引号,或
  • 工作表的名称,并用双引号(例如.Worksheets("Sheet1")

答案 1 :(得分:0)

您可以使用EVALUATE和AGGREGATE来检查两列中的总和是否匹配:

Option Explicit
Public Sub test()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets("Sheet2")
    With ws      'Your sheet name goes here
        If .Evaluate("AGGREGATE(9,3,J:J)") = .Evaluate("AGGREGATE(9,3,L:L)") Then
            Union(.Columns("J"), .Columns("L")).Delete Shift:=xlToLeft
        End If
    End With
End Sub

传递给AGGREGATE的第一个参数是Function_num9SUM。第二个参数是Options3Ignore hidden rows, error values, nested SUBTOTAL and AGGREGATE functions。使用AGGREGATE的优点是您可以为总和条件指定不同的选项,例如忽略错误以及隐藏的行。


编辑:

如果在工作表中循环使用,请在With语句中使用循环中的工作表变量,以确保您的范围指定了父表。它将使您的代码不易出错。

Public Sub test()
    Dim ws As Worksheet
    For Each ws In ThisWorkbook.Worksheets
        With ws
            If .Evaluate("AGGREGATE(9,3,J:J)") = .Evaluate("AGGREGATE(9,3,L:L)") Then
                Union(.Columns("J"), .Columns("L")).Delete Shift:=xlToLeft
            End If
        End With
    Next
End Sub