End Sub

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)

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


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: