Динамические массивы
End Sub
Номер первого элемента и границы массива
До сих пор во всех примерах массивов мы начинали нумерацию элементов с 1. Как уже упоминалось, можно начинать ее с 0, 1 или любого другого числа. Правил здесь не существует: одни разработчики предпочитают 0, другие — 1. В VBA для выбора между 0 и 1 используется инструкция Option Base, которую помещают начало модуля VBA. Если этой инструкции нет, VBA по умолчанию использует в качестве первого номера 0.
Чтобы начать нумерацию массива с другого числа, Вы должны в его объявлении указать верхнюю и нижнюю границы. Как это сделать, мы продемонстрируем в следующем примере.
Sub НомерПервогоЭлемента()
Dim Data4(4 To 5) As Integer
Data4(4) = lnt(100 * Rnd())
Data4(5) = Int(100 * Rnd())
MsgBox " Выиграли лотерейные номера: " & Data4(4) & ", " & Data4(5)
Здесь описан одномерный 2-элементный массив Data4. Числа, заключенные в круглые скобки после имени массива, задают его нижнюю и верхнюю границы. В данном случае номера двух элементов массива будут равны 4 и 5.
|
|
Кроме описанных массивов фиксированного размера в VBA есть массивы еще одного вида – динамические. До сих пор мы всегда явно указывали размерность массива в инструкции. При описании динамического массива его размер не указывается. Он определяется позже, при выполнении кода.
Динамический массив удобен, если Вы предполагаете, что в ходе выполнения программы его размер может измениться. В этой ситуации можно сэкономить память: сделайте так, чтобы размеры массивов точно соответствовали Вашим текущим потребностям. В противном случае Вы рискуете создать массивы, которые только попусту занимают место – а это плохо отразится на производительности.
Рассмотрим динамический массив подробнее. В процедуре ДинамическийМассив массив Data5 сначала (с помощью инструкции ReDim) объявлен как одномерный 2-элементный массив, а затем как двухмерный 30-элементный.
Sub ДинамическийМассив()
Dim Data5() As Variant
ReDim Data5(2)
Data5(1) = Int(100 * Rnd())
Data5(2) = Int(100 * Rnd())
MsgBox " Выиграли лотерейные номера: " & Data5(1) & ", " _ & Data5(2)
ReDim Data5(10,3)
Data5(1,1) = "Иванов"
Data5(1,2) = #3/21/1947#
Data5(1,3) = Year(Date)-Year(Data5(1,2))
MsgBox Data5(1,1) & ", возраст " & Data5(1,3) & _
", родился " & Data5(1,2)
Сначала в строке 2 мы описали массив Data5 типа Variant, не указывая число измерений и элементов. В этой инструкции определяется динамический массив, но память под него не отводится, пока в строке 3 не встречается инструкция ReDim. В ней массив Data5 объявлен как одномерный 2-элементный массив. В строках 4 и 5 двум элементам этого массива присваиваются случайные числа. В строке 6 эти числа выводятся в информационном окне. В 7-й строке инструкция ReDim используется еще раз для описания Data5 как двухмерного массива, содержащего 30 элементов. Хранившиеся в массиве данные пропадают. Затем элементам первой строки этого массива присваиваются значения и выводятся в информационном окне. Так, позволяя поочередно отводить один и тот же массив под разные данные, инструкция ReDim и динамический массив экономят память при выполнении программы.
|
|
Кроме того, динамический массив удобен тогда, когда Вы не знаете, сколько записей будет в вашем массиве. Следующий пример демонстрирует эту ситуацию:
1. Пусть имеется база данных (БД) Excel, в которой хранятся сведения о сотрудниках института (Рис. 3‑2). Количество записей в БД может меняться.
Рис. 3‑2. Фрагмент БД
2. Требуется сформировать двумерный массив с данными о доцентах, работающих в институте. В массиве должна храниться следующая информация: Кафедра, Ф.И.О., Разряд.
Для этого напишем следующий код: