Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Макросы.doc
Скачиваний:
26
Добавлен:
21.11.2018
Размер:
16.91 Mб
Скачать

Оператор Do... Loop

Для выполнения оператора 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 выполните следующие действия.

  1. Вставьте в текущий модуль новую процедуру и назовите ее ВводИмени. В этой процедуре пользователю предлагается ввести свое имя или выйти из программы.

  2. Введите код процедуры:

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 (Ложь).

  1. Выполните процедуру.

  2. В окне ввода щелкните на кнопке Отмена или, не вводя значения, нажмите клавишу <Enter>. Появится окно сообщения, спрашивающее, хотите ли вы выйти из программы.

  3. Щелкните на кнопке Нет. Окно ввода появится снова. Введите свое имя и нажмите клавишу <Enter>. Процедура закончится.

В 4-м часе "Переменные и константы" мы познакомились с массивами, а также с такой их разновидностью, как динамические массивы. Динамические массивы позволяют изменять свои размеры во время выполнения программы. Их часто используют совместно с оператором Do... Loop, как показано в следующем примере.

  1. Вставьте новую процедуру с именем СписокИмен. Эта процедура предназначена для ввода списка имен (количество имен заранее не известно), которые записываются в динамический массив.

  2. Код процедуры СписокИмен следующий:

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

  1. Выполните процедуру. Первое окно ввода показано на рис. 7.3.

  2. Введите три имени, нажимая после ввода каждого клавишу <Enter>.

  3. Щелкните на кнопке Отмена. Появится окно сообщения с вопросом "Продолжим?".

  4. Щелкните на кнопке Нет. Появится новое окно сообщения с первым введенным именем.

  5. Щелкните на кнопке ОК. Отобразится следующее окно сообщения со вторым введенным именем.

  6. Щелкните на кнопке ОК. Отобразится окно сообщения с третьим введенным именем.

  7. Щелкните на кнопке ОК. Выполнение процедуры закончится.

Рис. 7.3. Первое окно ввода.

Полный код процедуры СписокИмен приведен в листинге 7.1.

Листинг 7.1. Процедура СписокИмен

1: Public Sub СписокИмен()

2:  Dim iCount As Integer

3:  Dim sNames() As String

4:  Dim iResponse As Integer

5:  Dim i As Integer

6:

7:  iResponse = vbYes

8:

9:  Do While iResponse = vbYes

10:   iCount = iCount + 1

11:   ReDim Preserve sNames(iCount) As String

12:    sNames(iCount) = InputBox("Введите имя")

13:   If sNames(iCount) = " " Then

14:    iResponse = MsgBox("Продолжим?", vbYesNo)

15:    If iResponse = vbYes Then

16:     sNames(iCount) = InputBox("Введите имя")

17:    End If

18:   End If

19:  Loop

20:

21:  For i = 1 To iCount - 1

22:   MsgBox i & "-e имя" & " - " & sNames(i)

23:  Next

24: End Sub

Прежде всего обратите внимание в этом листинге на объявление переменных:

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) и на примерах показали способы их применения. Мы также рассмотрели пример совместного использования динамических массивов и операторов цикла.