Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование на BASIC / Visual Basic / Учебно-методическое пособие по изучению Visual Basic for Applications (VBA).doc
Скачиваний:
227
Добавлен:
02.05.2014
Размер:
1.55 Mб
Скачать

I Statements

В операторе Do While выражение Condition находится в начале цикла, поэтому VBA проверяет условие детерминанта до выполнения цикла. Поскольку в этой форме используется ключевое слово While, VBA выполняет цикл, пока логическое выражение, представленное с помощью Condition, равно True.

При выполнении цикла Do While VBA сначала тестирует логическое выражение, представленное с помощью Condition; если оно равно True, VBA выполняет операторы, представленные с помощью Statements. При достижении ключевого слова Loop VBA возвращается в начало цикла и снова проверяет, равно ли True логическое выражение Condition. Если Condition равно True, VBA выполняет цикл снова; если выражение Condition равно False, VBA прерывает цикл и продолжает выполнение кода с любых операторов после ключевого слова Loop.

Заметьте, что если логическое выражение, представленное с помощью Condition, равно False, когда VBA выполняет оператор Do While в первый раз, VBA просто пропускает цикл, не выполняя его ни одного раза. Т.е. цикл Do While позволяет ни разу не выполнять операторы внутри него.

Задание 2. Напишите процедуру, суммирующую нечетные числа до тех пор, пока их сумма не превысит заданное число.

Для этого:

^введите процедуру (листинг 15):

Листинг 15 - Демонстрация цикла Do While

1 Sub List5 15 ()

  1. Const ocTitle = "Сумматор нечетных чисел"

  2. Dim S As Integer 'сумма нечетных чисел

  3. Dim S Str As String 'строка с нечетными числами

5 Dim a As Variant 'для приема данных пользователя 5 Dim b As Variant 'предел суммы нечетных чисел

6

  1. b = InputBox("Введите максимальную сумму:", ocTitle)

  2. If Len(b) = 0 Then MsgBox "Вы нажали кнопку Cancel" : Exit Sub

  3. S Str = "".'инициализация выходной строки

  4. S _ = 0 'инициализация суммы S

  5. Do While S < b 'начало цикла

  1. a = InputBox("Введите число:", ocTitle)

  2. if Len(a)=0 Then MsgBox "Вы нажали кнопку Cancel" : Exit Do

  3. If (a Mod 2) <> 0 Then ' проверка на четность

15 S = S + a ' изменение суммы S

83

16 S_Str = S_Str & a & " "

17 End If

  1. Loop

  2. MsgBox Prompt:="Вы ввели следующие нечетные числа: " & _

20 Chr(13) & S_Str & Chr(13) & "Их сумма равна " & S, Title:=ocTitle

21 End Sub

Процедура Sub List5_15 () демонстрирует использование цикла Do While. Цикл в процедуре выполняется, пока сумма введенных пользователем нечетных чисел (нечетное (odd) число – это число, которое нельзя разделить на 2 без остатка) меньше b. B окне ввода можно использовать все (две) кнопки, так как операторы в строках 8 и 13 проверяют, не была ли нажата кнопка Cancel, и в первом случае (строка 8) прекращают выполнение процедуры, а во втором (строка 13) – цикла Do While.

Во всяком случае, если вы пишете тестовый код не для себя, следует учитывать даже такие мелочи. Иначе пользователей ваших тестов будут больше занимать проблемы неработоспособности кода, чем его алгоритмическая сущность.

Можно также использовать форму Do Until оператора Do для создания цикла, тестирующего условие детерминанта до выполнения тела цикла. Оператор Do Until имеет следующий синтаксис:

Do Until Condition

Statements

[Exit Do] Loop

Condition – логическое выражение для детерминанта цикла, a Statements – это операторы VBA, составляющие тело цикла. Ключевое слово Loop после Statements указывает на конец тела цикла и также обозначает место, из которого VBA возвращается в начало цикла для проверки условия детерминанта (см. блок-схему оператора Do While). VBA тестирует условие детерминанта цикла Do Until до выполнения операторов цикла. Поскольку эта форма включает ключевое слово Until, VBA выполняет цикл пока логическое выражение, представленное выражением Condition, равно значению False. При выполнении цикла Do Until VBA сначала тестирует логическое выражение, представленное с помощью Condition; если оно равно False, VBA выполняет операторы, представленные с помощью Statements. После достижения ключевого слова Loop VBA возвращается в начало цикла и снова проверяет, равно ли логическое выражение Condition значению False. Если Condition равно False, VBA выполняет цикл снова; если же оно равно True, VBA прерывает цикл и продолжает выполнение кода с операторов после ключевого слова Loop.

Если Condition равно True, когда VBA встречает оператор Do Until в первый раз, VBA пропускает цикл без его выполнения. Т.е. цикл Do Until позволяет ни разу не выполнять операторы внутри него.

84

Упражнение 2

Напишите процедуру с использованием цикла Do Until, суммирующую четные числа до тех пор, пока их сумма не превысит заданное число.

Использование циклов, тестирующих условия после выполнения тела цикла

Для VBA-тестирования условий после выполнения тела цикла необходимо поместить логическое выражение для детерминанта цикла в конец блока операторов, составляющих тело цикла, после ключевого слова Loop, которое сообщает о конце цикла. Первая рассматриваемая конструкция цикла, тестирующая условие детерминанта после выполнения тела цикла, - это DoLoop While. Оператор Do…Loop While имеет следующий синтаксис:

Do

Statements

[Exit Do] Loop While Condition

Statements - один, ни одного или несколько операторов VBA, составляющих тело цикла. Ключевое слово Loop после Statements обозначает конец тела цикла и также указывает место, из которого VBA возвращается в начало цикла; Condition представляет логическое выражение для детерминанта цикла (см. диаграмму ниже). В этой форме синтаксиса оператора DoLoop While VBA проверяет условие детерминанта после выполнения операторов цикла. Поскольку эта форма оператора Do использует ключевое слово While, VBA выполняет цикл, пока логическое выражение, представленное с помощью Condition, равно True (оператор Exit Do досрочно завершает цикл Do While). При выполнении оператора DoLoop While VBA сначала выполняет операторы, представленные с помощью Statements. Когда VBA достигает ключевых слов Loop While, выполняется тестирование логического выражения, представленного с помощью Condition; если это выражение равно True, VBA возвращается в начало цикла и снова выполняет тело цикла. Когда VBA снова достигает ключевых слов Loop While в конце цикла, снова выполняется проверка, является ли логическое выражение Condition все еще равным True. Если Condition равно True, VBA выполняет цикл снова; если - нет, VBA продолжает выполнение кода с любых операторов после строки, содержащей ключевое слово Loop, т.е. прекращает работу цикла.

Statements

Counter

Заметьте, что независимо от значения логического выражения,

85

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

Задание 3. Напишите процедуру с использованием цикла Do…Loop While, которая неоднократно получает число от пользователя, прекращаясь, когда пользователь вводит четное число больше 10.

Для этого:

ь введите процедуру (листинг 16):

Листинг 16 – Демонстрация цикла Do…Loop While

1 Sub List5_16 ()

  1. Const evTitle = "Остановка при четном, большем десяти"

  2. Dim EvenFlag As Boolean

  3. Dim a As Variant 'для приема данных пользователя 5

  1. EvenFlag = True

  2. Do

  1. a = InputBox("Введите число:", evTitle)

  2. If Len(a) = 0 Then Exit Do

  3. If a Mod 2 = 0 Then

11 If a > 10 Then

12 MsgBox prompt:="Вы ввели четное число, большее, чем 10" & _

13 " - Цикл заканчивается", Title:=evTitle

14 EvenFlag = False

15 Else

16 MsgBox Prompt:="Вы ввели четное число, меньшее " _

17 & "(или равное), чем 10", Title:=evTitle

18 End If

19 Else

20 MsgBox Prompt:="Bы ввели нечетное число", Title:=evTitle

21 End If

  1. Loop While EvenFlag

  2. MsgBox Prompt:="Выполнение цикла прекращено", Title:=evTitle

24 End Sub

Процедура List5_16 () показывает, как построить цикл Do…Loop While. Цикл в этой процедуре демонстрирует управляемый условием цикл и выполняется до тех пор, пока пользователь не введет четное число, большее 10. На самом деле этим условием является получение значения False переменной EvenFlag, что происходит (в строке 14), когда код обнаруживает с помощью вложенных операторов If (в строках 10–11) факт введения пользователем четного числа, большего 10. Перед выполнением цикла переменной EvenFlag присваивается значение True. Внутри цикла организуется прием числа, и анализ его на предмет четности и превышения 10. Если эти последние проверки дают положительный результат, выводится сообщение (строки 12–13) об окончании цикла и переменная EvenFlag получает значение False, что приводит к окончанию цикла.

86

В строке 9 находится оператор, предупреждающий возникновение runtime-ошибок при работе с программой пользователей, склонных к экспериментам.

Для построения Do-цикла, тестирующего свое условие детерминанта после выполнения тела цикла можно также использовать форму Do…Loop Until оператора Do. Оператор Do…Loop Until имеет следующий синтаксис:

Do

Statements

[Exit Do] Loop Until Condition

Statements представляет операторы VBA, составляющие тело цикла; Condition – логическое выражение для детерминанта цикла (см. блок-схему оператора Do…Loop Until). VBA проверяет условие детерминанта цикла Do…Loop Until после выполнения тела цикла. Поскольку эта форма Do-оператора использует ключевое слово Until, VBA выполняет цикл, пока логическое выражение, представленное с помощью Condition, равно False. При выполнении оператора Do...Loop Until VBA сначала выполняет операторы, представленные с помощью Statements. Когда VBA достигает ключевого слова Loop, выполняется тестирование логического выражения, представленного с помощью Condition; если логическое выражение равно False, VBA возвращается в начало цикла и снова выполняет тело цикла. Когда VBA снова достигает ключевого слова Loop в конце цикла, снова выполняется проверка, является ли логическое выражение Condition равным False. Если Condition равно False, VBA выполняет цикл снова; если оно равно True, VBA продолжает выполнение кода с любых операторов после строки, содержащей ключевое слово Loop, т.е. прекращает работу цикла.

Заметьте, что этот цикл всегда выполняется, по крайней мере, один раз, независимо от значения логического выражения, представленного с помощью Condition.

Упражнение 3

Напишите процедуру с использованием цикла Do…Loop Until, которая неоднократно получает число от пользователя, прекращаясь, когда пользователь вводит нечетное число меньшее 10.

Вложенные циклы

Можно помещать циклы внутрь других циклов, аналогично тому, как можно помещать операторы If…Then один в другой. Помещение одной структуры цикла в другую называют вложением (nesting) циклов. Можно помещать структуры циклов любого типа (смешанные For и Do циклы) в любой уровень.

При вложении циклов необходимо соблюдать следующие правила:

ь при вложении циклов For…Next каждый цикл должен иметь свою уникальную переменную счетчика;

ь если вы используете оператор Exit For или Exit Do во вложенном цикле, этим оператором заканчивается только выполняемый в данный момент цикл; VBA продолжает выполнение следующего цикла более высокого уровня.

87

Соседние файлы в папке Visual Basic