Циклы VBA, конструкция For...Next, конструкция For Each...Next, выход из цикла по Exit For, конструкции Do While и Do Until, выход из цикла по Exit Do, конструкция While...Wend
Циклы используются в ситуациях, когда нам нужно выполнить какое-либо действие несколько раз. Первая ситуация — мы знаем, сколько раз нужно выполнить какое-либо действие, в этом случае используется конструкция For…Next:
For iCounter = 1 to 10
MsgBox "Счетчик: " & iCounter
Next
Чтобы указать, насколько должно прирастать значение счетчика, используется ключевое слово Step:
For iCounter = 1 to 10 Step 2
MsgBox "Счетчик: " & iCounter
Next
Можно и уменьшать исходное значение счетчика:
For iCounter = 10 to 1 Step -2
MsgBox "Счетчик: " & iCounter
Next
Для безусловного выхода из конструкции For…Next используется команда Exit For.
VStop = InputBox (“Введите значение останова”)
VInput = CInt(VStop)
For iCounter = 1 to 10
MsgBox "Счетчик: " & iCounter
If iCounter =VInput Then Exit For
Next
Очень часто в VBA требуется сделать какое-нибудь действие со всеми элементам коллекции или массива — перебрать все открытые документы, все листы Excel, все ячейки в определенном диапазоне и т.п. Для того, чтобы пройти циклом по всем элементам коллекции, используется команда For Each … Next:
For Each oWbk in Workbooks
MsgBox oWbk.Name
Next
При использовании этого приема можно очень просто найти и получить ссылку на нужный нам объект:
For Each oWbk in Workbooks
If oWbk.Name = "Сводка.xls" Then
Set oMyWorkBook = oWbk
Exit For
End If
Next
В этом случае мы проходим циклом по всем элементам коллекции Workbooks (то есть открытым рабочим книгам в Excel), для каждой книги проверяем ее имя, и если мы нашли книгу с именем Сводка.xls, то мы получаем на нее ссылку и выходим из цикла. Коллекция рабочих книг — это специальная коллекция, которая умеет производить поиск в себе по имени элементов, поэтому в принципе можно было обойтись такой строкой:
Set oMyWorkBook = Workbooks("Сводка.xls")
Но для многих других коллекций без конструкции For Each не обойтись.
Еще одна ситуация — когда мы не знаем точно, сколько раз должна быть выполнена та или другая команда — это зависит от какого-либо условия. Используются конструкции Do While…Loop и Do Until…Loop.
Конструкция Do While означает: выполнять какое-либо действие до тех пор, пока условие истинно:
Do While MyVar < 10
MyVar = MyVar + 1
MsgBox “ MyVar = “ & MyVar
Loop
Применений на практике — множество: пройти по всему набору записей, пока они не закончатся, требовать от пользователя ввести подходящее значение, пока не он наконец не введет его и т.п.
Внимание! Если вы случайно запустили в своей программе бесконечный цикл, нажмите на клавиши <Ctrl>+<Break>. Откроется окно, аналогичное представленному на рис. 3.1, в котором вы сможете продолжить выполнение, завершить его или открыть ваш код в отладчике.
Рис. 3.1 Выполнение макроса остановлено по <Ctrl>+<Break>
Второй вариант — Do Until. Все выглядит точно так же, за одним исключением: цикл будет выполняться до тех пор, пока условие ложно.
Do Until MyVar >= 10
MyVar = MyVar + 1
MsgBox “ MyVar = “ & MyVar
Loop
Можно переписать цикл так, чтобы условие проверялось после завершения цикла:
Do
MyVar = MyVar + 1
WScript.Echo “MyVar = “ & MyVar
Loop While MyVar < 10
В этом случае цикл будет выполнен по крайней мере один раз.
Немедленный выход из цикла можно произвести по команде Exit Do.
В VBA имеется также конструкция While … Wend. Это — еще один вариант цикла, который оставлен для обратной совместимости с первыми версиями Visual Basic. Функциональные возможности — те же, что и у конструкции Do…While:
While My Var < 10
MyVar = MyVar + 1
WScript.Echo “MyVar = “ & MyVar
Wend