Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Оптимизация кода по удалению ячеек - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Оптимизация кода по удалению ячеек (Макросы/Sub)
Оптимизация кода по удалению ячеек
rever27 Дата: Четверг, 18.06.2015, 08:44 | Сообщение № 1
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 141
Репутация: 0 ±
Замечаний: 20% ±

Excel 2010
Вопрос к опытным знатокам по поводу ускорения работы моего кода. Суть - удаление значений в столбце Q по условию < 10
Т.к. новичок, то писал его долго и кропотливо, но все равно при количестве строк более 1000 процесс начинает занимать прилично времени.
Для меня было удивление, что вначале замена совпавших условий на текст, а потом удаление ячеек с текстовым названием занимает в разы меньше времени, чем обычное удаление.
Подскажите. что еще можно добавить, убрать, дописать для ускорения работы. Спасибо.
К сообщению приложен файл: 1342027.xlsm (14.8 Kb)
 
Ответить
СообщениеВопрос к опытным знатокам по поводу ускорения работы моего кода. Суть - удаление значений в столбце Q по условию < 10
Т.к. новичок, то писал его долго и кропотливо, но все равно при количестве строк более 1000 процесс начинает занимать прилично времени.
Для меня было удивление, что вначале замена совпавших условий на текст, а потом удаление ячеек с текстовым названием занимает в разы меньше времени, чем обычное удаление.
Подскажите. что еще можно добавить, убрать, дописать для ускорения работы. Спасибо.

Автор - rever27
Дата добавления - 18.06.2015 в 08:44
nilem Дата: Четверг, 18.06.2015, 09:02 | Сообщение № 2
Группа: Авторы
Ранг: Старожил
Сообщений: 1613
Репутация: 563 ±
Замечаний: 0% ±

Excel 2013, 2016
вот здесь взял
[vba]
Код
Sub example_02_1()
Application.ScreenUpdating = False
Rows(1).Insert
With Range("Q1", Cells(Rows.Count, "Q").End(xlUp))
     .Cells(1).Value = "temp"
     .AutoFilter Field:=1, Criteria1:="<=10"
     .Offset(1).EntireRow.Delete
     .AutoFilter
     .Parent.UsedRange
End With
Rows(1).Delete
Application.ScreenUpdating = True
End Sub
[/vba]


Яндекс.Деньги 4100159601573
 
Ответить
Сообщениевот здесь взял
[vba]
Код
Sub example_02_1()
Application.ScreenUpdating = False
Rows(1).Insert
With Range("Q1", Cells(Rows.Count, "Q").End(xlUp))
     .Cells(1).Value = "temp"
     .AutoFilter Field:=1, Criteria1:="<=10"
     .Offset(1).EntireRow.Delete
     .AutoFilter
     .Parent.UsedRange
End With
Rows(1).Delete
Application.ScreenUpdating = True
End Sub
[/vba]

Автор - nilem
Дата добавления - 18.06.2015 в 09:02
rever27 Дата: Суббота, 20.06.2015, 07:16 | Сообщение № 3
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 141
Репутация: 0 ±
Замечаний: 20% ±

Excel 2010
nilem, Спасибо за вариант решения. Только в моем случае он немного не работает.

Сколько не ломал голову, так и не понял, зачем вы добавляете строку, а затем удаляете.
Основная проблема в том, что меня не постоянный диапазон фильтруемых значений, а от текущей активной ячейки до последней заполненной.
Если в активном диапазоне есть значения для удаления, то все работает отлично, но если нет - он удаляет и нужные результаты.
Подскажите решение
К сообщению приложен файл: 13.xlsm (27.1 Kb)
 
Ответить
Сообщениеnilem, Спасибо за вариант решения. Только в моем случае он немного не работает.

Сколько не ломал голову, так и не понял, зачем вы добавляете строку, а затем удаляете.
Основная проблема в том, что меня не постоянный диапазон фильтруемых значений, а от текущей активной ячейки до последней заполненной.
Если в активном диапазоне есть значения для удаления, то все работает отлично, но если нет - он удаляет и нужные результаты.
Подскажите решение

Автор - rever27
Дата добавления - 20.06.2015 в 07:16
nilem Дата: Суббота, 20.06.2015, 08:02 | Сообщение № 4
Группа: Авторы
Ранг: Старожил
Сообщений: 1613
Репутация: 563 ±
Замечаний: 0% ±

Excel 2013, 2016
Попробуйте вот так:
[vba]
Код
Sub b_DeleteConditions_03()
Application.ScreenUpdating = False

'рабочий диапазон
CurrentStart = ActiveCell.Row
Rows(CurrentStart).Insert
MyColumn = 17    'ручной ввод

With Range(Cells(CurrentStart, MyColumn), Cells(Rows.Count, MyColumn).End(xlUp))
'    .Select
     .Cells(1).Value = "temp" 'временный заголовок для фильтруемого диапазона
     .AutoFilter Field:=1, Criteria1:="<=10"
     .EntireRow.Delete 'удаляем вместе с временным заголовком
End With

Application.ScreenUpdating = True
End Sub
[/vba]
раскомментируйте Select и пройдите в пошаговом режиме (по F8), чтобы было наглядно


Яндекс.Деньги 4100159601573
 
Ответить
СообщениеПопробуйте вот так:
[vba]
Код
Sub b_DeleteConditions_03()
Application.ScreenUpdating = False

'рабочий диапазон
CurrentStart = ActiveCell.Row
Rows(CurrentStart).Insert
MyColumn = 17    'ручной ввод

With Range(Cells(CurrentStart, MyColumn), Cells(Rows.Count, MyColumn).End(xlUp))
'    .Select
     .Cells(1).Value = "temp" 'временный заголовок для фильтруемого диапазона
     .AutoFilter Field:=1, Criteria1:="<=10"
     .EntireRow.Delete 'удаляем вместе с временным заголовком
End With

Application.ScreenUpdating = True
End Sub
[/vba]
раскомментируйте Select и пройдите в пошаговом режиме (по F8), чтобы было наглядно

Автор - nilem
Дата добавления - 20.06.2015 в 08:02
rever27 Дата: Суббота, 20.06.2015, 12:15 | Сообщение № 5
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 141
Репутация: 0 ±
Замечаний: 20% ±

Excel 2010
nilem, Про F8 не знал, спасибо )

Немного изменил код под выделение ячейки до первой пустой, а не последней на листе

[vba]
Код
Sub b_DeleteConditions_03()
Application.ScreenUpdating = False

CurrentStart = ActiveCell.Row
TheEnd = IIf(Cells(ActiveCell.Row, 17).Offset(1) = "", ActiveCell.Row, Cells(ActiveCell.Row, 17).End(xlDown).Row)
Rows(CurrentStart).Insert

MyColumn = 17

With Range(Cells(CurrentStart, MyColumn), Cells(TheEnd + 1, MyColumn))
     .Select
     .Cells(1).Value = "temp"
     .AutoFilter Field:=1, Criteria1:="<=10"
     .EntireRow.Delete
End With

Application.ScreenUpdating = True
End Sub
[/vba]
 
Ответить
Сообщениеnilem, Про F8 не знал, спасибо )

Немного изменил код под выделение ячейки до первой пустой, а не последней на листе

[vba]
Код
Sub b_DeleteConditions_03()
Application.ScreenUpdating = False

CurrentStart = ActiveCell.Row
TheEnd = IIf(Cells(ActiveCell.Row, 17).Offset(1) = "", ActiveCell.Row, Cells(ActiveCell.Row, 17).End(xlDown).Row)
Rows(CurrentStart).Insert

MyColumn = 17

With Range(Cells(CurrentStart, MyColumn), Cells(TheEnd + 1, MyColumn))
     .Select
     .Cells(1).Value = "temp"
     .AutoFilter Field:=1, Criteria1:="<=10"
     .EntireRow.Delete
End With

Application.ScreenUpdating = True
End Sub
[/vba]

Автор - rever27
Дата добавления - 20.06.2015 в 12:15
rever27 Дата: Среда, 24.06.2015, 07:22 | Сообщение № 6
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 141
Репутация: 0 ±
Замечаний: 20% ±

Excel 2010
nilem, Вчера мучился вопросом, почему же все равно процесс удаления идет так долго, когда строк более 1500, и обнаружил, что если вначале отсортировать строки по возрастанию, а только потом удалять их из фильтра, то скорость обработки изменится с 5-6 секунд до 1 секунды.
Подумал, возможно вам будет интересно
 
Ответить
Сообщениеnilem, Вчера мучился вопросом, почему же все равно процесс удаления идет так долго, когда строк более 1500, и обнаружил, что если вначале отсортировать строки по возрастанию, а только потом удалять их из фильтра, то скорость обработки изменится с 5-6 секунд до 1 секунды.
Подумал, возможно вам будет интересно

Автор - rever27
Дата добавления - 24.06.2015 в 07:22
nilem Дата: Среда, 24.06.2015, 07:48 | Сообщение № 7
Группа: Авторы
Ранг: Старожил
Сообщений: 1613
Репутация: 563 ±
Замечаний: 0% ±

Excel 2013, 2016
Интересно. А можете показать файл-пример, в котором код работает 5-6 сек?


Яндекс.Деньги 4100159601573
 
Ответить
СообщениеИнтересно. А можете показать файл-пример, в котором код работает 5-6 сек?

Автор - nilem
Дата добавления - 24.06.2015 в 07:48
rever27 Дата: Среда, 24.06.2015, 09:37 | Сообщение № 8
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 141
Репутация: 0 ±
Замечаний: 20% ±

Excel 2010
nilem, Я честно старался, 40 минут преобразовывал мой код для Вас, но ничего не вышло. Весь кидать смысла нет, а разбивать частями - понял что пол дня уйдет, ибо код включает 4 других в себя по проверкам на текущую позицию, значения ячеек и т.п. Возможно скорость падает из-за того, что постоянно перескакивает по макросам.
Скажу только, что через timer без сортировки на 5000 строк удаления вышла 36,91 секунда, с сортировкой - 1,2304
 
Ответить
Сообщениеnilem, Я честно старался, 40 минут преобразовывал мой код для Вас, но ничего не вышло. Весь кидать смысла нет, а разбивать частями - понял что пол дня уйдет, ибо код включает 4 других в себя по проверкам на текущую позицию, значения ячеек и т.п. Возможно скорость падает из-за того, что постоянно перескакивает по макросам.
Скажу только, что через timer без сортировки на 5000 строк удаления вышла 36,91 секунда, с сортировкой - 1,2304

Автор - rever27
Дата добавления - 24.06.2015 в 09:37
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Оптимизация кода по удалению ячеек (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!