Такую программу трудно читать, отлаживать и модифицировать.
4.3. Операторы цикла
Циклы позволяют многократно выполнять отдельный оператор или группу операторов. Операторы цикла VBA делятся на три группы:
1.Циклы со счетчиком (For.. .Next);
2.Циклы с условием (DO. . .Loop);
3.Циклы по структуре данных (For Each. . .Next).
Оператор For...Next
Данный оператор позволяет выполнять группу операторов (которая называется телом цикла) заранее определенное количество раз, при этом параметр цикла последовательно принимает ряд значений, определенный пользователем в заголовке цикла.
For счетчик = начало То конец [Step шаг] [блокОператоров1]
[Exit For]
[блокОператоров2] Next [счетчик]
Счетчик - это и есть тот числовой параметр цикла, который должен принимать ряд значений от значения начало до значения конец. Причем этот ряд может образовывать как возрастающую, так и убывающую арифметическую прогрессию. Необязательный параметр шаг указывает, с каким шагом следует пробегать заданный ряд значений (по умолчанию шаг равен 1).
блокОператоров1 и блокОператоров2 - это блоки операторов, которые выполняются, пока счетчик не пробежит ряд значений до конца. Прервать же данный пробег вправе только оператор Exit For, предназначенный для выхода из цикла не дожидаясь его завершения и передачи управления оператору,
68
следующему непосредственно за Next. Как правило, оператор используется в тех местах тела цикла, где требуется из него выйти по условию.
Вконце цикла ставится заключительный оператор Next, после которого указывается счетчик цикла. Хотя данное "указывание" необязательно, мы рекомендуем всегда его использовать, поскольку программа станет более понятной, особенно в случае большого количества вложенных циклов.
Строка, которая начинается ключевым словом For, называется заголовком цикла, а все, что находится между заголовком цикла и ключевым словом Next, - это тело цикла.
Итак, рассмотрим работу конструкции цикл со счетчиком
вцелом. Оператор For инициализирует переменную счетчик значением начало, после этого выполняется тело цикла, пока не встретится оператор Exit For (выход) или оператор Next (следующий). Далее оператор Next проверяет, не достигнуто ли значение конец - если нет, то прибавляется значение шага к счетчику и процедура повторяется, если да - работа оператора цикла завершается.
Влистинге мы рассмотрим три примера работы с циклом For.. .Next В первом примере мы запрограммировали решение задачи о вычислении' факториала числа 20 (20!=1х2хЗх...х20), причем значение счетчика явно используется в вычислениях. После чего вывели итоговый результат (около 2,432Е+18).
Во втором примере мы показываем, что помимо простых конструкций с циклами существуют более сложные - вложенные циклы. Характерным примером для вложенных циклов является инициализация матрицы (nхm). Мы проинициализировали все элементы матрицы (6x5) единицей.
Впоследнем примере мы продемонстрируем работу оператора Exit For и счетчика с отрицательным шагом. Допустим, у нас есть проинициализированный массив типа string. Необходимо найти элемент данного массива, равный строке "выход", причем проверка будет происходить с конца массива.
69
Листинг. Использование оператора For. . .Next Sub factorial()
Dim factorial As Variant: factorial = 1 For i = 1 To 20
factorial = factorial * i Next MsgBox(factorial) End Sub
Sub InitMatrix()
Dim matrix(5, 4) As Integer Dim i As Integer, j As Integer For i = 0 To 5
For j = 0 To 4 matrix (i, j) = 1 Next j
Next i End Sub
Sub VectorSearch() Dim Vector(7) As String 'Инициализация
For i = 7 To 0 Step -1
If Vector(i) = "Выход" Then MsgBox("i = " & i)
Exit For
End If
Next i End Sub
Оператор Do..Loop
Допустим, вы не знаете заранее, сколько раз должно выполниться тело цикла, как в случае с оператором For.. .Next, но знаете условие, при котором цикл должен продолжать или прекращать свою работу. В таком случае и следует употреблять циклы с условием. - оператор цикла DO ... Loop. Сущест-
70
вует два вида циклов с условием: с предусловием и с постусловием, соответственно и цикл DO ... Loop имеет две синтаксические конструкции, суть различия которых - во времени проверки условия.
Предусловие:
Do [{While | Until} условие] [блокОператоров1]
[Exit Do]
[блокОператоров2]
Loop
Постусловие:
Do
[блокОператоров1]
[Exit Do]
[блокОператоров2]
Loop [{While | until} условие]
Теперь о проверке условий. Если в конструкции стоит ключевое слово while, то блок операторов будет выполняться пока условие остается истинным, если же стоит until, то блок операторов будет выполняться пока условие остается ложным.
Вообще, исходя из синтаксиса, наличие условия не обязательно. Если его нет, то по умолчанию оно трактуется как False. Необязательный оператор Exit DO аналогичен оператору Exit For в цикле For.. .Next. Он также прекращает выполнение цикла и передает управление на оператор, следующий непосредственно за Loop.
Давайте на приведенном выше примере рассмотрим работу цикла с условием.
Наше условие выглядит так: "сумма > 5000", причем это условие выхода из нашего цикла, т. к. мы найдем искомое число элементов массива. Следовательно, вначале мы должны вычислить сумму (блокОператоров), а потом проверить, не
71
больше ли она 5000 (until sum > 5000). Помимо этого надо следить за тем, чтобы проверялись только допустимые элементы массива, для чего мы использовали оператор if.
Во втором примере мы решили ту же самую задачу, но несколько другим способом. Мы запустили, вообще говоря, бесконечный цикл, поскольку условие (while l) всегда истинно. Выходом же из цикла является выполнение условия sum >
5000.
Листинг. Использование оператора Do... Loop Sub exl()
Dim shops(1 То 25) As Integer, sum As Integer 'Инициализация 'Первый способ
i = 0 sum = 0 Do
If i = 25 Then Exit Do
End If i = i + 1
sum = sum + shops(i) Loop Until sum>5000 MsgBox i
'Второй способ i = 0
sum = 0 Do While 1
If i = 25 Then Exit Do i = i + 1
sum = sum + shops(i)
If sum > 5000 Then Exit Do Loop
MsgBox i
End Sub
72