|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
12.04.2009, 10:41 | #1 |
Пользователь
Регистрация: 24.11.2007
Сообщений: 12
|
Падение быстродействия в макросе
При открытии книги время выполнения макроса: 1797
Все последующие запуски: 4890 4859 4860 4953 Объясните пожалуйста где грабли? Прошу сильно не пинать - с VBA на Вы. Заранее спасибо. |
12.04.2009, 11:11 | #2 |
Программист VBA
СуперМодератор
Регистрация: 13.07.2008
Сообщений: 6,858
|
Проблема в строках
Код:
Возможно, какое-то условие не срабатывает, и макрос перебирает намного больше строк, чем надо. Ну и вот это из макроса надо убрать: Код:
В общем, много всяких нюансов. Но главное - надо сначала считывать весь диапазон ячеек с листа в массив, и потом уже обрабатывать значения массива. Как раз вчера переделывал аналогичный макрос (который я писал год назад, когда только начинал знакомство с VBA). Применив вышеописанный способ, увеличил быстродействие кода в 9 раз. Прикрепите к сообщению файл с данными, иначе оптимизировать макрос будет крайне сложно. PS: Вместо API-функции GetTickCount можно использовать встроенную в VBA функцию Timer (например, t=Timer) |
12.04.2009, 11:15 | #3 |
Пользователь
Регистрация: 24.11.2007
Сообщений: 12
|
Но при первом запуске все ок
|
12.04.2009, 11:18 | #4 |
Программист VBA
СуперМодератор
Регистрация: 13.07.2008
Сообщений: 6,858
|
Вы называете удовлетворительным время работы макроса в 2 секунды?
В таком случае можно подождать и 5 сек... Вообще, этот макрос после оптимизации может выполнить всю работу максимум за 0,5 сек. А какой лист активен при открытии книги, и какой лист - при последующих запусках макроса?
__Полезные надстройки для Excel. Парсинг сайтов и файлов.
Макросы любой сложности на заказ. Мониторинг цен конкурентов Последний раз редактировалось EducatedFool; 12.04.2009 в 11:21. |
12.04.2009, 11:38 | #5 |
Пользователь
Регистрация: 24.11.2007
Сообщений: 12
|
Лист активен всегда один "Отчеты"
А 2 секунды это дома, а на работе 20-25 И ещё интересная штука - убрал из таблицы все данные не относящиеся к работе макроса и время работы макроса сократилось, но все равно первый запуск работает быстрее последующих. |
12.04.2009, 11:50 | #6 |
Программист VBA
СуперМодератор
Регистрация: 13.07.2008
Сообщений: 6,858
|
Сейчас попробую оптимизировать.
На сначала придётся разобраться, что этот макрос делает (на что уйдёт много времени) Если есть Skype - звоните (это позволит сэкономить кучу времени) Проблема очевидна - вы поочерёдно перебирали 33 тысячи ячеек. Конечно, макрос будет тормозить. Есть 3 варианта решения: 1) Задействовать встроенный автофильтр для фильтрации по дате, и обрабатывать только отфильтрованные строки 2) Считать весь диапазон ячеек в массив, и обрабатывать данные из массива. 3) Для формирования отчёта использовать сводные таблицы (в них я не разбираюсь, но по идее это позволило бы обойтись совсем без макросов)
__Полезные надстройки для Excel. Парсинг сайтов и файлов.
Макросы любой сложности на заказ. Мониторинг цен конкурентов Последний раз редактировалось EducatedFool; 12.04.2009 в 12:09. |
12.04.2009, 12:25 | #7 |
Пользователь
Регистрация: 24.11.2007
Сообщений: 12
|
Где бы литературу посмотреть по работе с массивами
А строк будет порядка 55тыс |
12.04.2009, 14:31 | #8 |
Программист VBA
СуперМодератор
Регистрация: 13.07.2008
Сообщений: 6,858
|
Вариант с автофильтром показал очень низкую производительность...
(см. вложение) Проще всего обойтись совсем без макросов. Сформируйте на новом листе сводную таблицу, которая будет брать данные непосредственно с листа СтрахованиеТранспорта А начальную и конечную дату будете выбирать в самой сводной таблице. Вариант с автофильтром показал очень низкую производительность... (см. вложение) Во вложении макрос формирует список на листе Салоны (этот лист скрыт), но не обрабатывает его - на основании этого списка уже построена сводная таблица, которую достаточно просто обновить: Код:
Попробуйте этот вариант на досуге: Код:
|
12.04.2009, 14:49 | #9 |
Пользователь
Регистрация: 24.11.2007
Сообщений: 12
|
Спасибо большое за оперативность и примеры.
Завтра буду пробовать на "живых данных". |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Speed drop падение скорости | Ivn | Софт | 1 | 12.02.2009 07:17 |
Функции в макросе. | Rom1k06 | Microsoft Office Excel | 7 | 19.10.2008 11:22 |
Ошибка и падение (выход) Excel при выполнении сложной программы на VBA | Serge_Bliznykov | Microsoft Office Excel | 6 | 13.08.2008 16:50 |
Суммирование элементов массива в макросе | IgorKr | Общие вопросы C/C++ | 1 | 14.04.2008 01:22 |
Константы в Макросе | valerij | Microsoft Office Excel | 2 | 03.02.2008 23:33 |