Удаление двух столбцов одновременно - PullRequest
0 голосов
/ 23 ноября 2018

Следующий код удаляет только столбец 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 одновременно.Как я могу это сделать?

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018

Вы можете использовать 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
0 голосов
/ 23 ноября 2018

Вы можете легко изменить свой текущий код, используя 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"))
...