В Visual Basic существуют массивы фиксированного размера и динамические массивы. Массив фиксированного размера имеет неизменный размер, заданный при его объявлении. Динамические массивы могут изменять размер в процессе выполнения.
Объявление массива фиксированного размера
Как и любой тип данных, массив необходимо объявлять. Ниже приведен синтаксис объявления:
{ Dim | Private | Public I Static} имяМассива (<размер1> [, <размер2>] ...) [As типДанных] [, имяМассива (<размер1> [, <размер2>] ...) [As типДанных}] . . .
Существует 3 способа объявления массива фиксированного размера, которые зависят от области его видимости:
создание глобального массива – объявляется с помощью оператора Public в секции Declarations модуля;
создание глобального массива уровня модуля – объявляется с помощью оператора Private в секции Declarations модуля;
создание локального массива – объявляется с помощью оператора Private в процедуре;
Размер массива может задаваться тремя способами:
объявление только верхней границы массива, при этом нижняя граница массива по умолчанию принимает значение равное 0. Dim arr(20) as integer ‘ создание массива из 21 элемента
объявляется нижняя и верхняя границы изменения индекса Dim arr(11 to 20) as integer ‘ создание массива из 10 элементов
размер массива не объявляется Dim arr() as integer ‘ создание массива, размерность неизвестна
Объявление динамического массива
В случае, когда размер массива заранее неизвестен, Visual Basic позволяет использовать динамические массивы, размеры которых можно изменять во время выполнения. Применение динамических массивов позволяет эффективно управлять памятью, выделяя память под большой массив лишь на то время, когда этот массив используется, а затем освобождая ее.
Создание динамического массива осуществляется следующим образом:
Объявляется массив с помощью ключевых слов, используемых при создании массива фиксированного размера. Список размерностей массива остается пустым. При объявлении глобального массива необходимо выбрать ключевое слово Public, при объявлении массива на уровне модуля — Dim, при объявлении массива в процедуре — Dim или static. Например, Dim massive() As Integer
С помощью выполняемого оператора ReDim указывается размерность массива в виде числа или выражения. Синтаксис оператора ReDim аналогичен синтаксису оператора объявления массива фиксированного размера. Например, размерность массива может быть задана любым из следующих способов:
ReDim massive(x)
ReDim massive(20)
ReDim massive(1 To 20)
При выполнении оператора ReDim данные, размещенные в массиве ранее, теряются. Это удобно в том случае, если данные вам больше не нужны, и вы хотите переопределить размерность массива и подготовить его для размещения новых данных. Если вы хотите изменить размер массива, не потеряв при этом данных, то необходимо воспользоваться оператором ReDim с ключевым словом preserve. Например, приведенный ниже программный код увеличивает размер массива на единицу без потери хранящихся в массиве данных:
ReDim Preserve massive(X)
Но при использовании ключевого слова Preserve можно поменять только последний аргумент, задающий размерность массива.
Для определения границ статического или динамического массива можно использовать функции Lbound и Ubound, которые возвращают соответственно нижнюю и верхнюю границу массива:
Lbound(arrname [, dimension])
Ubound(arrname [, dimension])
arrname – массив, для которого требуется определить границу;
dimension – номер размерности, для которой требуется определить границу.
Примеры:
1. Объявление одномерных массивов
Dim Sum(50) As Integer
Public Name(17) As String
Private Ln(11 to 31) As Double
2. Объявление многомерных массивов
Dim XYCol(100,100,16) As Integer
Public Tempr(15 to 30, 1 to 24) As Integer
3. Объявление статических массивов
Dim vArr(4 To 20, 5 То 70)
MsgBox "Нижняя граница 1-го измерения: " & LBound (vArr, 1)
' результат - 4
MsgBox "Нижняя граница 2-го измерения: " & LBound (vArr, 2)
'результат — 5
4. Объявление динамических массивов
Dim dArr()
ReDim dArr(l To 2, б То 10)
MsgBox "Нижняя граница 1-го измерения: " & LBound(dArr, 1) )
' результат - 1
MsgBox "Нижняя граница 2-го измерения: " & LBound(dArr, 2) )
'результат — 6
Поскольку Lbound и Ubound не воспринимают переменные, отличные от массивов, в скользких случаях имеет смысл до их использования проверить предварительно переменную с помощью IsArray.
IsArray(функция)
Сложнее обстоит дело с неинициализированным динамическим массивом, поскольку в VB/VBA нет средств для его проверки. Здесь можно использовать стандартный метод проверки по ошибке: