Найти в Дзене
VBA Excel с нуля

VBA Excel № 118. Быстрая запись в диапазон (массивом).

Доброго времени суток! В прошлой статье для перемещения содержимого массива в диапазон применялся цикл For Next. Давайте рассмотрим улучшенный подход. Начнем с примера, где мы демонстрируем простой, но не самый эффективный способ заполнения диапазона. Здесь также используем цикл For Next для вставки значений в диапазон, а потом улучшим процедуру. Давайте ниже рассмотрим улучшенный пример, который демонстрирует более эффективный способ достижения того же результата. Программа вставляет значения в массив и использует всего один оператор для переноса содержимого массива в диапазон. Как видим из примера, использование метода передачи массива значительно ускоряет процесс. Например, при заполнении массива размером 10000×15 ячеек (150 тысяч ячеек) этот метод занимает всего 0,23 секунды по сравнению аж с 7,68 секундами при использовании цикла. Поэтому старайтесь не использовать циклы при обработке больших объемов данных в Excel. Кстати. Время выполнения процедуры зависит от наличия формул, поэ
Оглавление
Скриншот с моего ноутбука
Скриншот с моего ноутбука

Доброго времени суток!

В прошлой статье для перемещения содержимого массива в диапазон применялся цикл For Next. Давайте рассмотрим улучшенный подход. Начнем с примера, где мы демонстрируем простой, но не самый эффективный способ заполнения диапазона. Здесь также используем цикл For Next для вставки значений в диапазон, а потом улучшим процедуру.

Скриншот с моего ноутбука
Скриншот с моего ноутбука
Скриншот с моего ноутбука
Скриншот с моего ноутбука
Скриншот с моего ноутбука
Скриншот с моего ноутбука
Скриншот с моего ноутбука
Скриншот с моего ноутбука

Давайте ниже рассмотрим улучшенный пример, который демонстрирует более эффективный способ достижения того же результата. Программа вставляет значения в массив и использует всего один оператор для переноса содержимого массива в диапазон.

Скриншот с моего ноутбука
Скриншот с моего ноутбука
Скриншот с моего ноутбука
Скриншот с моего ноутбука
Скриншот с моего ноутбука
Скриншот с моего ноутбука
Скриншот с моего ноутбука
Скриншот с моего ноутбука

Как видим из примера, использование метода передачи массива значительно ускоряет процесс. Например, при заполнении массива размером 10000×15 ячеек (150 тысяч ячеек) этот метод занимает всего 0,23 секунды по сравнению аж с 7,68 секундами при использовании цикла. Поэтому старайтесь не использовать циклы при обработке больших объемов данных в Excel.

Кстати. Время выполнения процедуры зависит от наличия формул, поэтому лучше использовать рабочие книги без формул или, например, установить режим пересчета формул на "Вручную".

И конечно же разберем последний код:

Скриншот с моего ноутбука
Скриншот с моего ноутбука

Здесь объявляются переменные, которые будут использоваться в процедуре: КолЯчеекПо_Вертикали и КолЯчеекПо_Горизонтали для хранения количества ячеек по вертикали и горизонтали соответственно, i и j для управления циклами, ВремяНачала для отслеживания времени выполнения, ВременныйМассив для хранения значений, ЦелевойДиапазон для определения области, в которую будут вставлены значения, и ТекущееЗначение для хранения текущего значения, которое будет вставлено в ячейку.

Скриншот с моего ноутбука
Скриншот с моего ноутбука

Эти строки запрашивают у пользователя количество ячеек по вертикали и горизонтали, используя диалоговые окна InputBox. Если пользователь введет 0 или откажется ввести число, выполнение процедуры прекратится с помощью команды Exit Sub. А также записывается текущее время выполнения процедуры.

Скриншот с моего ноутбука
Скриншот с моего ноутбука

На данном этапе происходит изменение размеров массива ВременныйМассив с помощью команды ReDim, чтобы он соответствовал количеству ячеек по вертикали и горизонтали.

Далее Setопределяет область ЦелевойДиапазон, в которую будут вставлены значения, используя объект Range.

Скриншот с моего ноутбука
Скриншот с моего ноутбука

Этот блок кода заполняет массив ВременныйМассив значениями, начиная с 0 и увеличивая его на 1 на каждом шаге, используя вложенные циклы For.

Скриншот с моего ноутбука
Скриншот с моего ноутбука

Эта строка переносит значения из массива ВременныйМассив в заданный диапазон ЦелевойДиапазон на листе.

Скриншот с моего ноутбука
Скриншот с моего ноутбука

Ну и в конце возвращается управление экранному обновлению, выводится сообщение с временем выполнения процедуры в секундах и завершает процедуру.