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

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

Dim Массив() As Integer

Прежде чем использовать динамический массив, необходимо указать его размерность с помощью оператора ReDim. Оператор имеет следующий формат:

ReDim [Preserve] <Имя массива>(
                  [<Начальный индекс> To]<Максимальный индекс>[,
             ..., [<Начальный индекс> To]<Максимальный индекс>])
                  [As <Тип>]

Указывать размерность массива можно сколько угодно раз, тем самым динамически увеличивая или уменьшая размер массива. Чтобы после изменения размерности данные из старого массива были добавлены в новый массив необходимо указать ключевое слово Preserve. Если ключевое слово не указать, то новый массив будет пустым. Пример:

Dim Массив() As Integer
ReDim Массив(1)
Массив(0) = 1
Массив(1) = 8
Debug.Print Массив(0) & " - " & Массив(1)  ' 1 - 8
ReDim Preserve Массив(3)  ' Указано слово Preserve
Массив(2) = 12
Debug.Print Массив(0) & " - " & Массив(1)  ' 1 - 8
ReDim Массив(4)           ' Не указано слово Preserve
Debug.Print Массив(0) & " - " & Массив(1)  ' 0 - 0

Если указано ключевое слово Preserve, то:

Объявить динамический массив можно как тип данных Variant. В этом случае в операторе ReDim можно изменить тип данных элементов массива, при условии, что ключевое слово Preserve не указано. Пример:

Dim Массив As Variant
ReDim Массив(1) As Integer
Массив(0) = 1
Массив(1) = 8
Debug.Print Массив(0) & " - " & Массив(1)  ' 1 - 8
ReDim Preserve Массив(2)
Массив(2) = 12
Debug.Print Массив(0) & " - " & Массив(1) & " - " & Массив(2)
' 1 - 8 - 12

Функция Array() позволяет создать массив и сразу присвоить значения всем его элементам. Функция имеет следующий формат:

<Массив> = Array([<Значение1>[, ..., <ЗначениеN>])

Пример:

Dim Массив As Variant
Массив = Array(1, 8)
Debug.Print Массив(0) & " - " & Массив(1)  ' 1 - 8

Нижняя граница создаваемого массива зависит от значения, указанного в инструкции Option Base. Если инструкция не указана, то нумерация элементов массива начинается с нуля. Чтобы нижняя граница массива не зависела от инструкции Option Base, необходимо перед названием функции указать VBA и точку:

Dim Массив As Variant
Массив = VBA.Array(1, 8) ' Не зависит от значения Option Base
Debug.Print Массив(0) & " - " & Массив(1)  ' 1 - 8

Если список значений не указан, то создается пустой массив:

Dim Массив As Variant
Массив = Array()
Debug.Print LBound(Массив) & " - " & UBound(Массив)  ' 0 - -1

Функцию Array() удобно использовать также для создания многомерных массивов:

Dim Массив As Variant
Массив = Array(Array(0, 1), Array(2, 3), Array(4, 5))
Debug.Print Массив(0)(1) & " - " & Массив(1)(1)  ' 1 - 3

Обратите внимание на обращение к элементам многомерного динамического массива. Каждый индекс указывается внутри круглых скобок Массив(0)(1), а не через запятую Массив(0, 1), как это было при использовании обычных многомерных массивов.

Предыдущая статья Все статьи Следующая статья