Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

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

Поиск

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

Динамические массивы

Кроме описанных массивов фиксированного размера в 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). Эта конструкция позволяет выполнять группу инструкций до тех пор, пока соблюдается некоторое условие (в данном примере – вторая ячейка в строке не должна быть пустой[14]).

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

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

Сохранение данных в динамическом массиве при изменении
последней размерности

В рассмотренном примере наблюдается такая несуразица как двойная проверка условия «Должность = доцент»: первый раз соответствие записи этому критерию осуществлялось при подсчете количества записей, а второй раз – при выборке информации. Возникает вопрос: а возможно ли при нахождении нужной записи сразу добавлять информацию в динамический массив? Оказывается, - да, возможно. Для этого используется ключевое слово Preserve (сохранить). Следующий код демонстрирует эту возможность.

Sub МассивДоценты_СохранениеДанных()

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

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

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

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

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

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

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

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

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

Сотрудники(1,КолДоцентов) = _

Cells(НомерСтроки,1).Value

Сотрудники(2,КолДоцентов) = _

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

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

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

 

End If

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

Wend

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

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

End Sub

В строке 9 этого кода, при выполнении критерия отбора, счетчик увеличивается на 1 и (строка 10) в оперативной памяти выделяется место для следующей записи. При этом предыдущие записи сохраняются. При отсутствии ключевого слова Preserve при повторном определении динамического массива память выделяется заново, при этом все данные уничтожаются.

Обратите внимание: при использовании ключевого слова Preserve, изменяемая размерность должна быть последней. Это значит, что команда:

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

недопустима!



Поделиться:


Последнее изменение этой страницы: 2021-12-15; просмотров: 42; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.145.32.238 (0.006 с.)