Найти в Дзене

📌 Оптимизация макроса: использование массивов для улучшения производительности

Оглавление

При обработке больших массивов данных зачастую ключевым является вопрос оптимизации кода таким образом, чтобы время его выполнения было минимальным.

Один из подходов решения позволяющий улучшить производительность кода рассмотрим сегодня в обзоре.

Оптимизация макроса: использование массивов для улучшения производительности
Оптимизация макроса: использование массивов для улучшения производительности

📢 Файл с примером размещен в конце статьи 🔽

-3

▶️ Цели и задачи

В качестве простого примера демонстрирующего улучшение производительности кода рассмотрим задачу нумерации строк.
-4

Цель: максимально эффективно выстроить соответствующую нумерацию в столбце А при условии наличия записи (по столбцу В) исключив наличие формул на листе.

▶️ Тривиальные подходы решения

Безусловно наиболее простым решением поставленной задачи является использование подхода: =СТРОКА()-СТРОКА($A$1)

Макрос в этом случае может иметь вид:

Нумерация столбца макросом
Нумерация столбца макросом

Но при данном подходе на листе будет добавлена формула, что в рамках решения задачи не является допустимым:

Нумерация в столбце по формуле "=СТРОКА()-СТРОКА($А$1)"
Нумерация в столбце по формуле "=СТРОКА()-СТРОКА($А$1)"

Принимая во внимание, что формулы на листе (даже сгенерированные макросом) не допустимы можно воспользоваться следующим кодом VBA для нумерации столбца:

Нумерация в столбце по типу "=СТРОКА()-СТРОКА($A$1)"
Нумерация в столбце по типу "=СТРОКА()-СТРОКА($A$1)"

В этом коде номер строки в столбце А рассчитывается как разница между номером текущей строки и номером базовой строки (в данном случае, А1).

Но является ли такой подход оптимальным решением? На наш взгляд нет!

▶️ Оптимизация производительности

Для улучшения производительности мы можем использовать массивы.

Массивы представляют собой структуры данных, позволяющие хранить множество значений в одной переменной. Они могут использоваться для обработки больших объемов данных более эффективно, чем обычные циклы, работающие с ячейками листа по одной.

Когда данные загружаются из листа в массив, происходит одна операция ввода/вывода, что быстрее, чем многократные операции, когда вы работаете непосредственно с ячейками листа.

После обработки данных в массиве результаты могут быть записаны обратно на лист.

Например:

Нумерация строк при помощи массива
Нумерация строк при помощи массива

Этот код использует массивы для ускорения операций и затем записывает результат обратно на лист.

▶️ Альтернативное решение

Рассмотренный выше макрос безусловно является примером наилучшей практики если данные должны обновляться по запросу пользователя.

Но что, если нужно реагировать на изменения данных в реальном времени?

Использование массивов в модуле листа (в обработчике события Worksheet_Change) может быть хорошим решением, если обработки данных связаны с изменениями на листе.

Например:

Использование массивов в обработчике события Worksheet_Change
Использование массивов в обработчике события Worksheet_Change

Этот код будет выполняться при каждом изменении данных в столбце B на листе.

⚙️ Краткое описание:

  • Проверяем, что изменения произошли именно в столбце В,
  • Выполняем операции над массивом и записываем результаты в столбец A.
  • Обязательно отключаем и включаем событие Change, чтобы избежать бесконечной рекурсии.

📝 Примечание автора: для обработки удаления значений в столбце B и очистки соответствующих ячеек в столбце A мы также учли, что, при удалении значения (в столбце B), соответствующая ячейка (в столбце A) будет очищаться.

✔️ В ряде основных преимуществ такого подхода отметим следующие:

  • Автоматически срабатывает при определенных событиях, таких как изменение ячеек.
  • Подходит для непрерывного мониторинга и обработки изменений данных.

⚠️ Однако, есть несколько важных моментов, которые следует учесть:

  • Событие Worksheet_Change срабатывает при любом изменении на листе. Если вы используете массивы в обработчике события Worksheet_Change, он будет срабатывать каждый раз при изменении любой ячейки на листе. Это может повлиять на производительность, особенно если изменения касаются большого количества ячеек.
  • Внимательно следите за целями обработки. Если массив охватывает всю область листа, каждый раз при изменении данных сработает событие. Это может привести к нежелательному повторному вычислению.
  • Обработка больших объемов данных. Использование массивов в модуле листа будет эффективным, особенно если вы выполняете сложные операции над большими объемами данных.

Если изменения касаются только конкретных ячеек или определенной области, может иметь смысл использовать обработчик события Worksheet_Change в связке с массивами.

🔔 Помните! Важно следить за производительностью и учитывать ограничения этого метода.

🔶 Подводя итог...

Если ваш код предполагает обработку больших объемов данных рекомендуем сначала загрузить данные в массив, выполнить операции над массивом и затем записать обновленные значения обратно.

Этот подход особенно полезен, когда нужно многократно обрабатывать или изменять данные на листе, так как он снижает количество обращений к листу Excel, что улучшает производительность.

📝 Узнать больше о массивах

-11
Excel на ИЗИ

СКАЧАТЬ ПРИМЕР