Для выполнения оператора For необходимо задать параметры (эти параметры могут вычисляться или задаваться во время выполнения программы, как в последней процедуре), которые точно определяют, сколько раз должен выполняться оператор цикла. Иногда это свойство оператора For является ограничительным, и в этом случае VBA предлагает другой оператор - Do... Loop, который также может организовать повторяющиеся вычисления, но момент прекращения вычислений здесь определяется с помощью логических условий. Существует два типа операторов Do: Do While и Do Until. Первый из них повторяет выполнение блока операторов до тех пор, пока заданное логическое условие истинно. Второй оператор, Do Until, выполняет циклические вычисления до тех пор, пока изначально ложное логическое условие не станет истинным. Синтаксис этих операторов следующий.
Синтаксис 1:
Do [{While | Until} условие]
[операторы]
[Exit Do]
[операторы]
Loop
Синтаксис 2:
Do
[операторы]
[Exit Do]
[операторы]
Loop [{While | Until} условие]
Различие между этими двумя синтаксисами весьма тонкое. В соответствии с синтаксисом 1 логическое условие помещается в начало цикла. В этом случае, если логическое условие не выполняется, то операторы цикла не выполняются ни разу. Во втором синтаксисе логическое условие помещено в конце цикла. Поэтому операторы цикла в любом случае будут выполнены хотя бы один раз. Оператор Exit Do используется для экстренного выхода из цикла, обычно для этого применяются условные операторы If и Select Case.
Для создания процедуры с использованием оператора Do выполните следующие действия.
Вставьте в текущий модуль новую процедуру и назовите ее ВводИмени. В этой процедуре пользователю предлагается ввести свое имя или выйти из программы.
Введите код процедуры:
Dim sName As String
Dim iResponse As Integer
sName = “”
Do While sName = “”
sName = InputBox(“Введите свое имя: “)
If sName = “” Then
iResponse = MsgBox (“Вы хотите выйти из программы?”, vbYesNo)
If iResponse = vbYes Then
Exit Do
End If
End If
Loop
Как вы помните, при щелчке на кнопке Отмена функция InputBox возвращает пустую строку, а метод Application.InputBox - значение False (Ложь).
Выполните процедуру.
В окне ввода щелкните на кнопке Отмена или, не вводя значения, нажмите клавишу <Enter>. Появится окно сообщения, спрашивающее, хотите ли вы выйти из программы.
Щелкните на кнопке Нет. Окно ввода появится снова. Введите свое имя и нажмите клавишу <Enter>. Процедура закончится.
В 4-м часе "Переменные и константы" мы познакомились с массивами, а также с такой их разновидностью, как динамические массивы. Динамические массивы позволяют изменять свои размеры во время выполнения программы. Их часто используют совместно с оператором Do... Loop, как показано в следующем примере.
Вставьте новую процедуру с именем СписокИмен. Эта процедура предназначена для ввода списка имен (количество имен заранее не известно), которые записываются в динамический массив.
Код процедуры СписокИмен следующий:
Dim iCount As Integer
Dim sNames() As String
Dim iResponse As Integer
Dim i As Integer
iResponse = vbYes
Do While iResponse = vbYes
iCount = iCount + 1
ReDim Preserve sNames(iCount) As String
sNames(iCount) = InputBox("Введите имя")
If sNames(iCount) = "" Then
iResponse = MsgBox("Продолжить?", vbYesNo)
If iResponse = vbYes Then
sNames(iCount)= InputBox ("Введите имя")
End If
End If
Loop
For i = 1 To iCount - 1
MsgBox i & "-e имя "&" - "& sNames(i)
Next
Выполните процедуру. Первое окно ввода показано на рис. 7.3.
Введите три имени, нажимая после ввода каждого клавишу <Enter>.
Щелкните на кнопке Отмена. Появится окно сообщения с вопросом "Продолжим?".
Щелкните на кнопке Нет. Появится новое окно сообщения с первым введенным именем.
Щелкните на кнопке ОК. Отобразится следующее окно сообщения со вторым введенным именем.
Щелкните на кнопке ОК. Отобразится окно сообщения с третьим введенным именем.
Щелкните на кнопке ОК. Выполнение процедуры закончится.
Рис. 7.3. Первое окно ввода.
Полный код процедуры СписокИмен приведен в листинге 7.1.