Цикл повторяет действие для нескольких строк или объектов. В Excel VBA For Next удобно применять к номерам строк, а For Each — к ячейкам заданного диапазона.

Рассчитаем четыре суммы заказов, затем разберём отдельный пример обхода заголовка.

Какие данные подготовить

На листе «Заказы» создайте заголовки: товар, количество, цена, сумма. В строках 2–5 разместите четыре учебных товара. Количество и цена должны быть обычными числами. Столбец D предназначен для результата.

Исходные заказы: D2:D5 свободен для рассчитанных сумм.
Исходные заказы: D2:D5 свободен для рассчитанных сумм.

Для начала используем ровно четыре строки. Диапазон намеренно фиксирован: так проще сопоставить каждый повтор с изменённой ячейкой.

Как работает For Next

Option Explicit

Sub CalculateRows()
    Dim ws As Worksheet
    Dim rowNum As Long
    Set ws = ThisWorkbook.Worksheets("Заказы")
    For rowNum = 2 To 5
        ws.Cells(rowNum, 4).Value = _
            ws.Cells(rowNum, 2).Value * ws.Cells(rowNum, 3).Value
    Next rowNum
End Sub
Счётчик For проходит номера строк от 2 до 5 включительно.
Счётчик For проходит номера строк от 2 до 5 включительно.

rowNum последовательно принимает значения 2, 3, 4, 5. Для каждой строки Cells(rowNum, 2) обращается к количеству, Cells(rowNum, 3) — к цене, Cells(rowNum, 4) — к сумме. Все Cells относятся к ws.

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

Как проверить четыре повтора

После запуска ожидаются суммы 450, 350, 360 и 240. Проверьте не только первую строку: верное значение D2 ещё не доказывает, что цикл прошёл остальные записи.

Ожидаемый результат: четыре числовые суммы; в D2 записано 450.
Ожидаемый результат: четыре числовые суммы; в D2 записано 450.

Процедура записывает числа. Изменение B2 после запуска не пересчитает D2 автоматически: потребуется повторный запуск или формула вместо записи значения.

Как использовать For Each

Sub BoldHeaderCells()
    Dim ws As Worksheet
    Dim cell As Range
    Set ws = ThisWorkbook.Worksheets("Заказы")
    For Each cell In ws.Range("A1:D1")
        cell.Font.Bold = True
    Next cell
End Sub

Переменная cell имеет тип Range и по очереди ссылается на ячейки A1:D1. В каждом повторе шрифт текущей ячейки становится полужирным. Этот пример изменяет оформление, а не значения.

Для одной команды всему диапазону можно присвоить Font.Bold без цикла. For Each полезен, когда для отдельных ячеек нужны разные проверки или действия. При обходе массива управляющая переменная должна быть Variant, в отличие от Range в приведённом обходе ячеек.

Шаг, выход и вложенные циклы

For поддерживает Step: положительный шаг движется к верхней границе, отрицательный — к нижней. Согласуйте направление и границы, иначе цикл может не выполнить ни одного повтора.

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

Проверка цикла перед расширением

  • Обработаны строки 2–5, включая обе границы.
  • Суммы равны 450, 350, 360 и 240.
  • Исходные количество и цена сохранились.
  • Каждый Cells связан с нужным листом.
  • Известно, что произойдёт при добавлении пятой записи.

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

Продолжить изучение: Sub и Function в VBA: процедуры, функции и аргументы, Do While, Do Until и While Wend в VBA, Массивы VBA: Array и работа с диапазоном Excel.

Разберитесь с макросами вместе с преподавателем

На занятии вы записываете действия, читаете код и проверяете результат на небольшом примере. Преподаватель подберёт задания под ваш уровень и поможет понять связь между командами VBA и изменениями в книге.

Начните с бесплатного вводного урока: 45 минут, один на один, без обязательств. Обсудите цель и попробуйте формат. Решение о продолжении — после занятия.

Записаться на бесплатный урок