Урок 8 по VBA — Массивы

Урок 8 по VBA — Массивы Макросы на VBA

Всем привет, в этой статье мы рассмотрим массивы 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 массивы

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

Есть и другие функции для работы с массивами VBA, плюс, можно создавать вложенные массивы, более детально можете почитать в статье VBScript массивы (просто структура языков практически одинакова).

Оцените статью
Технологии программирования и ведение блога
Добавить комментарий