Во-первых, некоторые хозяйственные помещения .....
- Добавить
Option Explicit
- Добавить
Option Explicit
- Квалифицировать все объекты (
Range
) с рабочим листом
Избегайте удаления строк во время зацикливания по нескольким причинам.Основная причина в том, что это может быть крайне неэффективно.Скажем, например, что у вас есть 500 ячеек, которые Like "2L*"
.Это означает, что у вас будет 500 итераций удаляемых строк.
Вместо добавьте каждый экземпляр Like "2L*"
в Union
(коллекцию) ячеек и, как только ваш цикл будет завершен, удалите весь Union
все сразу.Теперь у вас есть только один экземпляр удаляемых строк.
Еще одна причина избегать удаления строк внутри цикла состоит в том, что он заставляет вас выполнять цикл в обратном направлении.В этом нет ничего плохого, просто это заставляет людей испытывать трудности, так как поначалу это не интуитивно понятно.Когда вы удаляете строку, вы смещаете диапазон, который вы просматриваете, и строки пропускаются.Приведенный ниже метод не нужно зацикливать в обратном направлении.
Option Explicit
Sub Cleanup()
Dim ws As Worksheet: Set ws = ThisWorkbook.Sheets("???")
Dim i As Long, DeleteMe As Range
'Gather up union of CELLS like 2L*
For i = 1 To ws.Range("F" & ws.Rows.Count).End(xlUp).Row
If ws.Range("F" & i) Like "2L*" Then
If DeleteMe Is Nothing Then
Set DeleteMe = ws.Range("F" & i)
Else
Set DeleteMe = Union(DeleteMe, ws.Range("F" & i))
End If
End If
Next i
'Delete collection of cells here (if any exist)
If Not DeleteMe Is Nothing Then DeleteMe.EntireRow.Delete
End Sub
В учебных целях вы можете выполнить цикл в обратном направлении.В нем меньше строк, чем в предыдущем методе, но он менее эффективен.Если вы решили пойти по этому пути, обязательно выключите ScreenUpdating
, чтобы ускорить процесс
Sub CleanUp2()
Dim ws As Worksheet: Set ws = ThisWorkbook.Sheets("???")
Dim i As Long
For i = ws.Range("F" & ws.Rows.Count).End(xlUp).Row to 1 Step -1 '<===== Backwards!
If ws.Range("F" & i) Like "2L*" Then ws.Rows(i).Delete
Next i
End Sub