Как уже упоминалось в комментариях, вы должны смотреть назад для удаления.Если вы выполните удаление от row#2
до последней строки, возможно, некоторые строки следует удалить, но они остались там.Возьмем для примера, предположим, что мы собираемся удалить row#3
и row#4
.Если мы сделаем это вперед, row#4
станет новым row#3
после удаления старого row#3
.И следующая строка, которую нужно проверить, это row#4
, то есть оригинал row#5
.Таким образом, данные в row#4
на самом деле находятся в row#3
сейчас, и они никогда не будут удалены.
Однако, когда ваши данные достаточно массивны, удаление займет так много ресурсов, что снижает скорость.,Было бы лучше найти все диапазоны для удаления и удалить их сразу в конце.Мы можем сделать это методом Union
.И это также может предотвратить проблему, упомянутую ранее, поэтому мы можем продвигаться вперед как другие циклы.
Наконец, вы можете избежать выбора диапазонов, поскольку это не так эффективно.Range().Delete
может просто удалить диапазон и без его выбора.
Код будет таким:
'pseudo code
Sub deletion()
For i = 2 To lastrow
If shouldBeDeleted Then
If deletingRng Is Nothing Then
Set deletingRng = Cells(i, X)
Else
Set deletingRng = Union(deletingRng, Cells(i, X)
End If
End If
Next i
deletingRng.Delete Shift:=xlUp
End Sub