Прежде всего обратите внимание в этом листинге на объявление переменных:
Dim iCount As Integer
Dim sNames() As String
Dim iResponse As Integer
Dim i As Integer
Переменная iCount используется для управления размером массива и возрастает при каждом выполнении цикла. sNames - динамический массив, который изменяет свои размеры во время выполнения цикла. Переменная iResponse следит за тем, хочет ли пользователь продолжать ввод имен. Значение этой переменной - фактор, управляющий завершением цикла. Переменная i является счетчиком цикла For при выводе окон сообщений с именами. После объявления переменных присваивается значение переменной iResponse:
iResponse = vbYes
Когда этой переменной присвоено значение, все готово к началу цикла:
Do While iResponse = vbYes
Поскольку переменной iResponse присвоено значение vbYes, то цикл Do выполнится по крайней мере один раз. При первом выполнении цикла переменная iCount принимает значение 1, при втором - 2 и т.д. Значение переменной iCount используется для задания нового размера массива sNames. Отметим, что массив изменяет свой размер без потери значений, которые уже в нем содержатся:
iCount = iCount + 1
ReDim Preserve sNames(iCount) As String
sNames(iCount) = InputBox("Введите имя")
Следующая группа операторов используется для того, чтобы узнать, сознательно ли пользователь щелкнул на кнопке Отмена, чтобы прекратить ввод имен, или случайно нажал клавишу <Enter>, не введя никакого значения:
If sNames(iCount) = " " Then
iResponse = MsgBox("Продолжим?", vbYesNo)
If iResponse = vbYes Then
sNames(iCount) = InputBox("Введите имя")
End If
End If
После завершения цикла Do выполняется цикл For для вывода последовательности окон сообщений с введенными ранее именами:
For i = 1 То iCount - 1
MsgBox i & "-e имя" & " - " & sNames(i)
Next
Количество повторений цикла For задается выражением i = 1 То iCount - 1. Необходимость вычитания единицы из значения переменной iCount возникла из-за того, что эта переменная изменяет свое значение в начале цикла Do еще до проверки условий, по которым заканчивается этот цикл. Если вы хотите посмотреть, что получится, если не вычитать единицу из переменной iCount, удалите -1 в операторе For и выполните процедуру сначала. В конце выполнения процедуры вы получите лишнее окно сообщения с обычным текстом вывода имен, но без самого имени.
Резюме
В этом часе мы изучили механизмы VBA для создания циклических вычислений (операторы циклов For и Do) и на примерах показали способы их применения. Мы также рассмотрели пример совместного использования динамических массивов и операторов цикла.