|
Оптимизация работы алгоритма обработки диапазона ячеек Excel
|
|||
---|---|---|---|
#18+
Всем привет! Для документа xls (97-2003) написал код макроса, который для каждого листа документа обрабатывает строки по следующим условиям: - если в столбцах A, B, C текущей строки ячейки пустые, то убираем верхнюю границу в ячейках этих столбцов у этой строки; - если в столбце D текущей строки ячейка заполнена словом "Всего", то делаем шрифт этой ячейки полужирным у этой строки. Алгоритм следующий: Код: 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. 31. 32. 33. 34. 35. 36.
Сильно не пинайте, только начал осваивать VBA. Вопрос вот в чём: можно ли как-то оптимизировать (ускорить выполнение) данный код? В xls документе бывает очень много строк (65000 и больше), да ещё и не на одном листе. Может как-то можно выделять весь диапазон строк для столбцов A, B, C, D и по условиям вносить изменения в нужных ячейках диапазона, а не перебирать строки диапазона по-порядку? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.10.2016, 14:49 |
|
Оптимизация работы алгоритма обработки диапазона ячеек Excel
|
|||
---|---|---|---|
#18+
для начала попробуйте application.ScreenUpdating=False перед началом обработки и application.ScreenUpdating=True по окончании. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.10.2016, 16:17 |
|
Оптимизация работы алгоритма обработки диапазона ячеек Excel
|
|||
---|---|---|---|
#18+
chikaginsk, Перебор всегда будет долгим. Можно попробовать использовать встроенный механизм Find. Попробуйте записать макрос в своем экселе и посмотреть что он делает. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.10.2016, 17:57 |
|
Оптимизация работы алгоритма обработки диапазона ячеек Excel
|
|||
---|---|---|---|
#18+
chikaginsk, попробуйте кусок "границы ячеек" в таком виде: Код: vbnet 1. 2. 3. 4. 5. 6.
... |
|||
:
Нравится:
Не нравится:
|
|||
13.10.2016, 18:10 |
|
Оптимизация работы алгоритма обработки диапазона ячеек Excel
|
|||
---|---|---|---|
#18+
А еще лучше получить массив значений True/False, вычислив в коде формулу листа типа =A1:A19&B1:B19&C1:C19="" (здесь lLastRow=19). И значения ст. D тоже загрузить в массив. Код: 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. 31. 32.
Вообще, метод Evaluate учитывает текущий стиль ссылок приложения (А1 или R1C1). Поэтому формулу лучше привести к текущему стилю ссылок, "обернув" ее в метод ConvertFormula: Код: vbnet 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
13.10.2016, 18:49 |
|
Оптимизация работы алгоритма обработки диапазона ячеек Excel
|
|||
---|---|---|---|
#18+
Код: vbnet 1. 2. 3.
Вместо этого получить Range из строк, обойти его через For Each row In и обращаться к ячейке как row.Cells(1) Так можно сэкономить еще пару копеек ... |
|||
:
Нравится:
Не нравится:
|
|||
14.10.2016, 02:05 |
|
|
start [/forum/topic.php?fid=60&fpage=19&tid=2155412]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
39ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
50ms |
get tp. blocked users: |
2ms |
others: | 10ms |
total: | 148ms |
0 / 0 |