Всем привет, в этой статье мы рассмотрим массивы VBA языка. Но сначала немного теории… Как мы уже знаем, данные удобно хранить в переменных, но это не всегда эффективно, например: есть десять значений (номера телефонов), объявлять для каждого значения переменную довольно громоздко, да и объем кода увеличивается, более эффективно объявить одну структуру и сохранить в ней все данные, к которые можно будет обратиться по порядковому номеру (индексу). Такая структура и будет называться массивом.
VBA массивы могут быть как одномерными (список), так и многомерными:
VBA одномерный массив
Одномерные VBA массивы представляют из себя список, который хранит данные заданного типа, например:
Dim MyArr(2) As Integer |
Тут мы объявили одномерный VBA массив, состоящий из трех элементов (нумерация элементов начинается с нуля) и задали целый тип данных. Можно и не задавать тип данных, например:
Dim MyArr(2)
|
Для примера, создадим форму с темя текстовыми метками (объект Label) и одной кнопкой и попишем в редакторе кода:
Private Sub CommandButton1_Click() Dim MyArr(2) As Integer MyArr(0) = 10 MyArr(1) = 20 MyArr(2) = 30 Label1.Caption = "Значение: " & MyArr(0) Label2.Caption = "Значение: " & MyArr(1) Label3.Caption = "Значение: " & MyArr(2) End Sub Private Sub UserForm_Initialize() Label1.Caption = "" Label1.FontSize = 15 Label1.ForeColor = vbBlue Label2.Caption = "" Label2.FontSize = 15 Label2.ForeColor = vbRed Label3.Caption = "" Label3.FontSize = 15 Label3.ForeColor = vbGreen CommandButton1.Caption = "Значения" End Sub |
Тут при нажатии на кнопку происходит объявление одномерного VBA массива с тремя целыми значениями, далее через порядковый номер происходит присвоение данные и их запись в свойство Caption. Массив не обязательно должен хранить однотипные данные, например:
Private Sub CommandButton1_Click() Dim MyArr(2) MyArr(0) = "Строка" MyArr(1) = #12/30/1986# MyArr(2) = 124.55 Label1.Caption = "Значение: " & MyArr(0) Label2.Caption = "Значение: " & MyArr(1) Label3.Caption = "Значение: " & MyArr(2) End Sub |
В данном случае мы присвоили значения разных типов (строка, дата и вещественное число), при этом, сам тип данных для массива VBA мы не указывали, иначе, произошла бы ошибка Type mismatch (несоответствие типов).
VBA многомерный и двумерный массив
Помимо одномерных, можно объявлять и многомерные массивы до 60 измерений, например:
Private Sub CommandButton1_Click() Dim MyArr(0 To 1, 0 To 3) As Integer MyArr(0, 0) = 10 MyArr(0, 1) = 11 MyArr(0, 2) = 12 MyArr(0, 3) = 13 MyArr(1, 0) = 20 MyArr(1, 1) = 21 MyArr(1, 2) = 22 MyArr(1, 3) = 23 Label1.Caption = MyArr(0, 0) & MyArr(0, 1) & MyArr(0, 2) & MyArr(0, 3) Label2.Caption = MyArr(1, 0) & MyArr(1, 1) & MyArr(1, 2) & MyArr(1, 3) End Sub |
Строка Dim MyArr(0 To 1, 0 To 3) As Integer говорит, что мы объявили двумерный VBA массив размером два на четыре, при этом, мы сразу указали нумерацию, для сравнения:
Dim MyArr(2 To 3, 3 To 5) As Integer MyArr(2, 3) = 10 MyArr(2, 4) = 11 MyArr(2, 5) = 12 MyArr(3, 3) = 20 MyArr(3, 4) = 21 MyArr(3, 5) = 22 Label1.Caption = MyArr(2, 3) & MyArr(2, 3) & MyArr(2, 5) Label2.Caption = MyArr(3, 3) & MyArr(3, 4) & MyArr(3, 5) |
Хотя можно прописать и так MyArr(2,3), в этом случае нумерация будет идти от нуля автоматически.
Динамические массивы VBA – довольно часто может возникнуть ситуация, когда точно количество элементов массива не известно, или же его размер надо изменить. При объявлении динамического массива его размер не указывается:
Dim MyArr ()
|
Для изменения размера используется ключевое слово ReDim:
ReDim MyArr(6)
|
ReDim автоматически удаляет все предыдущие значения, что бы они сохранились (например, предыдущий размер составлял 4 элемента и хранил данные, а теперь надо расширить размер до 6 элементов, сохранив предыдущие значения), используется ключевое слово Preserve:
ReDimPreserve MyArr(10) |
Оператор Option Base 1 – данные оператор позволяет указать, что бы нумерация элементов начиналась не с нуля, а с единицы.
Некоторые функции – язык VBA предоставляет в распоряжение пользователя функции для работы с массивами, например:
Array() – данная функция VBA позволяет сразу задавать значения одномерного массива:
Dim MyArr
MyArr = Array(10, 22, 100, 5)
|
Видим, что сначала надо объявить переменную, а уже потом использовать функцию для формирования одномерного VBA массива.
Erase – очищает содержимое:
Erase MyArr |
Если мы применим функцию к статическому массиву, то все значения, хранящиеся в нем, просто удалятся, в случае же динамического массива произойдет его разинициализация, после чего придется наново указывать его размерность.
Есть и другие функции для работы с массивами VBA, плюс, можно создавать вложенные массивы, более детально можете почитать в статье VBScript массивы (просто структура языков практически одинакова).