Гид по технологиям

Цикл For Each в Excel VBA — полное руководство

6 min read Excel VBA Обновлено 11 Apr 2026
Excel VBA: цикл For Each — руководство
Excel VBA: цикл For Each — руководство

Мужчина за компьютером пишет код и работает с Excel

Циклы и VBA органично дополняют друг друга: при работе с объектами Microsoft Office — книгами, листами и диапазонами — цикл позволяет последовательно обрабатывать каждый элемент коллекции. Среди вариантов циклов в VBA For Each особенно удобен для коллекций объектов.

Ниже — пошаговое объяснение синтаксиса, несколько практических примеров и набор дополнительных материалов (когда не применять, альтернативы, чек-листы для ролей, шпаргалка и глоссарий).

Синтаксис цикла For Each

Синтаксис For Each во многом похож на обычный For, но ориентирован на перебор коллекций объектов:

For each variable_name in object_collection

[statement]

[statement]

[statement]

Next variable_name

Цикл начинается с ключевого слова For Each, затем идёт имя переменной (любой валидный идентификатор) и указание коллекции объектов. В коллекцию могут входить ячейки, диапазоны, листы, книги и другие коллекции Excel. При каждой итерации переменная получает ссылку на очередной объект коллекции, выполняются команды внутри цикла, затем управление переходит к Next variable_name.

Приведём базовый пример и разберём его пошагово.

Как использовать For Each в Excel VBA — простой пример

Предположим, нужно заполнить числами ячейки A1:A10. Самый прямой путь — использовать For Each с объектом Range.

  1. Откройте редактор VBA (Alt + F11).
  2. Вставьте модуль: Insert → Module.
  3. Создайте подпрограмму с понятным именем, например for_each_loop.

Подменю в редакторе кода Excel VBA

Внутри модуля введите:

Dim cell as range

For each cell in Sheets("Sheet1").Range("A1:A10")

cell.value = 10

Next cell

Локально переменная cell по очереди ссылается на A1, потом на A2 и так далее до A10. В теле цикла мы присваиваем .Value = 10 — и ячейки заполняются.

Результат выполнения кода:

Лист Excel с заполненным столбцом

Работа с разными объектами: ячейки, листы и книги

For Each отлично подходит для различных коллекций Excel. Разберём типичные сценарии.

Обработка диапазона ячеек и форматирование

Если нужно не только присвоить значение, но и применить форматирование, удобно использовать конструкцию With — она группирует операции по одному объекту.

Sub for_each_loop()

Dim c As Range

For Each c In Sheets("Sheet1").Range("A1:A10")

With c
.Value = 10
.Font.Color = vbRed
.Font.Bold = True
.Font.Strikethrough = True
End With

Next c

End Sub

Фрагмент кода и результат в Excel

Пояснение: With применяет набор операций к текущей ячейке c; это экономит повторное указание объекта и делает код читабельнее.

Управление листами в книге

For Each можно использовать для перебора листов и изменения их свойств, например переименования:

Sub for_each_loop_sheets()

For Each sht In ThisWorkbook.Sheets

If sht.Name = "Sheet1" Then
sht.Name = "Sheet3"
End If

Next sht

End Sub

Код для работы с листами в редакторе

Код проходит по всем листам в книге ThisWorkbook. При совпадении имени листа выполняется переименование.

Совет: если в книге уже есть лист с целевым именем, присвоение имени вызовет ошибку — это стоит обработать заранее (см. раздел «Ошибки и границы применимости»).

Перебор открытых книг

Пример, который добавляет три книги и затем закрывает все открытые книги (включая текущую):

Sub loop_wrkbook()

Dim wrkbook as workbook

Workbooks.Add
Workbooks.Add
Workbooks.Add

For Each wrkbook In Workbooks

wrkbook.Close

Next wrkbook

End Sub

Код для работы с книгами в редакторе

Важно: этот код закроет и книгу макроса. Перед запуском сохраните изменения и учитывайте необходимость проверки Saved или использования параметра SaveChanges.

Вложенный IF внутри цикла — пример с окраской ячеек

Часто нужны условные действия внутри цикла. Ниже — пример изменения цвета фона в зависимости от значения ячейки:

Sub loop_w_if()

Dim c As Range

For Each c In Sheets("Sheet4").Range("A1:A20")

If c.Value < 10 Then
c.Interior.ColorIndex = 3

Else: c.Interior.ColorIndex = 4
End If

Next c

End Sub

В этом примере значения меньше 10 красят ячейку в красный (ColorIndex = 3), остальные — в зелёный (ColorIndex = 4).

Лучшие практики и рекомендации

  • Всегда объявляйте переменные (Option Explicit) — это предотвращает ошибки из‑за опечаток.
  • При работе с листами и книгами используйте явные ссылки (ThisWorkbook, ActiveWorkbook, Sheets(“Имя”)).
  • Обрабатывайте ошибки: проверяйте наличие листа/книги до переименования или закрытия.
  • Для больших диапазонов предпочитайте варианты, минимизирующие обращение к интерфейсу Excel (работайте с массивами, если нужно массово читать/писать данные).
  • Если выполняется длительная обработка, временно отключайте обновление экрана (Application.ScreenUpdating = False) и автоматический пересчёт (Application.Calculation = xlCalculationManual), затем восстанавливайте настройки.

Важно: перед массовым закрытием книг убедитесь, что у вас сохранены все необходимые изменения. Используйте диалог подтверждения или SaveChanges по необходимости.

Когда For Each не лучший выбор

  • Когда вам нужен индекс элемента (номер итерации) — For Each не предоставляет индекс напрямую; проще использовать For i = 1 To N.
  • Если коллекция изменяется в процессе перебора (добавление/удаление элементов) — это может привести к пропуску элементов или ошибкам.
  • Для операций с очень большими наборами ячеек часто эффективнее читать диапазон в массив Variant, обрабатывать массив и затем записывать его обратно одним присваиванием.

Альтернативные подходы

  • For i = 1 To N — когда нужен индекс.
  • Do While / Do Until — для циклов с непредсказуемым числом итераций.
  • Использование массивов для массовой обработки значений (быстрее, чем поэлементный доступ к Range).

Ментальные модели и эвристики

  • Думайте о коллекции как о списке ссылок на объекты; переменная внутри For Each — это указатель на текущий объект.
  • Минимизируйте количество обращений к объектам Excel внутри цикла; чтение/запись через буфер (массив) экономит время.
  • Если действие на объект idempotent (многоразово даёт тот же результат), безопасно использовать повторный запуск.

Чек-листы по ролям

  • Для разработчика макросов:

    • Включить Option Explicit.
    • Добавить обработку ошибок (On Error) и логирование.
    • Писать тестовые сценарии на небольших наборах данных.
  • Для аналитика/пользователя:

    • Сохранить рабочую книгу перед запуском макроса.
    • Проверить имя листа и диапазон.
    • Запустить макрос в тестовой копии файла.

Шпаргалка: быстрое руководство и сниппеты

  • Базовый перебор диапазона:
Dim c As Range
For Each c In Sheets("Sheet1").Range("A1:A10")
  c.Value = "text"
Next c
  • Перебор листов и сохранение каждой в отдельных файлах:
Dim sht As Worksheet
For Each sht In ThisWorkbook.Worksheets
  sht.Copy
  ActiveWorkbook.SaveAs Filename:=ThisWorkbook.Path & "\" & sht.Name & ".xlsx"
  ActiveWorkbook.Close SaveChanges:=False
Next sht
  • Безопасное закрытие книг с проверкой сохранения:
Dim wb As Workbook
For Each wb In Workbooks
  If wb.Saved = False Then wb.Save
  wb.Close SaveChanges:=False
Next wb

Критерии приёмки

  • Макрос перебирает все объекты целевой коллекции без пропусков.
  • Все ожидаемые изменения (значения, формат, имена) применены корректно.
  • Нет необработанных ошибок при выполнении на тестовой выборке.
  • Производительность приемлема для объёма данных (время выполнения не превышает установленной границы).

Примеры неудач и способы их устранения

  • Ошибка при переименовании листа, если имя уже занято — решение: проверять существование имени заранее и добавлять суффикс или диалог подтверждения.
  • Пропуск элементов при модификации коллекции в цикле — решение: либо коллекция должна быть незменной, либо итерация по копии списка имён (например, собрать имена в массив и затем перебирать массив).

Мини-глоссарий

  • ThisWorkbook — книга, где находится запускаемый макрос.
  • ActiveWorkbook — книга, которая активна в данный момент.
  • Range — объект, представляющий одну или несколько ячеек.
  • Worksheet — объект листа в книге.
  • Collection — набор объектов, по которому можно перебрать элементы.

Decision flow (Mermaid) — когда использовать For Each

flowchart TD
  A[Нужно перебрать объекты Excel?] -->|Да| B{Нужен индекс?}
  B -->|Да| C[Используйте For i = 1 To N]
  B -->|Нет| D{Коллекция меняется в ходе перебора?}
  D -->|Да| E[Создайте копию списка и перебирайте её]
  D -->|Нет| F[Используйте For Each]
  A -->|Нет| G[Другой инструмент — формулы/Power Query/VBA массивы]

Подходы к тестированию и сценарии приёмки

  • Тест 1: малый диапазон (A1:A5) — проверить, что все 5 ячеек изменены.
  • Тест 2: пустые или нечисловые значения — убедиться в корректной обработке условий IF.
  • Тест 3: обработка ошибок при отсутствии листа — макрос должен завершаться контролируемо.

Итог

Цикл For Each — один из самых удобных и интуитивных способов работы с коллекциями в Excel VBA. Он делает код компактным и читабельным, особенно при обработке объектов (ячейки, листы, книги). Однако важно учитывать сценарии, когда For Each не подходит: при необходимости индексации, при изменении коллекции в процессе перебора или при больших объёмах данных, где выгоднее оперировать массивами.

Краткий план внедрения: объявите переменные, протестируйте на копии файла, добавьте обработку ошибок и оптимизации (временное отключение ScreenUpdating и пересчёта), затем интегрируйте макрос в рабочий процесс.

Иллюстрация коду и результату в Excel

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Несколько аккаунтов Skype: Multi Skype Launcher
Программное обеспечение

Несколько аккаунтов Skype: Multi Skype Launcher

Журнал для работы: повысить продуктивность
Productivity

Журнал для работы: повысить продуктивность

Персональные звуки уведомлений на Android
Android.

Персональные звуки уведомлений на Android

Скачивание шоу Hulu для офлайн‑просмотра
Стриминг

Скачивание шоу Hulu для офлайн‑просмотра

Microsoft Start: персонализированная новостная лента
Новости

Microsoft Start: персонализированная новостная лента

Как изменить имя в Epic Games быстро
Гайды

Как изменить имя в Epic Games быстро