Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
VBA_lektsii.doc
Скачиваний:
2
Добавлен:
01.04.2025
Размер:
3.91 Mб
Скачать

3.4. Номер первого элемента и границы массива

До сих пор во всех примерах массивов мы начинали нумерацию элементов с 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)

End Sub

Здесь описан одномерный 2-элементный массив Data4. Числа, заключенные в круглые скобки после имени массива, задают его нижнюю и верхнюю границы. В данном случае номера двух элементов массива будут равны 4 и 5.

3.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)

End Sub

Сначала в строке 2 мы описали массив Data5 типа Variant, не указывая число измерений и элементов. В этой инструкции определяется динамический массив, но память под него не отводится, пока в строке 3 не встречается инструкция ReDim. В ней массив Data5 объявлен как одномерный 2-элементный массив. В строках 4 и 5 двум элементам этого массива присваиваются случайные числа. В строке 6 эти числа выводятся в информационном окне. В строке 7 инструкция ReDim используется еще раз для описания Data5 как двухмерного массива, содержащего 30 элементов. Хранившиеся в массиве данные пропадают. Затем элементам первой строки этого массива присваиваются значения и выводятся в информационном окне. Так, позволяя поочередно отводить один и тот же массив под разные данные, инструкция ReDim и динамический массив экономят память при выполнении программы.

Кроме того, динамический массив удобен тогда, когда вы не знаете, сколько записей будет в вашем массиве. Следующий пример демонстрирует эту ситуацию:

1. Пусть имеется база данных (БД) Excel, в которой хранятся сведения о сотрудниках института (рис. 3.2). Количество записей в БД может меняться.

Рис. 3.2. Фрагмент БД

2. Требуется сформировать двумерный массив с данными о доцентах, работающих в институте. В массиве должна храниться следующая информация: кафедра, Ф.И.О., разряд.

Для этого напишем следующий код:

Option Base 1

Sub МассивДоценты()

Dim Сотрудники() As String

Dim КолДоцентов As Integer

Dim НомерСтроки As Integer

КолДоцентов = 0

НомерСтроки = 3

While Cells(НомерСтроки,2).Value <> ""

If Cells(НомерСтроки,3).Value = _

"Доцент" Then КолДоцентов = КолДоцентов + 1

НомерСтроки = НомерСтроки + 1

Wend

ReDim Сотрудники(КолДоцентов, 3)

For i = 1 To НомерСтроки - 1

If Cells(НомерСтроки,3).Value = "Доцент" Then

Сотрудники(i,1) = Cells(НомерСтроки,1).Value

Сотрудники(i,2) = Cells(НомерСтроки,2).Value

Сотрудники(i,3) = Cells(НомерСтроки,3).Value

End If

Next

MsgBox "Массив сформирован! В нем содержится " _

& КолДоцентов & " записей."

End Sub

Так как количество записей заранее неизвестно, воспользуемся управляющей структурой While-Wend (строки 812, подробнее см.8.4). Эта конструкция позволяет выполнять группу инструкций до тех пор, пока соблюдается некоторое условие (в данном примере – вторая ячейка в строке не должна быть пустой1).

Просматривая БД, считаем количество доцентов и запоминаем его в переменной КолДоцентов.

После того как все записи БД «просмотрены», ещё раз объявляем динамический массив как двумерный массив с известным количеством записей (строка 13). Далее заполняем этот массив записями, отвечающими заданному критерию отбора (строки 1420).

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]