Страницы: 1
RSS
Оптимизация многоуровневых циклов
 
Доброго времени суток всем.
Подскажите варианты оптимизации кода для ускорения процесса обработки данных. Суть в следующем, в листе есть таблица товара, порядка 5000 строк и таблица итогов, 12 строк. Задача состоит в том чтобы копировать данные из таблицы план в соответствующие колонки по нескольким условиям. Код отрабатывает, но время обработки кода очень большое. Приложил файл с примером кода.
Заранее спасибо за помощь!
 
Цитата
DSH написал: Код отрабатывает, но время обработки кода очень большое.
0.1сек на файле приложенном -вполне достойный результат
Изменено: JeyCi - 16.07.2015 08:05:07
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
Jeyci, так в примере и табличка маленькая. В оригинальном файле, более 5000 строк и около 100 столбцов. И время обработки уже около 20 сек
 
DSH так если разобраться в алгоритме, так и через массивы можно переписать... а если
Цитата
DSH написал:  Задача состоит в том чтобы копировать данные из таблицы план в соответствующие колонки по нескольким условиям.
а условия и соответствия разбираться самим, какие?... то и помощь ждать можно не 0,1 сек, а 20сек...  я откланяюсь (уже время не позволяет), вам успехов - переделывайте на работу с массивами - быстрее будет, чем с ячейками - но условия лучше всего известны только вам...
p.s. скорость получения ответа часто зависит от постановки вопроса... потому что в коде ещё разобраться надо, что есть что и что откуда вы взяли... рус.яз компактнее  ;) ... бывает и хочешь по-быстрому помочь, да и вопрос вызывает кучу ответных вопросов - в чём проблема?...
Изменено: JeyCi - 16.07.2015 08:58:31
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
JeyCi, спасибо за направление. Буду пробовать сделать обработку в массиве.

Да, согласен что не охватил всех пунктов.
1. В диапазоне "С4:С9" делается пометка если необходимо исключить данные позиции из расчета.
2. Чтобы исключить данные позиции из таблицы товара в колонке С делаются пометки, какие позиции исключать( в примере просто ВПРом)
3. В диапазоне "D3:K3" делаются пометки если необходимо убрать план с отпределенных дней.

При обработке алгоритма циклом прогоняю каждую ячейку в "D3:K3"(3)  на поиск пометки. Если ее нет, то тогда Прогоняю по строкам, колонка С (2), проверку на наличии пометок. В таблицу Результатов переносятся только те ячейки, на которых нет пометок.
В итогах, принцип индентичен, только проверка по диапазону "С4:С9" (1)
Изменено: DSH - 16.07.2015 09:17:25
 
строк немного побольше сделал, а то второй макрос (на массивах и словарях) частенько 0 выдавал.
жмем кнопку.
первый мсгбокс - время исх.макроса, второй мсгбокс - макрос на массивах.
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
а, все равно 0 мсек. бывает.
ну, короче, строк накопируйте сколько хотите.
последний номер для обработки - задается константой nn в начале кода.

и вот еще ссылка на недавнюю тему с похожей оптимизацией:
http://www.planetaexcel.ru/forum/index.php?PAGE_NAME=read&FID=1&TID=67683&TITLE_SEO=67683-optimizatsiya-skorosti-vyborki-v-massivakh
там массивы изначально были, но переход от вложенных циклов перебора к коду на словарях творит чудеса :)
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
1 (не очень существенное, но все же) не нужно использовать integer и byte, если только это не необходимо критически - используйте long, и не ошибетесь, если условия(количество сток, например) изменятся и быстрее работает
2 пишете
Цитата
'""""""""""""""""""""""""""""""""""""""""""""""POISK PO STROKAM
а на самом деле по столбцам
3
Код
If Cells(3, rPoz).Value = ""
keit заменить на
Код
If Cells(3, rPoz).text = ""
ибо value может быть и не текстовым
4 всегда быстрее загрузить диапазон ячеек в массив и перебирать элементы массива
5 единственное алгоритмическое улучшение я вижу так: при проверке ячеек на ноль идти не сверху, а снизу и при нахождении условия тут же выходить из цикла, но нужно предусмотреть случай, когда ни одного нуля не найдено.. т.е если выход из цикла по нахождению нуля, то ставим новое значение и выходим, если естественный выход( по окончанию счетчика), то ставим пусто(""). Но эффект зависит от преобладающих состояний - если нулей встречается много, то эффект будет положительным. сейчас-то вы вынуждены перебирать все строки без вариантов
Живи и дай жить..
 
ikki, спасибо большое за помощь и за готовое решение. Скорость обработки значительно выше( добавил еще строк) .
Еще бы понять логику обработки)) Спасибо большое вам!!!
 
Слэн, спасибо за комментарии. Осведомлен, значит вооружен ;)
 
Цитата
DSH написал: Еще бы понять логику обработки
будет чего непонятно - спрашивайте.
только не сразу :)
потратьте немного времени на самостоятельный разбор.
по поводу словарей (dictionary) - в гугле уйма статей.
да и по массивам - в общем-то, тоже.
только искать лучше именно VBA-шные варианты.
Изменено: ikki - 16.07.2015 10:33:36
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Цитата
ikki написал: будет чего непонятно - спрашивайте.
Ок,спасибо. Разберу по порядку от массивов к словарям.
Страницы: 1
Наверх