For i = 2 To b
If Cells(i, 1) = "XXX" Then
Rows(i).Delete Shift:=xlUp
b = b - 1
i = i - 1
End If
Next i
Grom писал(а):For i = 2 To b
Dim i As Integer
For i = b to 2 Step -1
...
Next i
Grom писал(а):
- Код: Выделить всё
For i = 2 To b
If Cells(i, 1) = "XXX" Then
Rows(i).Delete Shift:=xlUp
b = b - 1
i = i - 1
End If
Next i
Rows(i).Delete Shift:=xlUp
Grom писал(а):в курсе. но это и не надо - т.к. количество итераций равно количеству строк.
Dim i As Integer
For i = b to 2 Step -1
If Cells(i, 1) = "XXX" Then
Rows(i).Delete Shift:=xlUp
End If
Next i
Прикольно, но я видимо немного туповат (а может и много) но я так и не понял, что она может дать в плане прироста производительности. Какая разница, будет ли цикл идти вперед или обратно? Qwertiy можешь разжевать, что и как?Qwertiy писал(а):For i = b to 2 Step -1
ger_kar писал(а):Какая разница, будет ли цикл идти вперед или обратно?
ger_kar писал(а):и при этом не важно, какая часть заполнена данными
ger_kar писал(а):Т.е. при совпадении данных ячейки не удалять строку сразу, а динамически собирать строку с диапазонами удаления для Range добавляя в диапазон, только что совпавшую строку, а потом геть! и удалять сразу блок таких строк и опять все по новой.
Нет речь не о ячейках, а о диапазоне. Я конечно не знаю, как там внутри все устроено, но при таких операциях как удаление строки как таковой, а не только данных которые в ней содержались, видимо идет перестроение общего диапазона. Дело в том, что если удалять пустые строки, например за пределами области данных, то на эту операцию также расходуется довольно много времени, поэтому я и сделал такое предположение. Конечно вряд-ли Excel хранит данные о все пустых ячейках (это было - бы действительно очень глупо), но а диапазонах информация наверняка содержится и видимо именно она и перестраивается.Qwertiy писал(а):Вообще, сомнительно, чтобы это действительно было так, т. к. количество ячеек очень большое, поэтому хранить информацию о каждой пустой ячейке отдельно потребовало бы слишком много памяти и времени на обработку.
Добавилось и количество строк и количество столбцов.Qwertiy писал(а):Кстати, мне казалось, что, по сравнению с 2003-им, изменилось только количество столбцов, а количество строк осталось. Или нет?
Конечно можно и не только строки или столбцы, а любые диапазоны не смежных ячеекQwertiy писал(а):можно ли удалить строки таким образом.
ger_kar писал(а):Например: Range("1:1,3:3,6:6,10:10,15:15").Delete Shift:=xlUp удалит 1, 3, 6, 10, 15 строки.
Я сам не тестировал, но я думаю это сделает Grom и сообщит нам. Я думаю, что для него, при всем богатстве выбора, другой альтернативы пока нет .Qwertiy писал(а):А как оно в плане эффективности?
Dim i As Integer
Dim NewRange as range
For i = 2 To b
If Cells(i, 1) = "XXX" Then
if NewRange is nothing then
Set NewRange =Rows(i)
else
Set NewRange =Union(NewRange, Rows(i))
end if
End If
Next i
if not NewRange is nothing then
NewRange.Delete
end if
Set NewRange = nothing
Сейчас этот форум просматривают: Google-бот, Yandex-бот и гости: 1