|
Быстродействие в Excel VBA
|
|||
---|---|---|---|
#18+
В макросе эксель нужно удалить 100 строк из листа. Странным образом это влияет на время выполнения. При первом запуске макроса на удаление 100 строк уходит 140 сек. При втором - 1 000 сек. При 3-м - уже 2 000 сек. Если закрыть и снова открыть файл, все повторяется с точностью +/- 2 сек. С этим как-то можно бороться? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2017, 17:35 |
|
Быстродействие в Excel VBA
|
|||
---|---|---|---|
#18+
А код удаления мы сможем увидеть? А то кофейная гуща кончилась. Да и l-evgeneна удаление 100 строк уходит 140 сектут либо файл огромный с большим количеством формул, либо алгоритм... впрочем, мне сложно придумать алгоритм, который будет столько времени удалять, так что опишите еще и файл. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2017, 17:58 |
|
Быстродействие в Excel VBA
|
|||
---|---|---|---|
#18+
l-evgene, Рискну предположить, что есть событие при обновлении листа, которое приводит к многочисленными пересчетам/обновлению данных. Для начала можно попробовать: Код: vbnet 1. 2. 3.
Но посмотреть на файл было бы куда лучше. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2017, 18:17 |
|
Быстродействие в Excel VBA
|
|||
---|---|---|---|
#18+
l-evgene, Sub test() Application.ScreenUpdating = False Application.DisplayStatusBar = False Application.Calculation = xlCalculationManual Application.EnableEvents = False Добавить таблицу (Ctrl+T) Таблицу отсортировать по нужному столбцу Отфильтровать ненужные строки по условию и удалить Application.ScreenUpdating = True Application.DisplayStatusBar = True Application.Calculation = xlCalculationAutomatic Application.EnableEvents = True End Sub Как-то так ... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2017, 01:25 |
|
Быстродействие в Excel VBA
|
|||
---|---|---|---|
#18+
Shocker.Pro, Код удаления: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30.
Суть в следующем: в ходе предыдущих операций таблица сначала полностью очищается, потом заполняется (это список комплектующих) - 130-150 строк. Затем одинаковые позиции объединяются: в одной из строк суммируется общее количество в штуках и рублях, в остальных - штуки обнуляются. На все это уходит несколько секунд (не более 30). Наконец, идет удаление строк с нулевым количеством. Вот здесь и происходит вышеописанный косяк. В коде это вот этот кусок Код: vbnet 1. 2. 3. 4. 5.
В приложении - обрабатываемый лист (это уже после мучительных удалений) ... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2017, 12:35 |
|
Быстродействие в Excel VBA
|
|||
---|---|---|---|
#18+
l-evgeneЗатем одинаковые позиции объединяются: в одной из строк суммируется общее количество в штуках и рублях, в остальных - штуки обнуляются. На все это уходит несколько секунд (не более 30).тут бы, конечно, SQL-запрос к листу на пару порядков быстрее сработал. Для начала попробуйте перед всем макросом Код: vbnet 1.
а после Код: vbnet 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2017, 12:51 |
|
Быстродействие в Excel VBA
|
|||
---|---|---|---|
#18+
Shocker.Proтут бы, конечно, SQL-запрос к листу на пару порядков быстрее сработал.Можно попробовать уменьшить количество обращений к листу типа Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
даже это должно сильно ускорить пересчет ... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2017, 12:58 |
|
Быстродействие в Excel VBA
|
|||
---|---|---|---|
#18+
Еще вопрос, насколько адекватно работает функция LastRowInCol, которая постоянно вызывается в цикле ... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2017, 12:59 |
|
Быстродействие в Excel VBA
|
|||
---|---|---|---|
#18+
l-evgene, Попробуйте так с проблемным моментом: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28.
Да и в принципе можно всю функцию обернуть в ExcelReflection. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2017, 13:34 |
|
Быстродействие в Excel VBA
|
|||
---|---|---|---|
#18+
l-evgene, Вы ерундой занимаетесь, обращаетесь в каждом цикле к ячейкам листа, а потом удаляете строки по одной. И Application.ScreenUpdating здесь не поможет Лучше заносите всю вашу таблицу в переменную-массив и обрабатывайте. Через массив оставляете только нужные строки (сами придумаете как). Потом возвращаете значения из массива на рабочий лист. 30 секунд на 150 строк - это цензурно выражаясь, очень много. На такую задачу должно уходить 0,0...30 миллисекунд максимум. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2017, 20:11 |
|
Быстродействие в Excel VBA
|
|||
---|---|---|---|
#18+
Да уж точно... У вас там тормоза не только из-за процедуры удаления, но и из-за придуманной вами процедуры для расчета суммы по уникам (да ещё и с обработкой прямо на листе!). LastRowInCol(), опять же, вызываемая после To в For - это на каждой итерации одно и то же число рассчитывается. Опять же, как правильно замечено, если ячейки, которые обрабатываются/удаляются, зависимы - то влияет автопересчет и прочее. Как правильно заметил Shoker.Pro, почему бы не воспользоваться средством, предназначенным для такой задачи? Сводную не пробовали сделать по вашей таблице? Тем более, что она вам и итоги сама посчитает, и оформит красиво ещё... да и удалять исходные данные - как-то не принято. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.06.2017, 06:17 |
|
Быстродействие в Excel VBA
|
|||
---|---|---|---|
#18+
Совсем замордовали ТС. Он жаловался на одно, а ему еще и другое втюхивают. Надо бы сначала помочь ему с тем, что он конкретно просил, а потом уж можно и оптимизировать. А так его похоже напугали не мало. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.06.2017, 08:54 |
|
Быстродействие в Excel VBA
|
|||
---|---|---|---|
#18+
Спасибо за участие. Скрипт не мой, поэтому не хотелось вносить серьезных изменений, чтобы чего-нибудь не сломать (а там около 30 процедур). Решил просто:отсортировал таблицу и удалил лишние строки одним делитом. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.06.2017, 12:04 |
|
Быстродействие в Excel VBA
|
|||
---|---|---|---|
#18+
Сама доброта, добрее надо быть, еще добрее ... |
|||
:
Нравится:
Не нравится:
|
|||
11.06.2017, 15:45 |
|
|
start [/forum/topic.php?fid=61&tid=2172655]: |
0ms |
get settings: |
11ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
44ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
70ms |
get tp. blocked users: |
2ms |
others: | 293ms |
total: | 453ms |
0 / 0 |