以下代码仅删除列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
但是,我想同时删除两个列J
和L
。我该怎么办?
答案 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_num
。 9
是SUM
。第二个参数是Options
。 3
是Ignore 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