Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Выбрать дату в календареВыбрать дату в календаре

Страницы: 1
Ускорить работу макроса сопоставления двух таблиц, Оптимизация кода VBA
 
Добрый день, уважаемые коллеги!
Столкнулся со следующей проблемой. Есть 2 листа (№1 и №2) Excel с разным (но фиксированным) количеством столбцов и очень большим (и не фиксированным) количеством строк. В листе №1 количество строк 50000-150000, в листе №2 - до 100000. В каждом листе есть заполненный столбец уникальных идентификаторов (строка из 12 цифр), уникальность и наличие значения в нужном формате в этом столбце гарантируются.
Есть макрос, который проверяет наличие идентификаторов из Листа№2 в Листе№1 и при наличии совпадения пишет сводные данные в Лист №3.
Макрос работает, но адски медленно: при 118000 строк в Листе №1 и 50000 строк в Листе №2 выполнение макроса занимает у меня около 1.5-2 часов.
Я попробовал переписать его так, чтобы в цикле заполнялся двумерный динамический массив, и потом этот массив вставлялся целым куском в Лист №3, однако, сколько-нибудь заметного прироста производительности это не дало, т.к. из-за невозможности динамического изменения первой размерности динамического массива с сохранением данных, получившийся массив приходится транспонировать перед вставкой - тоже в цикле, т.к. Application.transpose() с такими количествами строк не работает.
Пробовал отключать/останавливать фоновые процессы вроде обновления экрана - вот до 1,5-2 часов получилось упасть, было дольше. Вопрос, можно ли разогнать макрос ещё больше, хотя бы в 2-3 раза?
В этой теме http://www.planetaexcel.ru/forum/index.php?PAGE_NAME=message&FID=1&TID=77861&... подсмотрел идею поделить массив на блоки и работать с ними, но в моём случае это не прокатит, т.к. строки между собой не группируются, и все являются уникальными.

Буду признателен за любые дельные советы по ускорению алгоритма. Сам сейчас думаю в направлении того, чтобы отсортировать самый большой из списков идентификаторов и проходить по нему алгоритмом быстрого поиска, а не перебором.

P.S. В примере, разумеется, все данные вымышленные и длина списков минимальная. Макрос там же.
Изменено: Irregular Expression - 13 ноя 2017 13:23:54
Страницы: 1
Наверх