Здравствуйте! Поднимал этот вопрос на другом форуме, но окончательного решения видимо не будет, рискну попробовать здесь:)
Вот этот пример с фильтром работает очень медленно в таблицах с большим числом строк, есть ли достойное альтернативное решение либо доработка существующего?:
Нужно удалять строки макросом по нескольким условиям без изменения структуры листа, в котором содержится таблица с большим количеством строк. В данном случае условием является "0" в шестом столбце и заданный цвет в том же столбце на всем листе, начиная с 22 строки. Подробнее и с примером во вложении.
[vba]
Код
Sub macros()
Rows("22:22").Select Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove Range(Range("a21:F21"), ActiveCell.SpecialCells(xlLastCell)).AutoFilter Selection.AutoFilter field:=6, Criteria1:="=0,00" Range(Range("a21:F21"), ActiveCell.SpecialCells(xlLastCell)).SpecialCells(xlCellTypeVisible).EntireRow.Delete Application.ScreenUpdating = True End Sub
[/vba]
Спасибо заранее.
Здравствуйте! Поднимал этот вопрос на другом форуме, но окончательного решения видимо не будет, рискну попробовать здесь:)
Вот этот пример с фильтром работает очень медленно в таблицах с большим числом строк, есть ли достойное альтернативное решение либо доработка существующего?:
Нужно удалять строки макросом по нескольким условиям без изменения структуры листа, в котором содержится таблица с большим количеством строк. В данном случае условием является "0" в шестом столбце и заданный цвет в том же столбце на всем листе, начиная с 22 строки. Подробнее и с примером во вложении.
[vba]
Код
Sub macros()
Rows("22:22").Select Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove Range(Range("a21:F21"), ActiveCell.SpecialCells(xlLastCell)).AutoFilter Selection.AutoFilter field:=6, Criteria1:="=0,00" Range(Range("a21:F21"), ActiveCell.SpecialCells(xlLastCell)).SpecialCells(xlCellTypeVisible).EntireRow.Delete Application.ScreenUpdating = True End Sub
Удалить строку, если в ячейке 6-го столбца (F) значение 0 (Ноль) А с цветом непонятно. Задан цвет серый, в таблице его не видно. Удалять нули серые или что угодно серого цвета???
Удалить строку, если в ячейке 6-го столбца (F) значение 0 (Ноль) А с цветом непонятно. Задан цвет серый, в таблице его не видно. Удалять нули серые или что угодно серого цвета???AlexM
Номер мобильного модема (без голосовой связи) 9269171249 МегаФон, Московский регион.
Сообщение отредактировал AlexM - Четверг, 21.02.2013, 20:46
To AlexM: Удалять что угодно серого цвета, в таблице это всякие строки маленькой высоты с надписями подраздел и просто пустые. Они удаляются при запуске второго макроса.
To AlexM: Удалять что угодно серого цвета, в таблице это всякие строки маленькой высоты с надписями подраздел и просто пустые. Они удаляются при запуске второго макроса.Гость
Ваши макросы не не ботают в Excel2003 Первый не разбирался почему, а второй - в Excel2003 в автофильтре нет отбора по цвету ячейки.
Код, который работает, сравнить скорости я не смогу. [vba]
Код
Sub Macros3() Application.ScreenUpdating = False Dim i As Long, strS As String For i = 24 To Range("F" & Rows.Count).End(xlUp).Row If (Range("F" & i).Value <> "" And Range("F" & i).Value = 0) Or Range("F" & i).Interior.ColorIndex = 48 Then strS = strS & "," & i & ":" & i End If Next: Range(Mid(strS, 2)).EntireRow.Delete Application.ScreenUpdating = True End Sub
[/vba]
Ваши макросы не не ботают в Excel2003 Первый не разбирался почему, а второй - в Excel2003 в автофильтре нет отбора по цвету ячейки.
Код, который работает, сравнить скорости я не смогу. [vba]
Код
Sub Macros3() Application.ScreenUpdating = False Dim i As Long, strS As String For i = 24 To Range("F" & Rows.Count).End(xlUp).Row If (Range("F" & i).Value <> "" And Range("F" & i).Value = 0) Or Range("F" & i).Interior.ColorIndex = 48 Then strS = strS & "," & i & ":" & i End If Next: Range(Mid(strS, 2)).EntireRow.Delete Application.ScreenUpdating = True End Sub
Вставляю в мой файл с длинной таблицей, выдает: Run-time error '1004' Method 'Range' of objekt '_Global' failed ((( Выделяет в макросе строчку: Next: Range(Mid(strS, 2)).EntireRow.Delete
А так вроде уже почти получилось)
Вставляю в мой файл с длинной таблицей, выдает: Run-time error '1004' Method 'Range' of objekt '_Global' failed ((( Выделяет в макросе строчку: Next: Range(Mid(strS, 2)).EntireRow.Delete
AlexM, у такого метода есть ограничения. и очень сильные.
точнее - строка ограничена 255 символами. для тестирования: [vba]
Код
Sub t() Dim s$, t$, r As Range, i& For i = 1 To 100 Step 2 s = s & "," & i & ":" & i Set r = Range(Mid(s, 2)) Debug.Print i, r.Areas.Count, Len(s) Next End Sub
[/vba]
AlexM, у такого метода есть ограничения. и очень сильные.
точнее - строка ограничена 255 символами. для тестирования: [vba]
Код
Sub t() Dim s$, t$, r As Range, i& For i = 1 To 100 Step 2 s = s & "," & i & ":" & i Set r = Range(Mid(s, 2)) Debug.Print i, r.Areas.Count, Len(s) Next End Sub
Угу, теперь цикл доходит до конца, правда сортирует только по 0, а цвета игнорирует. Ну с этим я смогу справиться, например спрячу везде нули, а вот проблема в том, что макрос выполняется более 2х минут у меня, а на слабеньких компах будет еще медленнее.. Т.е. это и является сутью моей проблемы: не получается добиться того, чтобы в очень больших таблицах удалялись строки по условию также быстро, как и в маленьких..
Угу, теперь цикл доходит до конца, правда сортирует только по 0, а цвета игнорирует. Ну с этим я смогу справиться, например спрячу везде нули, а вот проблема в том, что макрос выполняется более 2х минут у меня, а на слабеньких компах будет еще медленнее.. Т.е. это и является сутью моей проблемы: не получается добиться того, чтобы в очень больших таблицах удалялись строки по условию также быстро, как и в маленьких..Voh
Если бы не нужно было анализировать цвет - можно на любую таблицу сделать удаление очень бымтро. Ну а если нужен анализ цвета - тогда делайте используя фильтр по цвету под 2007. На каком Экселе вообще будет выполняться работа?
Если бы не нужно было анализировать цвет - можно на любую таблицу сделать удаление очень бымтро. Ну а если нужен анализ цвета - тогда делайте используя фильтр по цвету под 2007. На каком Экселе вообще будет выполняться работа?Hugo
Sub Macros4() ''обычно удаление идет с хвоста Dim tm! tm = Timer Application.ScreenUpdating = False Dim i As Long, strS As String Dim i2 i = Range("F" & Rows.Count).End(xlUp).Row Debug.Print i Do While i > 24 If Cells(i, 6) = 0 Or Cells(i, 6).Interior.ColorIndex = 48 Then Rows(i).Delete End If i = i - 1 Loop Application.ScreenUpdating = True Debug.Print "Строки удалены за " & Timer - tm & " сек" End Sub
[/vba]
[vba]
Код
Sub Macros4() ''обычно удаление идет с хвоста Dim tm! tm = Timer Application.ScreenUpdating = False Dim i As Long, strS As String Dim i2 i = Range("F" & Rows.Count).End(xlUp).Row Debug.Print i Do While i > 24 If Cells(i, 6) = 0 Or Cells(i, 6).Interior.ColorIndex = 48 Then Rows(i).Delete End If i = i - 1 Loop Application.ScreenUpdating = True Debug.Print "Строки удалены за " & Timer - tm & " сек" End Sub