Массивы в Visual Basic для приложений

Массивы в Visual Basic for Application — это структуры, которые обычно хранят наборы связанных переменных одного типа. Доступ к элементам массива осуществляется по их числовому индексу.

Например, есть команда из 20 человек, имена которых необходимо сохранить для последующего использования в коде VBA. Можно было бы просто объявить 20 переменных для хранения каждого имени, например:

Уменьшить Team_Member1 как строку. Уменьшить Team_Member2 как строку... Уменьшить Team_Member20 как строку.

Но вы можете использовать гораздо более простой и организованный способ — сохранить список имен членов команды в массиве из 20 переменных, например строка:

Уменьшить Team_Members (от 1 до 20) как строку

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

Team_Members(1) = "Джон Смит"

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

Как это работает, показано ниже на примере кода, который последовательно печатает имена каждого члена команды в ячейках столбцов. A активный лист Excel.

Для i = от 1 до 20 ячеек(i,1).Value = Team_Members(i) Следующий i

Очевидно, что работать с массивом, хранящим 20 имен, гораздо менее громоздко и точнее, чем с использованием 20 отдельных переменных. А что, если этих имен не 20, а 1000? А если к тому же потребуется хранить фамилии и отчества отдельно?! Понятно, что обрабатывать такой объем данных в коде VBA вскоре станет совершенно невозможно без помощи массива.

Многомерные массивы в Excel Visual Basic

Массивы Visual Basic, рассмотренные выше, считаются одномерными. Это означает, что они хранят простой список имен. Однако массивы могут иметь несколько измерений. Например, двумерный массив можно сравнить с сеткой значений.

Допустим, вы хотите сохранить ежедневные показатели продаж за январь для 5 разных команд. Для этого потребуется двумерный массив, состоящий из 5 наборов метрик за 31 день. Давайте объявим массив следующим образом:

Dim Jan_Sales_Figures (от 1 до 31, от 1 до 5) в качестве валюты

Чтобы получить доступ к элементам массива Январь_Sales_Figures, вам нужно использовать два индекса, указывающие день месяца и номер команды. Например, адрес элемента, содержащего данные о продажах 2-ой команды для 15-й Январь можно было бы записать так:

Январь_Sales_Figures(15, 2)

Таким же образом вы можете объявить массив с 3 и более измерениями — просто добавьте в объявление массива дополнительные измерения и используйте дополнительные индексы для обращения к элементам этого массива.

Объявление массивов в Excel Visual Basic

Ранее в этой статье мы уже рассматривали несколько примеров объявления массивов в VBA, но эта тема заслуживает более пристального внимания. Как показано, одномерный массив можно объявить следующим образом:

Уменьшить Team_Members (от 1 до 20) как строку

Такое объявление сообщает компилятору VBA, что массив Члены команды состоит из 20 переменных, доступ к которым возможен по индексам от 1 до 20. Однако мы можем подумать о нумерации переменных нашего массива от 0 до 19, и в этом случае массив следует объявить следующим образом:

Уменьшить Team_Members (от 0 до 19) как строку

На самом деле по умолчанию нумерация элементов массива начинается с 0, а в объявлении массива исходный индекс может вообще не указываться, вот так:

Dim Team_Members(19) как строка

Компилятор VBA воспримет такую ​​запись как объявление массива из 20 элементов с индексами от 0 до 19.

Те же правила применяются при объявлении многомерных массивов Visual Basic. Как уже было показано в одном из примеров, при объявлении двумерного массива индексы его измерений разделяются запятой:

Dim Jan_Sales_Figures (от 1 до 31, от 1 до 5) в качестве валюты

Однако если вы не укажете начальный индекс для обоих измерений массива и объявите его следующим образом:

Dim Jan_Sales_Figures(31, 5) Как валюта

то эта запись будет рассматриваться как двумерный массив, первое измерение которого содержит 32 элемента с индексами от 0 до 31, а второе измерение массива содержит 6 элементов с индексами от 0 до 5.

Динамические массивы

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

Динамический массив объявляется с пустыми круглыми скобками, например:

Dim Team_Members() как строка

Далее вам нужно будет объявить размерность массива во время выполнения кода, используя выражение Редим:

ReDim Team_Members (от 1 до 20)

А если в ходе выполнения кода вам потребуется еще раз изменить размер массива, то вы можете снова использовать выражение ReDim:

Если Team_Size > 20, то ReDim Team_Members(1 To Team_Size) End If

Имейте в виду, что изменение размера динамического массива таким способом приведет к потере всех значений, хранящихся в массиве. Чтобы сохранить данные уже в массиве, вам нужно использовать ключевое слово Сохранятькак показано ниже:

Если Team_Size > 20, то ReDim Preserve Team_Members(1 To Team_Size) End If

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

Оставьте комментарий