Wend
End If
End Sub
Next
End If
Wend
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
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
MsgBox "Массив сформирован! В нем содержится " _
& КолДоцентов & “ записей.”
Так как количество записей заранее неизвестно, воспользуемся управляющей структурой 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
НомерСтроки = НомерСтроки + 1
MsgBox "Массив сформирован! В нем содержится " _
& КолДоцентов & “ записей.”
В строке 9 этого кода, при выполнении критерия отбора, счетчик увеличивается на 1 и (строка 10) в оперативной памяти выделяется место для следующей записи. При этом предыдущие записи сохраняются. При отсутствии ключевого слова Preserve при повторном определении динамического массива память выделяется заново, при этом все данные уничтожаются.
|
|
Обратите внимание: при использовании ключевого слова Preserve, изменяемая размерность должна быть последней. Это значит, что команда:
ReDim Preserve Сотрудники(КолДоцентов, 3)
недопустима!