В VBA существуют два основных типа циклов – циклы со счетчиком (параметрические) и циклы с условием (итерационные).
Циклы со счетчиком используют в тех случаях, когда необходимо выполнить некоторые действия определенное число раз.
Циклы с условием применяются тогда, когда некоторые действия в программе должны повторяться до тех пор, пока выполняется определенное условие.
Цикл - это группа операторов, которые многократно выполняются.
Для организации циклов в VBA, т. е. многократного выполнения одного или нескольких операторов, используются:
- циклы с перечислением For...Next;
- циклы с условием Do... Loop.
Существуют две разновидности For...Next:
- For…Next;
- For Each…Next.
Существуют два вида циклов Do...Loop, которые различаются типом проверяемого условия:
- Do While...Loop;
- Do Until ...Loop.
Цикл For…Next
Самым распространенным циклом в VBA является цикл с перечислением For…Next. Этому циклу необходимо задать границы (начальное и конечное значения счетчика) в пределах которых будет изменяться переменная цикла.
Оператор цикла имеет следующий синтаксис:
For счетчик = Начальное Значение (например, Например, For $n = 1$)
То Конечное Значение (То 10)
Step Приращение (Step 2)
[Инструкции] или [блок Операторов]
Next [счетчик]
Здесь переменная - это счетчик, значение переменной увеличивается или уменьшается с каждым повторением цикла. Если в конструкции цикла отсутствует Step, то приращение равно 1 (по умолчанию).
В случае если приращение отрицательно, то цикл начинает работу аналогично тому, как и при положительном и выполняет одно из двух действий˸
- в случае если значение счётчика меньше конечного значения, то выполняется выход из цикла;
- в случае если значение счётчика больше конечного значения или равно ему, то выполняются операторы цикла и счётчик уменьшается на значение приращения.
Необходимо вычислить значение функции$ у=sin(x)$ при $x=2,4,6,8,10$ и вывести на экран.
Решение:
$Dim \ x \ As \ Integer, y \ As \ Single$
$For \ x = 2 \ To \ 10 \ Step \ 2$
$y = Sin(x)$
$MsgBox \ Str(y)$
$Next \ x$
Для досрочного выхода из оператора цикла, т.е. до достижения счетчиком конечного значения, в конструкцию цикла нужно ввести оператор Exit For.
С учетом Exit For оператор цикла имеет следующий синтаксис:
$For \ счетчик = Начальное \ Значение$ (например, Например, $For \ n = 1$)
То Конечное Значение (То 10)
Step Приращение (Step 2)
[Инструкции] или [блок Операторов]
Exit For
Next [счетчик]
Цикл For Each … Next
Этот цикл похож на предыдущий, но в нём блок операторов повторяется не указанное число раз, а для каждого элемента массива или для каждого объекта семейства.
С помощью этого цикла можно перебирать все элементы массива или семейства, даже не зная, каково их число.
Оператор цикла имеет следующий синтаксис:
For Each элемент In группа Операторы Next [элемент]
Группа - это имя семейства объектов или массива. Важно заметить, что для семейства объектов элемент - это переменная, представляющая объект-член семейства. Перебор элементов выполняется быстрее, так как запоминается номер позиции элемента.
Следует помнить следующие ограничения при использовании цикла For Each . . . Next:
- для наборов параметр элемент может быть только переменной типа variant, общей переменной типа object или объектом, перечисленным в Object Browser;
- для массивов параметр элемент может быть только переменной типа Variant;
- нельзя использовать цикл For Each...Next с массивом, имеющим определенный пользователем тип, так как переменная типа variant не может содержать значение определенного пользователем типа.
Для обработки группы однородных объектов или массивов применяется следующая конструкция цикла:
For Each Элемент In Группа (имя группы однородных объектов)
[Инструкции] или [блок Операторов]
Exit For
Next элемент
Цикл с условием Do While...Loop
Цикл Do While … Loop – типичный цикл с предусловием. Выполняя этот цикл, VBA сначала проверяет условие. Если условие ложно (False), он пропускает все операторы цикла. Если оно истинно (True), VBA выполняет операторы цикла, снова возвращается к оператору Do While и снова проверяет условие.
Следовательно, цикл, представленный данной конструкцией, может выполняться любое число раз, пока значением условия является не нуль или True (Истина). Отметим, что операторы тела цикла не выполняются ни разу, если при первой проверке условия оно оказывается ложным (False).
Синтаксис операторов цикла Do While...Loop имеет следующий вид:
Do While условие (Например, $x
[Инструкции] или [блок Операторов]
Exit Do
Loop
Если нужно проверять условие после того, как инструкции или блок операторов будут выполнены хотя бы один раз, то можно применить следующую конструкцию оператора цикла:
Do
[Инструкции] или [блок Операторов]
Exit Do
Loop While условие
В конструкции Do … While для увеличения шага следует писать специальный оператор, т.к. в ней в отличие от конструкции For, не делается это автоматически.
Цикл с условием Do Until…Loop
Оператор Do Until…Loop выполняет циклы до тех пор, пока условие не соблюдается, а при соблюдении условия оператор выходит из цикла. Условие проверяется до того, как выполняется инструкция или группа операторов.
В этом случае синтаксис операторов цикла Do Until...Loop имеет следующий вид:
Do Until условие (Например, x=20)
[Инструкции] или [блок Операторов]
Exit Do
Loop
Если нужно проверять условие после того, как инструкции или блок операторов будут выполнены хотя бы один раз, то можно применить следующую конструкцию оператора цикла:
Do
[Инструкции] или [блок Операторов]
Exit Do
Loop Until условие