Используйте переменную, определенную как Range
и Union
для каждой строки.
В приведенном ниже примере MyArray
- это массив номеров строк, которые следует удалить.
Public Sub Test()
Dim MyArray() As Variant
MyArray = Array(2, 4, 5, 8, 10, 15)
DeleteRows MyArray
End Sub
Public Sub DeleteRows(RowNumbers As Variant, Optional SheetName As String = "")
Dim wrkSht As Worksheet
Dim rRange As Range
Dim x As Long
On Error GoTo ERROR_HANDLER
If SheetName = "" Then
Set wrkSht = ActiveSheet
Else
Set wrkSht = ThisWorkbook.Worksheets(SheetName)
End If
For x = LBound(RowNumbers) To UBound(RowNumbers)
If rRange Is Nothing Then
Set rRange = wrkSht.Rows(RowNumbers(x))
Else
Set rRange = Union(rRange, wrkSht.Rows(RowNumbers(x)))
End If
Next x
If Not rRange Is Nothing Then rRange.Delete
On Error GoTo 0
Exit Sub
ERROR_HANDLER:
Select Case Err.Number
Case Else
MsgBox "Error " & Err.Number & vbCr & _
" (" & Err.Description & ") in procedure DeleteColumns."
Err.Clear
Application.EnableEvents = True
End Select
End Sub
Редактировать
Процедуру Test
можно заменить любым кодом, который создает массив номеров строк.Затем массив передается в процедуру DeleteRows
.Вы также можете передать ему имя листа для удаления строк из: DeleteRows MyArray, "Sheet2"
.
Процедура DeleteRows
устанавливает переменные, включает проверку ошибок и затем проверяет, было ли ей передано имя листа.Затем он устанавливает ссылку либо на активный лист, либо на именованный лист.Вы также можете проверить, существует ли переданный лист здесь.
Далее цикл начинается с первого до последнего элемента массива.Первый обычно равен 0, поэтому вы можете заменить LBOUND(RowNumbers)
на 0
.
rRange
- это переменная, которая будет содержать ссылки на строки для удаления, и Union
не будет работать, если она еще не содержит ссылку на диапазон.
При первом проходе циклаон не будет содержать ссылку, поэтому будет ничем, и первая строка в массиве будет установлена как ссылка на первую строку на листе, хранящемся в wrkSht
.
При последующих проходах rRange
уже будет содержать ссылку, так чтоследующая строка будет объединена с ним.
Эти два решения принимаются в блоке IF...END IF
, отделенном оператором ELSE
.
После завершения цикла в одной строке оператор IF
- в одной строке не требуется END IF
- проверяет, содержит ли rRange
какие-либо ссылки.Если это так, то эти строки будут удалены.
Процедура выходит из основной части кода, обрабатывает ошибки и затем завершается.