Найти в Дзене
Макрос решает

Введение в цикл Do...Loop в VBA: когда «делай, пока не скажут стоп»

В мире VBA есть несколько основных типов циклов, каждый из которых применяется в зависимости от цели и структуры данных. Мы уже рассматривали For, For Each — теперь пришло время познакомиться с третьим мощным инструментом: циклом Do...Loop. Этот цикл — как свободный художник: ему не важны заранее известные рамки. Он просто выполняет свою задачу до тех пор, пока вы не скажете: «Стоп». Такой подход даёт гибкость, но и требует особого внимания — особенно если не хотите попасть в бесконечный цикл. Цикл Do...Loop выполняет блок кода повторно, пока выполняется или не выполняется заданное условие. Главное отличие от других циклов — отсутствие жёстко определённой начальной и конечной точки. Простейшая структура выглядит так: Do
[операции]
Loop В этом варианте цикл просто делает то, что в нём указано. Он будет выполнять блок бесконечно, если вы сами не добавите условие выхода. Это может быть опасно, но и очень гибко. Создадим макрос, который с помощью Do...Loop закрашивает ячейки в столб
Оглавление

В мире VBA есть несколько основных типов циклов, каждый из которых применяется в зависимости от цели и структуры данных. Мы уже рассматривали For, For Each — теперь пришло время познакомиться с третьим мощным инструментом: циклом Do...Loop.

Этот цикл — как свободный художник: ему не важны заранее известные рамки. Он просто выполняет свою задачу до тех пор, пока вы не скажете: «Стоп». Такой подход даёт гибкость, но и требует особого внимания — особенно если не хотите попасть в бесконечный цикл.

1. Что такое Do...Loop и в чём его особенность?

Цикл Do...Loop выполняет блок кода повторно, пока выполняется или не выполняется заданное условие. Главное отличие от других циклов — отсутствие жёстко определённой начальной и конечной точки.

Простейшая структура выглядит так:

Do

[операции]

Loop

В этом варианте цикл просто делает то, что в нём указано. Он будет выполнять блок бесконечно, если вы сами не добавите условие выхода. Это может быть опасно, но и очень гибко.

2. Первый пример: закрашиваем ячейки в столбце A

Создадим макрос, который с помощью Do...Loop закрашивает ячейки в столбце A — начиная с ячейки A2 и до тех пор, пока в очередной ячейке есть значение.

Откройте редактор VBA (ALT + F11), вставьте новый модуль и создайте следующую процедуру:

Sub MyDoLoop1()

Dim x As Integer

x = 2

Do While Cells(x, 1).Value <> ""

Cells(x, 1).Interior.Color = vbYellow

x = x + 1

Loop

End Sub

Что здесь происходит:

  • Мы начинаем с 2-й строки.
  • Проверяем: если в ячейке A2 есть значение, закрашиваем её жёлтым.
  • Увеличиваем переменную x, переходим к A3 и повторяем.
  • Цикл останавливается, когда дойдёт до пустой ячейки.

⚠️ Обратите внимание: если забыть про условие выхода, цикл уйдёт в бесконечность. Поэтому всегда продумывайте логическое завершение.

3. А если в таблице заранее неизвестно, сколько строк?

Вот тут Do...Loop раскрывается особенно ярко. Например, вы не знаете заранее, где заканчивается список клиентов или задач. А с For такое не пройдёт — ему нужно чёткое количество шагов. В таких случаях цикл Do While с условием — незаменим.

Немного усложним:

Sub MyDoLoop2()

Dim x As Integer

x = 2
Do Until IsEmpty(Cells(x, 1))

Cells(x, 2).Value = "Обработано"

x = x + 1

Loop

End Sub

Теперь цикл не только идёт по строкам, пока не найдёт пустую ячейку, но и добавляет пометку "Обработано" во второй столбец.

4. Структура Do...Loop в разных вариантах

Чтобы было проще ориентироваться, вот 4 основных варианта написания конструкции:

  1. Do While [условие]...Loop
  2. Do Until [условие]...Loop
  3. Do...Loop While [условие]
  4. Do...Loop Until [условие]

Примеры использования 3-го и 4-го вариантов:

Sub MyDoLoop3()

Dim x As Integer

x = 2

Do
Cells(x, 1).Interior.Color = vbGreen

x = x + 1

Loop Until Cells(x, 1).Value = ""

End Sub

*

Здесь сначала выполняется действие, а потом уже проверяется условие — хотя в некоторых ситуациях это может привести к тому, что цикл выполнится минимум один раз даже при пустой начальной ячейке. Будьте внимательны.

✍️ Сделаем паузу…

Если вы только начинаете погружение в VBA или хотите закрепить работу с циклами на практике — поставьте лайк этой статье и подпишитесь на канал, чтобы не пропустить следующие разборы. Особенно полезно будет тем, кто хочет уверенно работать с табличными отчётами и автоматизацией задач в Excel.

А теперь — продолжим с интересным примером.

5. Построчная проверка данных с флагом выхода

Предположим, у вас в столбце B стоит флажок “СТОП”, и как только вы его встретили — цикл должен остановиться. Это ещё один пример гибкости Do...Loop.


Sub MyDoLoop4()

Dim x As Integer

x = 2

Do

Cells(x, 1).Interior.Color = vbCyan

If Cells(x, 2).Value = "СТОП" Then Exit Do

x = x + 1

Loop
End Sub

Здесь мы не используем явного логического условия в Do Until — но внутри цикла задаём точку выхода через Exit Do, если выполняется условие.

Такой подход хорош для сценариев с непредсказуемыми триггерами завершения.

6. Как не попасть в ловушку бесконечности?

Несколько простых правил безопасности:

  • Инициализируйте переменные до входа в цикл.
  • Обязательно задавайте условие завершения, даже если оно кажется очевидным.
  • Используйте Exit Do — особенно если условие может наступить внезапно внутри тела цикла.
  • Для отладки используйте пошаговое выполнение (F8), чтобы отслеживать каждую итерацию.

📌 Важно запомнить

Цикл Do...Loop:

  • Подходит, когда неизвестно количество шагов заранее.
  • Даёт максимальную гибкость, но требует контроля и дисциплины.
  • Используется во многих практических задачах: обработка строк, ввод данных, формирование отчётов и др.

🤔 Хотите больше примеров?

В следующей статье мы разберём, как с помощью Do...Loop:

  • искать ошибки в таблице,
  • удалять строки с определёнными условиями,
  • и даже динамически создавать отчёты в Excel.

А пока — расскажите в комментариях:

  • Пользовались ли вы этим циклом?
  • С какими трудностями сталкивались?
  • Какие задачи автоматизировали?

Подписывайтесь, если ещё не сделали этого — чтобы не потеряться среди формул и макросов! Впереди ещё много полезного.