Статические и динамические массивы в VBA

Статические и динамические массивы в VBA

Массив это набор элементов одинакового типа, которые имеют общее имя. А обращение к этим элементам происходит по их индексу. Проще говоря, это множество переменных собранных в одну группу по определенному типу. Для более ясного понимания возьмем, например, жемчужные бусы, одни черного цвета, другие белого. Так вот, бусы черного и белого цвета это массивы жемчужин, сгруппированные по цвету, черный и белый, а жемчужины являются элементами этих массивов.Массивы бывают одномерными (линейными), те же вышеупомянутые бусы и многомерными - двумерные(матрицы, 2D), трехмерные и т.д. Статические - кол-во элементов массива объявляется на этапе разработки и не изменяется в процессе выполнения программы, и динамические - число элементов и размерность изменяется в процессе работы программы.

Объявление статических массивов в VBA

Массив в VB объявляется как обычная переменная, после ключевого слова Dim или Public, с той лишь разницей, что после имени переменной (перед ключевым словом "As") должны быть скобки.Dim Mas () as integer

Статические массивы объявляются с указанием верхней и нижней границы:Dim Mas (2 to 50) as integer

Объявить массив также можно указав только кол-во элементов:Dim Mas (50) as integer

В этом случае нижняя граница будет установлена по умолчанию 0. Если Вы хотите что бы первым индексом во всех массивах была 1, то Вам необходимо в начале модуля (перед первой процедурой) указать следующее:Option Base 1

Для объявления многомерных массивов используется запись следующего вида:Dim Matrix (1 to 10, 1 to 10) as integerDim V3D (10, 10,10) as integer 'трехмерный массивDim V4D (10, 10, 25, 5) as integer 'четырехмерный массиви т.д.

Объявление динамических массивов в VBA

Динамический массив - не имеет предопределенного кол-ва элементов и определяется без указания в скобках границ:Dim MyDynMas () as integer

Но динамический массив можно будет использовать только после программного определения границ, после ключевого слова ReDim:Dim MyDynMas () as integer'некоторый код или расчет границi=4Redim MyDynMas (i)

x = i +13Redim MyDynMas (x)

после переопределения кол-ва элементов массива, все элементы обнуляются. Для того чтобы сохранить значения элементов массива, после ReDim необходимо добавить ключевое слово Preserve:

Redim Preserve MyDynMas (x)

Так же возможно переопределить размерность массивов, например с одномерного на двух-трех-мерный:Dim MyDynMas () as integer'некоторый код или расчет границi=4Redim MyDynMas (i)

x = i +13Redim MyDynMas (i, x)

но учтите, что при переопределении размерности массива, использование ключевого слова Preserve для сохранения значений элементов - невозможно!

Рассмотрим примеры по работе со статическими и динамическими массивами.

Пример 1:Дан одномерный массив с тремя элементами и матрица 3х4 (3 строки, 4 столбца). Необходимо умножить каждый элемент одномерного массива со всеми элементами строки матрицы, т.е. 1-й элемент умножаем со всеми элементами первой строки матрицы, 2-й со второй строкой и т.д. Результат вывести в виде матрицы в сообщении.

Option ExplicitOption Base 1

Sub StatMas()Dim Mas(3) As IntegerDim Matr(3, 4) As IntegerDim Msg As StringDim i, j As Integer

'заполняем масивыMas(1) = 2: Mas(2) = 4: Mas(3) = 6

Matr(1, 1) = 4: Matr(1, 2) = 5: Matr(1, 3) = 1: Matr(1, 4) = 7Matr(2, 1) = 12: Matr(2, 2) = 10: Matr(2, 3) = 2: Matr(2, 4) = 9Matr(3, 1) = 24: Matr(3, 2) = 11: Matr(3, 3) = 6: Matr(3, 4) = 3

Msg = "Результат:" & Chr(13)For i = 1 To 3 For j = 1 To 4 Matr(i, j) = Matr(i, j) * Mas(i) 'добавляем результат в строку сообщения, резделитель TAB (chr(9)) Msg = Msg & CStr(Matr(i, j)) & Chr(9) Next j 'добавляем перенос на новую строку chr(13) Msg = Msg & Chr(13)Next iMsgBox MsgEnd Sub

Пример 2:Двухмерный массив не известной длины заполняется следующим образом Mas(i,j) = i * j. Размеры массива вводятся пользователем с помощью формы InputBox. Результат вывести в сообщении.

Sub DynMasTest()Dim Msg As StringDim i, j, col, row As IntegerDim DynMas() As Long

Msg = "Результат:" & Chr(13)

col = InputBox("Введите кол-во столбцов массива", _ "Пример создания динамического массива", 2)row = InputBox("Введите кол-во строк массива", _ "Пример создания динамического массива", 2)

ReDim Preserve DynMas(col, row)

For i = 1 To col For j = 1 To row DynMas(i, j) = i * j Msg = Msg & CStr(DynMas(i, j)) & Chr(9) Next j Msg = Msg & Chr(13)Next iMsgBox MsgEnd Sub

И напоследок, для того чтобы узнать (получить) длину массива воспользуйтесь функцией UBound(). Запись типа UBound(Mas) вернет кол-во элементов одномерного массива. Если же необходимо узнать длину многомерного массива, то функция примет вид UBound(Matr, 2) – вернет кол-во элементов второго измерения, UBound(Matr, 3) – третьего и т.д. Запись же UBound(Matr, 1) равносильна UBound(Mas).

Sub GetLengthMas()Dim Matr(3, 4, 5) As Integer

MsgBox "Размер массива: " & UBound(Matr, 1) & "x" & UBound(Matr, 2) & "x" & UBound(Matr, 3) _ & Chr(13) & "Всего элементов: " & UBound(Matr, 1) * UBound(Matr, 2) * UBound(Matr, 3)End Sub

📎📎📎📎📎📎📎📎📎📎