Часто требуется, чтобы вы прошли через ряд ячеек и по некоторым критериям удалили всю строку.
На практике лучше всего начинать с конца диапазона и продолжать работу.
Dim i as Long
For i = lastRow to 1 Step -1
If Cells(i, 2).Value = "del" then Rows(i).EntireRow.Delete
End if
Однако большую часть времени я работаю с Range
объектом.
Есть ли способ работать в обратном направлении с объектом диапазона, который не требует использования цикла типа For i
?
Dim rng as Range, cel as Range
Set rng = Range("A1:A100")
For each cel in rng step -1
if cel.value = "del" then cel.EntireRow.Delete
next cel
Это ошибки Expected: End of Statement
в части Step -1
, что я и ожидал (без каламбура).
Идея состоит в том, что мне не нужно перестраивать свои данные в Cells()
при попытке вернуться назад к переменной Range
. Я нахожу немного унылым использовать переменные диапазона кучу, но когда нужно удалить строки из этого диапазона, нужно переключиться на использование Cells([long],[long])
, если это имеет смысл.
Редактировать: Просто придумал это, но он все еще чувствует себя глупо:
Dim k As Long, cel as Range
Set cel = rng.cells(rng.cells.count)
For k = cel.Row To rng.Cells(1).Row Step -1
If rng.Cells(k).Value = "del" Then rng.Cells(k).EntireRow.Delete
Next k