В этом руководстве будут показаны примеры использования цикла For Each Loop в VBA. Щелкните здесь, чтобы узнать больше о петлях в целом.
Для каждой петли
For Each Loop позволяет вам пройти через каждый объект в коллекции:
- Все ячейки в диапазоне
- Все листы в книге
- Все открытые книги
- Все фигуры на листе
- Все элементы в массиве
- и более!
Для каждого: основные примеры
Эти примеры продемонстрируют, как настроить циклы For Each для циклического перебора различных типов объектов.
Цикл через клетки
Эта процедура будет проходить через каждую ячейку в диапазоне A1: A10, устанавливая ячейку справа, равную самой себе.
12345678 | Sub ForEachCell ()Тусклая ячейка как диапазонДля каждой ячейки на листах («Лист1»). Диапазон («A1: A10»)Cell.Offset (0, 1) .value = Cell.valueСледующая ячейкаКонец подписки |
Цикл через листы
Эта процедура будет проходить по каждому листу в Рабочей книге, показывая каждый лист.
12345678 | Sub ForEachSheets ()Dim ws как рабочий листДля каждой страницы в листахws.Visible = TrueСледующий листКонец подписки |
Цикл по книгам
Эта процедура будет проходить через каждую книгу, закрывая каждую.
12345678 | Sub ForEachWorkbooks ()Dim wb As WorkbookДля каждого ББ в книгахwb.CloseСледующий wbКонец подписки |
Цикл через фигуры
Эта процедура будет проходить через каждую фигуру в Sheet1, удаляя каждую из них.
12345678 | Sub ForEachShape ()Дим Шп как формаДля каждой ширины в листах ("Sheet1"). ФигурыШп.УдалитьNext ShpКонец подписки |
Прокрутка диаграмм
Эта процедура будет проходить по каждой диаграмме на листе Sheet1, удаляя каждую из них.
12345678 | Sub ForEachCharts ()Dim cht As ChartObjectДля каждого cht в листах ("Sheet1"). ChartObjectscht.DeleteСледующий чтКонец подписки |
Цикл по сводным таблицам
Эта процедура будет проходить через каждую сводную таблицу на листе Sheet1, очищая каждую из них.
12345678 | Sub ForEachPivotTables ()Dim pvt как сводная таблицаДля каждого pvt в таблицах ("Sheet1"). Сводные таблицыpvt.ClearTableСледующий пвтКонец подписки |
Цикл по таблицам
Эта процедура будет проходить через каждую таблицу в Sheet1, удаляя каждую из них.
12345678 | Sub ForEachTables ()Dim tbl As ListObjectДля каждой таблицы в листах ("Sheet1"). ListObjectsтабл.УдалитьСледующая таблицаКонец подписки |
Цикл по элементам в массиве
Эта процедура будет перебирать каждый элемент в массиве, отображать каждое значение в msgbox,
12345678910 | Sub ForEachItemInArray ()Dim arrValue как вариантТусклый элемент как вариантarrValue = Array («Элемент 1», «Элемент 2», «Элемент 3»)Для каждого элемента в arrValueЭлемент MsgBoxСледующий пунктКонец подписки |
Цикл по номерам
Эта процедура будет перебирать каждое число в массиве, отображать каждое значение в msgbox,
12345678910111213 | Sub ForEachNumberInNumbers ()Dim arrNumber (от 1 до 3) как целое числоDim num As VariantarrNumber (1) = 10arrNumber (2) = 20arrNumber (3) = 30Для каждого числа в arrNumberMsgbox NumСледующее числоКонец подписки |
Для каждого построителя цикла
Примеры в этой статье были построены с помощью Конструктор петель в нашем Надстройка VBA: AutoMacro.
В Конструктор петель позволяет очень легко сгенерировать код для циклического перебора объектов. AutoMacro также содержит много других Генераторы кода, обширный Библиотека кодаи мощный Инструменты кодирования.
Для каждого - Если
Вы также можете использовать операторы If в циклах, чтобы проверить, соответствуют ли объекты определенным критериям, выполняя действия только с теми объектами, которые соответствуют критериям. Вот пример перебора каждой ячейки в диапазоне:
Для каждой ячейки в диапазоне - если
1234567891011121314 | Sub If_Loop ()Тусклая ячейка как диапазонДля каждой ячейки в диапазоне («A2: A6»)Если Cell.Value> 0, тоCell.Offset (0, 1) .Value = "Положительный"ElseIf Cell.Value <0 ТогдаCell.Offset (0, 1) .Value = "Отрицательное"ЕщеCell.Offset (0, 1) .Value = "Ноль"Конец, еслиСледующая ячейкаКонец подписки |
Для каждого общего примера
Закрыть все книги
Эта процедура закроет все открытые книги с сохранением изменений.
123456789 | Sub CloseAllWorkbooks ()Dim wb As WorkbookДля каждого ББ в книгахwb.Close SaveChanges: = TrueСледующий wbКонец подписки |
Скрыть все листы
Эта процедура скроет все рабочие листы.
12345678 | Sub HideAllSheets ()Dim ws как рабочий листДля каждой страницы в листахws.Visible = xlSheetHiddenСледующий wsКонец подписки |
Показать все листы
Эта процедура покажет все рабочие листы.
12345678 | Sub UnhideAllSheets ()Dim ws как рабочий листДля каждой страницы в листахws.Visible = xlSheetVisibleСледующий wsКонец подписки |
Защитить все листы
Эта процедура защитит все рабочие листы.
12345678 | Sub ProtectAllSheets ()Dim ws как рабочий листДля каждой страницы в листахws.Protect Пароль: = "…"Следующий wsКонец подписки |
Снять защиту со всех листов
Эта процедура снимет защиту со всех листов.
12345678 | Sub UnprotectAllSheets ()Dim ws как рабочий листДля каждой страницы в листахws.Unprotect Пароль: = "…"Следующий wsКонец подписки |
Удалить все фигуры на всех листах
Эта процедура удалит все фигуры в книге.
123456789101112 | Sub DeleteAllShapesOnAllWorksheets ()Тусклый лист как рабочий листДим Шп как формаДля каждой страницы в листахДля каждого Shp в формах ws.Шп.УдалитьNext ShpСледующий wsКонец подписки |
Обновить все сводные таблицы
Эта процедура обновит все сводные таблицы на листе.
12345678 | Sub RefreshAllPivotTables ()Dim pvt как сводная таблицаДля каждого pvt в таблицах ("Sheet1"). Сводные таблицыpvt.RefreshTableСледующий пвтКонец подписки |
Использование For Each в Access VBA
Цикл For Each работает в Access VBA так же, как и в Excel VBA. В следующем примере будут удалены все таблицы в текущей базе данных.
123456789 | Sub RemoveAllTables ()Dim tdf как TableDefDim dbs как база данныхУстановите dbs = CurrentDbДля каждого tdf в dbs.TableDefsDoCmd.DeleteObject tdf.NameПетляУстановить dbs = NothingКонец подписки |