Массивы в Visual Basic for Application

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

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

Dim Team_Member1 As String
Dim Team_Member2 As String

...

Dim Team_Member20 As String

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

Dim Team_Members(1 To 20) As String

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

Team_Members(1) = "John Smith"

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

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

For i = 1 To 20
Cells(i,1).Value = Team_Members(i)
Next i

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

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

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

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

Dim Jan_Sales_Figures(1 To 31, 1 To 5) As Currency

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

Jan_Sales_Figures(15, 2)

Таким же образом можно объявить массив с 3-мя и более измерениями – достаточно добавить дополнительные измерения в объявление массива и использовать дополнительные индексы для ссылки на элементы этого массива.

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

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

Dim Team_Members(1 To 20) As String

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

Dim Team_Members(0 To 19) As String

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

Dim Team_Members(19) As String

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

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

Dim Jan_Sales_Figures(1 To 31, 1 To 5) As Currency

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

Dim Jan_Sales_Figures(31, 5) As Currency

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

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

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

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

Dim Team_Members() As String

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

ReDim Team_Members(1 To 20)

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

If Team_Size > 20 Then
ReDim Team_Members(1 To Team_Size)
End If

Нужно иметь в виду, что изменение размера динамического массива таким способом приведёт к потере всех значений, хранившихся в массиве. Для того, чтобы сохранить данные, уже находящиеся в массиве, нужно использовать ключевое слово Preserve, как показано ниже:

If Team_Size > 20 Then
ReDim Preserve Team_Members(1 To Team_Size)
End If

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

05.12.2015 14:15
9761

Комментарии

Нет комментариев. Ваш будет первым!