Перейти к содержимому

VBA Excel. Цикл Do Until… Loop

Цикл Do Until... Loop в VBA Excel, его синтаксис и описание отдельных компонентов. Примеры использования цикла Do Until... Loop.

Цикл Do Until... Loop в VBA Excel предназначен для повторения блока операторов пока не выполняется заданное условие (возвращается значение False). Синтаксис этого цикла аналогичен синтаксису цикла Do While... Loop, который повторяется до тех пор, пока условие выполняется (возвращается значение True).

  1. Синтаксис цикла Do Until... Loop
  2. Компоненты цикла Do Until... Loop
  3. Примеры циклов Do Until... Loop

Синтаксис цикла Do Until... Loop

Синтаксис цикла Do Until... Loop существует в двух вариантах, определяющих, когда проверяется условие.


Условие проверяется до выполнения операторов:

Do Until condition
    [ statements ]
    [ Exit Do ]
    [ statements ]
Loop

Условие проверяется после выполнения операторов:

Do
    [ statements ]
    [ Exit Do ]
    [ statements ]
Loop Until condition

В квадратных скобках указаны необязательные атрибуты цикла Do Until... Loop.

Компоненты цикла Do Until... Loop

Компонент Описание
condition Обязательный атрибут. Условие выполнения цикла. Выражение, возвращающее значение типа Boolean.
statements Необязательный* атрибут. Операторы вашего кода.
Exit Do Необязательный атрибут. Оператор выхода** из цикла до его окончания.

*Если не использовать в цикле свой код, смысл применения цикла теряется.

**Очень полезный оператор для цикла Do Until... Loop, так как при некоторых обстоятельствах он может стать бесконечным. Если такой риск существует, следует предусмотреть возможность выхода из бесконечного цикла с помощью оператора Exit Do.

Примеры циклов Do Until... Loop

Простейшие циклы

Цикл Do Until... Loop с условием до исполняемых операторов:

Sub test1()
Dim a As Byte
  Do Until a > 9
    a = a + 1
  Loop
MsgBox a
End Sub

Цикл Do Until... Loop с условием после исполняемых операторов:

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», и под ней, как минимум, одна строка должна быть пустой, точнее, первая ячейка этой строки.

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 и поэкспериментировать с кодом.

Бесконечный цикл и Exit Do

Пример бесконечного цикла:

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 начинает выполняться бесконечно. Мне приходилось останавливать бесконечные циклы в Excel 2000 и Excel 2016. В Excel 2000 помогло сочетание клавиш Ctrl+Break, а в Excel 2016 при закрытии редактора VBA крестиком появляется окно:

Информационное окно «Microsoft Excel не отвечает»
Информационное окно «Microsoft Excel не отвечает»

Ожидать отклика программы нет смысла, поэтому нажимаем «Перезапустить программу» или «Закрыть программу».

Совет: перед запуском процедуры с циклом Do Until... Loop, который может стать бесконечным, обязательно сохраните книгу, иначе, при принудительном закрытии редактора VBA ваши изменения будут утеряны. Кроме того, при принудительном закрытии редактора VBA, Excel может отключить макросы. Включите их в окне «Центр управления безопасностью», открыть которое можно по ссылке «Безопасность макросов» на ленте в разделе «Разработчик». Подробнее о включении макросов в разных версиях Excel читайте в статье: Как разрешить выполнение макросов в Excel?.

Пример использования оператора Exit Do:

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 из этого примера.

Добавить комментарий

Ваш комментарий будет опубликован после прохождения обязательной модерации. Исходящие ссылки не допускаются. Время модерации составит от нескольких минут до нескольких часов в зависимости от времени суток и занятости модератора.