|
Перебор строк (13к+), while, медленно
|
|||
---|---|---|---|
#18+
Добрый день! Существует тяжелый файл, в который зашит макрос: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
Модератор: Учимся использовать тэги оформления кода - FAQ Выполняется крайне долго. Возможно есть способ обрабатывать данные быстрее. Спасибо заранее. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.04.2014, 15:28 |
|
Перебор строк (13к+), while, медленно
|
|||
---|---|---|---|
#18+
конечно возможно. каждое обращение к Cells(x,y) заставляет просматривать всю коллекцию ячеек в поисках нужного индекса. необходимо сужать области поиска. 1) определить задействованный диапазон (Dim rngOuter As Range) 2) заменить первый while на for each: Код: vbnet 1. 2.
3) Далее обращаться к ячейкам конкретной строки: Код: vbnet 1.
4) заменить внутренний while по аналогии с внешним, определяя внутренний диапазон от i+1 до конца внешнего 5) в пределах внутреннего цикла не путать строки диапазонов 6) заменить многократные одинаковые вызовы Cells() единственным вызовом с присвоением значения строго типизированной переменной, далее использовать переменные: Код: vbnet 1. 2. 3. 4. 5. 6.
вангую ускорение на порядки ... |
|||
:
Нравится:
Не нравится:
|
|||
01.04.2014, 15:55 |
|
Перебор строк (13к+), while, медленно
|
|||
---|---|---|---|
#18+
только i3 и j3 похоже должны быть не строками, а числами ... |
|||
:
Нравится:
Не нравится:
|
|||
01.04.2014, 15:58 |
|
Перебор строк (13к+), while, медленно
|
|||
---|---|---|---|
#18+
Antonariyкаждое обращение к Cells(x,y) заставляет просматривать всю коллекцию ячеек в поисках нужного индекса.не совсем так. происходит неявный обход коллекции до нужного индекса. то есть чем больше значения x и y, тем медленнее выполняется Cells(x,y) ... |
|||
:
Нравится:
Не нравится:
|
|||
01.04.2014, 16:01 |
|
Перебор строк (13к+), while, медленно
|
|||
---|---|---|---|
#18+
Antonariy, Спасибо заранее! Объясните поподробнее про в данном контексте, какой тип переменной у rOuter, не приходилось работать с массивами. Dim rOuter As Row For Each rOuter In rngOuter.Rows Прошу разжевать если не трудно. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.04.2014, 17:18 |
|
Перебор строк (13к+), while, медленно
|
|||
---|---|---|---|
#18+
Надо загрузить диапазон для обработки в массив и все действия выполнять с элементами массива, потом выгрузить обратно в диапазон. Так можно ускорить не менее чем в 10 раз. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.04.2014, 17:46 |
|
Перебор строк (13к+), while, медленно
|
|||
---|---|---|---|
#18+
CheaterXAntonariy, Спасибо заранее! Объясните поподробнее про в данном контексте, какой тип переменной у rOuter, не приходилось работать с массивами. Dim rOuter As Row For Each rOuter In rngOuter.Rows Прошу разжевать если не трудно.это я ошибся, тоже должно быть Range, а не Row. КазанскийНадо загрузить диапазон для обработки в массив и все действия выполнять с элементами массива, потом выгрузить обратно в диапазон. Так можно ускорить не менее чем в 10 раз.кстати да. а можно создать массив из строк, основные потери приходятся как раз на ползанье по строкам: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8.
в этом случае выгружать обратно ничего не надо. Do While можно тогда оставить, а обращения к ячейкам сделать так: Код: vbnet 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
02.04.2014, 12:17 |
|
|
start [/forum/topic.php?fid=60&fpage=44&tid=2156427]: |
0ms |
get settings: |
9ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
60ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
41ms |
get tp. blocked users: |
2ms |
others: | 13ms |
total: | 155ms |
0 / 0 |