Цикл Do Until… Loop в VBA Excel, его синтаксис и описание отдельных компонентов. Примеры использования цикла Do Until… Loop.
Цикл Do Until… Loop в VBA Excel предназначен для повторения блока операторов пока не выполняется заданное условие (возвращается значение False). Синтаксис этого цикла аналогичен синтаксису цикла Do While… Loop, который повторяется до тех пор, пока условие выполняется (возвращается значение True).
Синтаксис цикла Do Until… Loop
Синтаксис цикла Do Until… Loop существует в двух вариантах, определяющих, когда проверяется условие.
Условие проверяется до выполнения операторов:
1 2 3 4 5 |
Do Until condition [ statements ] [ Exit Do ] [ statements ] Loop |
Условие проверяется после выполнения операторов:
1 2 3 4 5 |
Do [ statements ] [ Exit Do ] [ statements ] Loop Until condition |
В квадратных скобках указаны необязательные атрибуты цикла Do Until… Loop.
Компоненты цикла Do Until… Loop
Компонент | Описание |
---|---|
condition | Обязательный атрибут. Условие выполнения цикла. Выражение, возвращающее значение типа Boolean. |
statements | Необязательный* атрибут. Операторы вашего кода. |
Exit Do | Необязательный атрибут. Оператор выхода** из цикла до его окончания. |
*Если не использовать в цикле свой код VBA, смысл применения цикла теряется.
**Очень полезный оператор для цикла Do Until… Loop, так как при некоторых обстоятельствах он может стать бесконечным. Если такой риск существует, следует предусмотреть возможность выхода из бесконечного цикла с помощью оператора Exit Do.
Примеры циклов Do Until… Loop
Простейшие циклы
Цикл Do Until… Loop с условием до исполняемых операторов:
1 2 3 4 5 6 7 |
Sub test1() Dim a As Byte Do Until a > 9 a = a + 1 Loop MsgBox a End Sub |
Цикл Do Until… Loop с условием после исполняемых операторов:
1 2 3 4 5 6 7 |
Sub test2() Dim a As Byte Do a = a + 1 Loop Until a > 9 MsgBox a End Sub |
В обоих случаях окно MsgBox выведет число 10. Когда значение переменной a будет равно 10, проверяемое условие выдаст значение True, и цикл будет остановлен.
Проход по строкам листа
У двух белок дупла расположены напротив друг друга. В каждом дупле по 100 шишек. В свободное время они бросают шишки в дупло напротив, попадают не всегда. Ниже, в таблице, указано количество шишек, брошенных каждой белкой, и сколько их попало в цель.
Дни | Игрок | Брошено | Попало в цель |
---|---|---|---|
1 день | Белка 1 | 15 | 6 |
1 день | Белка 2 | 12 | 7 |
2 день | Белка 1 | 14 | 8 |
2 день | Белка 2 | 16 | 7 |
3 день | Белка 1 | 20 | 9 |
3 день | Белка 2 | 14 | 6 |
4 день | Белка 1 | 26 | 10 |
4 день | Белка 2 | 13 | 5 |
5 день | Белка 1 | 17 | 4 |
5 день | Белка 2 | 21 | 7 |
Исходя из этих данных необходимо узнать, сколько шишек осталось у Белки 1 в дупле. Для этого необходимо вычесть из 100 шишек количество выброшенных Белкой 1 и прибавить шишки, заброшенные в ее дупло Белкой 2. Вычисления начинаем со второй строки (в первой заголовки) и в условии для цикла Do Until… Loop указываем «первая ячейка текущей строки является пустой». Таблица должна начинаться с первой ячейки рабочего листа «A1», и под ней, как минимум, одна строка должна быть пустой, точнее, первая ячейка этой строки.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
Sub test3() Dim i As Long, n As Long i = 2 n = 100 Do Until Cells(i, 1) = "" If Cells(i, 2) = "Белка 1" Then n = n - Cells(i, 3) Else n = n + Cells(i, 4) End If i = i + 1 Loop MsgBox n End Sub |
Результат, выведенный в информационном сообщении, будет равен 40. Вы можете скопировать таблицу на свой лист книги Excel и поэкспериментировать с кодом VBA.
Бесконечный цикл и Exit Do
Пример бесконечного цикла:
1 2 3 4 5 6 7 8 9 |
Sub test4() Dim a As Byte Do Until a > 10 a = a + 1 If a = 10 Then a = 0 End If Loop End Sub |
При запуске этой процедуры цикл Do Until… Loop начинает выполняться бесконечно. Мне приходилось останавливать бесконечные циклы VBA в Excel 2000 и Excel 2016. В Excel 2000 помогло сочетание клавиш Ctrl+Break, а в Excel 2016 при закрытии редактора VBA крестиком появляется окно:
Ожидать отклика программы нет смысла, поэтому нажимаем «Перезапустить программу» или «Закрыть программу».
Совет: перед запуском процедуры с циклом Do Until… Loop, который может стать бесконечным, обязательно сохраните книгу, иначе, при принудительном закрытии редактора VBA ваши изменения будут утеряны. Кроме того, при принудительном закрытии редактора VBA, Excel может отключить макросы. Включите их в окне «Центр управления безопасностью», открыть которое можно по ссылке «Безопасность макросов» на ленте в разделе «Разработчик». Подробнее о включении макросов в разных версиях Excel читайте в статье: Как разрешить выполнение макросов в Excel?.
Пример использования оператора Exit Do:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
Sub test5() Dim a As Byte, n As Long Do Until a > 10 a = a + 1 n = n + 1 If a = 10 Then a = 0 End If If n = 1000 Then Exit Do End If Loop MsgBox n End Sub |
Когда число итераций цикла дойдет до 1000, он будет завершен, и информационное сообщение MsgBox выведет на экран число повторений цикла Do Until… Loop из этого примера.