RSS

Работа с циклами While и Until в VBA

В статье » Работа с циклом For в VBA» мы рассмотрели цикл, который работает по принципу счетчика т.е. выполняется от a до n, с определенным шагом. Такой цикл подходит в тех ситуациях, когда известен интервал(кол-во проходов). Но что делать если цикл должен выполнятся столько раз, пока не наступит определенная ситуация, или наоборот, пока не наступает определенная ситуация? Для этого в Visual Basic (и не только в БЕЙСИКе) существуют циклы с условием — условные циклы.

Что такое условные циклы?

Это циклы — работа которых продолжается или завершается по указанному условию. Запись условия аналогична записи условного оператора IF.
Условные циклы могут содержать одно или более условие, используя логические операторы: И(AND), ИЛИ(OR) и НЕ(NOT).

Условный цикл Do While.

Синтаксис записи условного цикла While выглядит следующим образом:
с предусловием
 Do [While условие]
    [действия]
Loop

с постусловием
Do
    [действия]
Loop [While условие]

Разница в этих двух записях в том, что во втором случае, цикл будет выполнен хотя бы раз. Для принудительной остановки цикла можно воспользоваться командой Exit Do. Цикл Do While будет выполнятся до тех пор, пока заданное условие не выполняется.
Рассмотрим пример, в котором происходит подсчет ячеек столбца A до тех пор, пока не встретится пустая ячейка.

Public Sub Test1()
Dim i As Integer
 i = 1
    Do While Not IsEmpty(Cells(i, 1))
        i = i + 1
    Loop
 MsgBox i — 1
End Sub

Функция IsEmpty определяет, пуста ли ячейка.

Запись с постусловием и добавлением еще одного условия «и пока ячейка не содержит 2«. Если в столбце встретится пустая ячейка или со значением 2, то произойдет остановка цикла, хотя последующие ячейки не пусты.

Public Sub Test2()
Dim i As Integer
 i = 1
    Do
        i = i + 1
    Loop While Not IsEmpty(Cells(i, 1)) And Cells(i, 1) <> 2
 MsgBox i — 1
End Sub

Условный цикл Do Until.

В VBA имеется еще один условный цикл Do Until…Loop. Отличие от Do While в том, что выполнение цикла будет до тех пор, пока условие выполняется.
Синтаксис записи цикла Do Until…Loop:

С предусловием
Do [Until условие]
    [действия]
Loop

 С постусловием
Do
    [действия]
Loop [Until условие]

Для принудительной остановки цикла так же используется команда Exit Do.

Рассмотрим реализацию примера выше, с помощью Do Until.

Public Sub Test3()
Dim i As Integer
 i = 1
    Do Until IsEmpty(Cells(i, 1))
        i = i + 1
    Loop
 MsgBox i — 1
End Sub

Как видите, в условии отсутствует Not.

Вот и все.

П.С.: При работе с условными циклами, будьте внимательны! Зацикливание (бесконечное выполнение) при неправильно заданном условии для этих циклов частое явление. В случае, если произошло зацикливание, воспользуйтесь сочетанием клавиш прерывания CTRL+Pause(Break). Рекомендую так же, перед запуском цикла сохранить проект.