Цикл For… Next в VBA Excel, его синтаксис и описание отдельных компонентов. Примеры использования цикла For… Next.
Цикл For… Next в VBA Excel предназначен для выполнения группы операторов необходимое количество раз, заданное управляющей переменной цикла — счетчиком. При выполнении цикла значение счетчика после каждой итерации увеличивается или уменьшается на число, указанное выражением оператора Step, или, по умолчанию, на единицу. Когда необходимо применить цикл к элементам, количество которых и индексация в группе (диапазон, массив, коллекция) неизвестны, следует использовать цикл For Each… Next.
For counter = start To end [ Step step ] [ statements ] [ Exit For ] [ statements ] Next [ counter ] |
For счетчик = начало To конец [ Step шаг ] [ операторы ] [ Exit For ] [ операторы ] Next [ счетчик ] |
В квадратных скобках указаны необязательные атрибуты цикла For… Next.
Компоненты цикла For… Next
Компонент | Описание |
---|---|
counter | Обязательный атрибут. Числовая переменная, выполняющая роль счетчика, которую еще называют управляющей переменной цикла. |
start | Обязательный атрибут. Числовое выражение, задающее начальное значение счетчика. |
end | Обязательный атрибут. Числовое выражение, задающее конечное значение счетчика. |
Step* | Необязательный атрибут. Оператор, указывающий, что будет задан шаг цикла. |
step | Необязательный атрибут. Числовое выражение, задающее шаг цикла. Может быть как положительным, так и отрицательным. |
statements | Необязательный** атрибут. Операторы вашего кода. |
Exit For | Необязательный атрибут. Оператор выхода из цикла до его окончания. |
Next [ counter ] | Здесь counter — необязательный атрибут. Это то же самое имя управляющей переменной цикла, которое можно здесь не указывать. |
*Если атрибут Step отсутствует, цикл For… Next выполняется с шагом по умолчанию, равному 1.
**Если не использовать в цикле свой код, смысл применения цикла теряется.
Примеры циклов For… Next
Вы можете скопировать примеры циклов в свой модуль VBA, последовательно запускать их на выполнение и смотреть результаты.
Простейший цикл
Заполняем десять первых ячеек первого столбца активного листа Excel цифрами от 1 до 10:
Sub test1() Dim i As Long For i = 1 To 10 Cells(i, 1) = i Next End Sub |
Простейший цикл с шагом
В предыдущий цикл добавлен оператор Step со значением 3, а результаты записываем во второй столбец:
Sub test2() Dim i As Long For i = 1 To 10 Step 3 Cells(i, 2) = i Next End Sub |
Цикл с отрицательными аргументами
Этот цикл заполняет десять первых ячеек третьего столбца в обратной последовательности:
Sub test3() Dim i As Long For i = 0 To —9 Step —1 Cells(i + 10, 3) = i + 10 Next End Sub |
Увеличиваем размер шага до -3 и записываем результаты в четвертый столбец активного листа Excel:
Sub test4() Dim i As Long For i = 0 To —9 Step —3 Cells(i + 10, 4) = i + 10 Next End Sub |
Вложенный цикл
Внешний цикл последовательно задает индексы первых десяти строк активного листа, а вложенный цикл складывает числа в первых четырех ячейках строки с текущем индексом и записывает сумму в ячейку пятого столбца. Перед запуском вложенного цикла с накопительным сложением, пятую ячейку соответствующей строки обнуляем, чтобы в случае нахождения в ней какого-либо числа, оно не прибавилось к итоговой сумме.
Sub test5() Dim i1 As Long, i2 As Long For i1 = 1 To 10 ‘Пятой ячейке в строке i1 присваиваем 0 Cells(i1, 5) = 0 For i2 = 1 To 4 Cells(i1, 5) = Cells(i1, 5) + Cells(i1, i2) Next Next End Sub |
Выход из цикла
В шестой столбец активного листа запишем названия десяти животных, конечно же, с помощью цикла For… Next:
Sub test6() Dim i As Long For i = 1 To 10 Cells(i, 6) = Choose(i, «Медведь», «Слон», «Жираф», «Антилопа», _ «Крокодил», «Зебра», «Тигр», «Ящерица», «Лев», «Бегемот») Next End Sub |
Следующий цикл будет искать в шестом столбце крокодила, который съел галоши. В ячейку седьмого столбца цикл, пока не встретит крокодила, будет записывать строку «Здесь был цикл», а когда обнаружит крокодила, запишет «Он съел галоши» и прекратит работу, выполнив команду Exit For. Это будет видно по ячейкам рядом с названиями животных ниже крокодила, в которых не будет текста «Здесь был цикл».
Sub test7() Dim i As Long For i = 1 To 10 If Cells(i, 6) = «Крокодил» Then Cells(i, 7) = «Он съел галоши» Exit For Else Cells(i, 7) = «Здесь был цикл» End If Next End Sub |
Результат работы циклов For… Next из примеров:
Результат работы циклов For… Next
Такие данные на активном листе Excel вы получите, если последовательно запустите на выполнение в редакторе VBA все семь подпрограмм из примеров, демонстрирующих работу циклов For… Next.
Цикл с дробными аргументами
Атрибуты start, end и step могут быть представлены числом, переменной или числовым выражением:
For i = 1 To 20 Step 2 For i = a To b Step c For i = a — 3 To 2b + 1 Step c/2 |
В результате вычисления значения переменной вне цикла или выражения внутри его может получиться дробный результат. VBA Excel округлит его до целого числа, используя бухгалтерское округление:
‘Значения атрибутов до округления For i = 1.5 To 10.5 Step 2.51 ‘Округленные значения атрибутов For i = 2 To 10 Step 3 |
Старайтесь не допускать попадания в тело цикла For… Next неокругленных значений аргументов, чтобы не получить непредсказуемые результаты его выполнения. Если без дробных чисел не обойтись, а необходимо использовать обычное округление, применяйте в коде VBA функцию рабочего листа WorksheetFunction.Round для округления числа перед использованием его в цикле For… Next.
В этом учебном материале вы узнаете, как использовать Excel оператор FOR … NEXT для создания цикла FOR в VBA с синтаксисом и примерами.
Описание
Оператор Microsoft Excel FOR … NEXT используется для создания цикла FOR, чтобы вы могли выполнять код VBA определенное количество раз. Оператор FOR … NEXT является встроенной функцией Excel, которая относится к категории логических функций. Её можно использовать как функцию VBA в Excel.
В качестве функции VBA вы можете использовать эту функцию в коде макроса, который вводится через редактор Microsoft Visual Basic Editor.
Синтаксис
Синтаксис для создания цикла FOR с использованием оператора FOR … NEXT в Microsoft Excel:
For counter = start To end [Step increment] {…statements…}Next [counter]
Аргументы или параметры
- counter
- Переменная счетчика цикла.
- start
- Начальное значение для
counter
. - end
- Конечное значение для
counter
. - increment
- По желанию. Значение
counter
увеличивается при каждом проходе цикла. Это может быть положительное или отрицательное число.
Если не указано, по умолчанию будет приращение 1, так что каждый проход через цикл увеличиваетcounter
на 1. - statement
- Операторы кода для выполнения каждого прохода через цикл.
Возвращаемое значение
Оператор FOR … NEXT создает цикл FOR в VBA.
Примечание
- См. также инструкцию WHILE … WEND, чтобы создать цикл WHILE в VBA.
Применение
- Excel для Office 365, Excel 2019, Excel 2016, Excel 2013, Excel 2011 для Mac, Excel 2010, Excel 2007, Excel 2003, Excel XP, Excel 2000
Тип функции
- Функция VBA
Пример (как функция VBA)
Оператор FOR … NEXT может использоваться только в коде VBA в Microsoft Excel.
Давайте посмотрим, как создать цикл FOR в Microsoft Excel, начиная с одинарного цикла, двойной цикл и тройной цикл, а затем исследуем, как изменить значение, используемое для увеличения счетчика при каждом прохождении цикла.
Одинарный цикл
Простейшей реализацией цикла FOR является использование оператора FOR … NEXT для создания одного цикла. Это позволит вам повторять код VBA фиксированное количество раз, например:
Sub Single_Loop_Example Dim LCounter As Integer For LCounter = 1 To 5 MsgBox (LCounter) Next LCounter End Sub |
В этом примере цикл FOR управляется переменной LCounter. Он будет повторяться 5 раз, начиная с 1 и заканчивая 5. Каждый раз внутри цикла он будет отображать окно сообщения со значением переменной LCounter. Этот код отобразит 5 окон сообщений со следующими значениями: 1, 2, 3, 4 и 5.
Одинарный цикл — изменение приращения
По умолчанию цикл FOR увеличивает свой счетчик цикла на 1, но это можно настроить. Вы можете использовать Step increment
, чтобы изменить значение, используемое для увеличения счетчика. Приращение цикла FOR может иметь как положительные, так и отрицательные значения.
Положительное приращение
Давайте сначала рассмотрим пример того, как увеличить счетчик цикла FOR на положительное значение.
Например:
Sub Increment_Positive_Example Dim LCounter As Integer For LCounter = 1 To 9 Step 2 MsgBox LCounter Next LCounter End Sub |
В этом примере мы использовали шаг 2 в цикле FOR, чтобы изменить приращение на 2. Это означает, что цикл FOR будет начинаться с 1, увеличиваться на 2 и заканчиваться на 9. Код будет отображать 5 окон сообщений со следующими значениями: 1, 3, 5, 7 и 9.
Отрицательное приращение
Теперь давайте посмотрим, как увеличить счетчик цикла FOR на отрицательное значение.
Например:
Sub Increment_Negative_Example Dim LCounter As Integer For LCounter = 50 To 30 Step —5 MsgBox LCounter Next LCounter End Sub |
Когда вы увеличиваете на отрицательное значение, вам нужно, чтобы начальное число был с более высоким значением, а конечное число — с меньшим значением, поскольку цикл FOR будет вести обратный отсчет. Итак, в этом примере цикл FOR будет начинаться с 50, увеличиваться на -5 и заканчиваться на 30. Код отобразит 5 окон сообщений со следующими значениями: 50, 45, 40, 35 и 30.
Двойной цикл
Теперь давайте рассмотрим пример создания двойного цикла FOR в Microsoft Excel.
Например:
Sub Double_Loop_Example Dim LCounter1 As Integer Dim LCounter2 As Integer For LCounter1 = 1 To 4 For LCounter2 = 8 To 9 MsgBox LCounter1 & «-« & LCounter2 Next LCounter2 Next LCounter1 End Sub |
Здесь у нас есть 2 цикла FOR. Внешний цикл FOR управляется переменной LCounter1. Внутренний цикл FOR управляется переменной LCounter2. В этом примере внешний цикл FOR будет повторяться 4 раза (начиная с 1 и заканчивая 4), а внутренний цикл FOR будет повторяться 2 раза (начиная с 8 и заканчивая 9). Во внутреннем цикле код будет каждый раз отображать окно сообщения со значением LCounter1-LCounter2. Таким образом, в этом примере будут отображаться 8 окон сообщений со следующими значениями: 1-8, 1-9, 2-8, 2-9, 3-8, 3-9, 4-8 и 4-9.
Тройной цикл
Теперь давайте рассмотрим пример того, как создать тройной цикл FOR в Microsoft Excel.
Например:
Sub Triple_Loop_Example Dim LCounter1 As Integer Dim LCounter2 As Integer Dim LCounter3 As Integer For LCounter1 = 1 To 2 For LCounter2 = 5 To 6 For LCounter3 = 7 To 8 MsgBox LCounter1 & «-« & LCounter2 & «-« & LCounter3 Next LCounter3 Next LCounter2 Next LCounter1 End Sub |
В приведенном выше примере у нас есть 3 цикла FOR. Самый внешний цикл FOR управляется переменной LCounter1. Следующий цикл FOR управляется переменной LCounter2. Самый внутренний цикл FOR управляется переменной LCounter3. В этом примере самый внешний цикл FOR будет повторяться 2 раза (начиная с 1 и заканчивая 2), следующий цикл FOR будет повторяться 2 раза (начиная с 5 и заканчивается на 6), а самый внутренний цикл FOR будет повторяться 2 раза (начиная с 7 и заканчивая 8). Внутри самого внутреннего цикла код будет каждый раз отображать окно сообщения со значением LCounter1-LCounter2 -LCounter3. Этот код отображает 8 окон сообщений со следующими значениями: 1-5-7, 1-5-8, 1-6-7, 1-6-8, 2-5-7, 2-5-8, 2- 6-7 и 2-6-8.
Цикл For Loop в VBA – один из самых популярных циклов в Excel. Данный цикл имеет две формы – For Next и For Each In Next. Данные операторы используются для последовательного перемещения по списку элементов или чисел. Для завершения цикла мы можем в любой момент использовать команду выхода. Давайте подробнее рассмотрим каждый из этих циклов.
Цикл For Next имеет следующий синтаксис:
1 |
For счетчик = начало_счетчика To конец_счетчика |
То что мы делаем здесь, по существу, это создаем цикл, который использует переменную счетчик как хранитель времени. Устанавливаем его значение равным начало_счетчика, и увеличиваем (или уменьшаем) на 1 во время каждого витка. Цикл будет выполняться до тех пор, пока значение счетчик не станет равным конец_счетчика. Когда оба эти значения совпадут, цикл выполнится последний раз и остановится.
Пример цикла
1 |
Sub пример_цикла1() |
Последнее значение переменной счетчик будет равным 11
VBA обратный цикл For Loop с инструкцией STEP
Если у вас появилась необходимость перемещаться от большего значения к меньшему – вы можете использовать цикл в обратном направлении. Вот пример обратного цикла:
1 |
Sub пример_цикла2() |
Последнее значение переменной счетчик будет равным 1.
Как вы могли заметить, мы можем использовать инструкцию Step n для работы цикла как вперед, так и в обратном направлении. По умолчанию значение Step равно 1, но оно может быть изменено, если необходимо пропускать какие-либо значения, тогда значение n будет больше одного, или перемещаться в обратном направлении, тогда n будет отрицательным.
VBA цикл For Each … Next
Цикл For Each … Next имеет следующий цикл:
1 |
For Each элемент_группы In группа_элементов |
Здесь переменная элемент_группы принадлежит к группе_элементов (железная логика!!!). Я имею в виду, что объект группа_элементов должен быть коллекцией объектов. Вы не сможете запустить цикл For Each для отдельно объекта (Microsoft сразу оповестит вас об этом 438-й ошибкой).
Данный цикл перебирает все элементы какой-либо коллекции, начиная с самого первого. Вы можете использовать данный цикл, если вам необходимо, например, обойти все листы в книге, объекты на листе, сводные таблицы и т.д.
Ниже представлен пример, как можно воспользоваться циклом For Each для просмотра всех листов книги:
1 |
Sub пример_цикла4() |
… либо всех сводных таблиц на листе
1 |
Sub пример_цикла() |
Прерывание цикла VBA
Если вам необходимо выйти из цикла до момента, как будет достигнуто условие завершения цикла, воспользуйтесь командой End For в связке с инструкцией IF. В примере, приведенном ниже, мы выйдем из цикла до момента достижения условия завершения, в данном цикле выход будет осуществлен при условии, когда переменная счетчик будет равна 3.
1 |
Sub пример_цикла5() |
Пропуск части цикла в For Each
Пропускать часть цикла, а затем возвращаться назад – плохая практика. Тем не менее, давайте рассмотрим пример:
1 |
Sub пример_цикла6 () |
Здесь мы пропустили одну итерацию (когда j = 3). Как вы думаете, какой результат выдаст программа? 3? 5? Ну… на самом деле, ни один из вариантов не верный. Цикл будет выполняться бесконечно, пока память компьютера не переполнится.
Однако возможность пропустить шаг цикла без последствий существует. Вы можете увеличить значение счетчика на 1 (или другое значение), что приведет к пропуску операций, находящихся между этими значениями. Вот пример:
1 |
Sub пример_цикла7() |
Но опять же, это плохая практика написания кода, и может привести к нежелательным последствиям при написании кода в будущем. Вместо этого, при необходимости пропуска некоторых итераций, попробуйте использовать функцию If или Select Case.
На чтение 14 мин. Просмотров 18.6k.
Итог: циклы For Next — одни из самых мощных методов VBA для автоматизации общих задач в Excel. В этой статье объясняется, как работает цикл, повторяющий действия над коллекцией элементов, что экономит нам массу времени.
Уровень мастерства: Средний
Содержание
- Сила циклов VBA
- Как работает цикл For Next?
- Два типа циклов For Next
- The For Each Next Loop: цикл по коллекции элементов
- В каком порядке работает цикл For Each?
- Предметы / объекты НЕ выбираются в цикле
- The Next Loop: циклы через набор чисел
- Обратный цикл
- Как остановить цикл раньше
- Переменная не требуется после ключевого слова Next
- Примеры макросов VBA для циклов
- Какую задачу хотите зациклить вы?
Сила циклов VBA
В Excel мы тратим много времени на повторяющиеся простые задачи. Например, как: форматирование нескольких диапазонов, отображение нескольких листов, копирование и вставка в несколько рабочих книг, применение фильтров к нескольким таблицам или сводным таблицам, замена значений, обновление формул и т.д.
Можете ли вы вспомнить несколько задач, в которых вам
приходилось повторять один и тот же процесс снова и снова?
Эти задачи чрезвычайно трудоемкие и скучные!
К счастью, выход есть. Мы можем использовать циклы в наших
макросах VBA, чтобы очень быстро повторять действия. Задачи, выполнение которых
вручную может занять несколько часов, могут быть выполнены за несколько секунд
с помощью цикла.
Цикл For Next — это наиболее распространенный тип цикла,
который помогает нам выполнять эти повторяющиеся задания. В этой статье мы
рассмотрим два типа For Next Loops.
Загрузите файл примера
Загрузите бесплатный файл Excel, содержащий примеры макросов
с помощью цикла For Next.
For Next Loop VBA Macro Examples.xlsm (79.0 KB)
Скачать PDF версию статьи на английском для печати.
Как работает цикл For Next?
Цикл For Next позволяет нам просматривать коллекцию, элементами которой могут быть объекты или списки чисел.
Примеры коллекций:
- Клетки в ассортименте.
- Рабочие листы в рабочей тетради.
- Открытые рабочие тетради на компьютере.
- Сводные таблицы на листе.
- Сводные поля в сводной таблице.
- Формы на листе.
- И любой другой объект, с которым вы взаимодействуете в Excel.
Задача цикла For Next Loop состоит в том, чтобы выполнять
одинаковые действия (строки кода) для каждого элемента в коллекции.
В приведенном ниже примере содержится цикл For Next, который
проходит по каждому листу в книге и отображает каждый лист. Цикл начинается с
первого элемента в коллекции (первый лист в рабочей книге) и выполняет строку
кода между строками For и Next для каждого элемента в коллекции (каждый лист в
рабочей книге).
Sub Unhide_Multiple_Sheets() Dim ws As Worksheet For Each ws In ActiveWorkbook.Worksheets ws.Visible = xlSheetVisible Next ws End Sub
Конечно, мы можем использовать логические операторы, такие как операторы If, для проверки свойств и условий перед выполнением действий.
Следующий макрос отображает только те листы, которые имеют фразу «ABC Global Co.» в ячейке A1 каждого листа, и скрывает все остальные листы.
Sub Unhide_Report_Sheets() Dim ws As Worksheet For Each ws In ActiveWorkbook.Worksheets If ws.Range("A1").Value = "ABC Global Co." Then ws.Visible = xlSheetVisible Else ws.Visible = xlSheetHidden End If Next ws End Sub
Два типа циклов For Next
Действительно, существуют два типа For Next Loops.
- For Each Next
Loops циклически просматривает коллекцию элементов. - For Next Loops
цикл через набор чисел.
Давайте посмотрим, как работает
каждый.
The For Each Next Loop: цикл по коллекции элементов
Как мы видели выше, цикл «The For Each Next Loop» позволяет нам перебирать коллекцию предметов или объектов. Это, наверное, самый распространенный цикл, который мы используем в Excel, потому что мы работаем с коллекциями объектов. Опять же, эти коллекции представляют собой ячейки в диапазоне, рабочие таблицы в рабочей книге, сводные таблицы в рабочей таблице и т.д.
Мы будем использовать пример написания цикла «For Each Next Loop», чтобы просмотреть все рабочие листы в рабочей книге.
Существует четыре основных шага для написания цикла For Each Next в VBA:
- Объявите переменную для объекта.
- Напишите для каждой строки переменную и коллекцию
ссылок. - Добавьте строку (и) кода для повтора для каждого
элемента в коллекции. - Напишите следующую строку, чтобы закрыть цикл.
Давайте рассмотрим каждый из этих шагов подробно.
Шаг 1 — объявить переменную для объекта
Сначала нам нужно объявить переменную, которая будет
временно хранить ссылку на объект.
Строка Dim в верхней части макроса объявляет переменную, как объект. В этом случае объект является рабочим листом. Мы можем создать любое имя переменной, если захотим, если оно не совпадает с другой ссылкой в VBA. «Ws» — наиболее распространенное имя переменной для объекта листа, но вы можете изменить его.
Шаг 2 — Для каждой строки
Далее мы напишем оператор For Each. Это первая строка кода в цикле.
For Each ws In ActiveWorkbook.Worksheets
Первые два слова For Each. Затем мы вводим имя переменной, за которым следует слово In. Наконец, мы указываем, где располагается коллекция. В этом случае мы хотим просмотреть все рабочие листы в ActiveWorkbook. Итак, мы набираем ActiveWorkbook.Worksheets. Эта строка ссылается на все рабочие листы в ActiveWorkbook.
Если вы хотите пройтись по рабочим листам определенной
рабочей книги, вы можете использовать свойство Рабочие книги для ссылки на эту
рабочую книгу по имени.
For Each ws In Workbooks("Book2.xlsx").Worksheets
Просто помните, что рабочая книга, на которую вы ссылаетесь,
должна быть открыта до запуска строки кода For Next. Конечно, мы можем
использовать метод Workbooks.Open, чтобы открыть рабочую книгу.
Шаг 3 — Добавить код для повторения для каждой итерации
После строки «For Each» мы добавляем строку(и) кода, которая будет выполняться на каждом листе. В этом примере у нас есть только одна строка кода, которая показывает лист.
ws.Visible = xlSheetVisible
В этой строке кода мы используем переменную ws для ссылки на
текущий рабочий лист в цикле. Когда цикл выполняется, он устанавливает
временную ссылку на переменную ws для каждой итерации в цикле.
Это так же, как если бы мы установили переменную ws для определенного листа, используя следующую строку кода.
Однако нам НЕ нужна эта строка с циклом For Each Next. Цикл
заботится о настройке переменной для нас для каждой итерации в цикле.
Для первой итерации в цикле ws установлен на Worksheets (1).
На следующей итерации ws устанавливается в Worksheets (2). Это продолжается,
пока цикл перебирает все листы в рабочей книге. Это очень мощно, потому что мы
можем повторно использовать переменную для ссылки на лист в цикле несколько
раз.
Шаг 4 — Next закрывает цикл
Последняя строка кода в цикле — Next.
Когда макрос попадает в эту строку кода, он делает две вещи:
- Во-первых, он изменяет ссылку на переменную на следующий элемент коллекции. В этом примере переменная ws изменяется для ссылки на следующий лист в рабочей книге.
- Во-вторых, он возвращается к выполнению строки кода непосредственно под строкой For Each. Затем он выполняет все строки кода между строками For Each и Next в порядке сверху вниз.
Когда будет достигнут последний элемент в коллекции (рабочий лист в рабочей книге), цикл останавливается, и макрос переходит к следующей строке кода ниже строки Next.
В каком порядке работает цикл For Each?
Цикл For Each Loop всегда начинается с первого элемента в коллекции и переходит к последнему элементу в том порядке, в котором они отображаются в Excel. Это основано на номере индекса предметов в коллекции. Вот несколько примеров порядка выполнения цикла для общих объектов.
- Рабочие листы. Начинается с первой вкладки листа в рабочей книге и возвращается к последней в том порядке, в котором вкладки отображаются в рабочей книге.
- Рабочие книги. Начинается с первой открытой книги и циклически повторяется в порядке открытия рабочих книг. Рабочим книгам присваивается порядковый номер по мере их открытия.
- Клетки: циклы слева направо, затем вниз. Начинается с первой ячейки в диапазоне и возвращается к следующему столбцу в той же строке, затем переходит к следующей строке.
- Таблицы и сводные таблицы. Начинается с первого объекта, созданного на листе, и циклически повторяется в порядке создания объектов. Этот же принцип действует и для других объектов, которые вы создаете на листах, таких как фигуры, диаграммы, слайсеры и т.д.
Предметы / объекты НЕ выбираются в цикле
Важно отметить, что когда мы перебираем коллекцию объектов, каждый объект НЕ выделяется в Excel.
Цикл создает ссылку на элемент/объект с помощью переменной. Переменная временно установлена на ссылку на объект. Объект НЕ выбран и НЕ обязательно становится активным объектом. Для выбора объекта мы можем использовать методы Select или Activate. Вы также должны убедиться, что объекты родительского объекта выбраны первыми. Ознакомьтесь с моей статьей об объектной модели Excel и иерархии объектов в VBA, чтобы узнать больше об этом.
The Next Loop: циклы через набор чисел
Также можно использовать цикл For Next Loop для просмотра набора чисел. Это может быть полезно, когда мы перебираем элементы управления пользовательской формы, массивы или если мы хотим перебрать коллекцию в обратном направлении.
Основная операция цикла For Next такая же, как и для цикла
For Each. Разница заключается в формате строки For.
Шаг 1 — Объявление переменной для числа
Чтобы перебрать набор чисел, мы сначала должны объявить переменную для целого числа типа данных. Мы можем использовать Integer или Long integer.
Переменная называется счетчиком, потому что она увеличивается или уменьшается вверх/вниз для каждой итерации в цикле.
Дополнительное примечание к Long: тип данных Long (целое число) содержит большее число, чем Integer. Это занимает больше памяти, но для современного компьютера это не проблема. Мы можем использовать длинные переменные все время. Буква L выглядит как цифра 1 в VBA, поэтому я теперь использую i в качестве имени переменной, хотя я использую Long в качестве типа данных. Это все зависит от личных предпочтений, и вы можете назвать переменную как хотите.
Шаг 2 — Напишите строку For
Далее мы пишем строку For. Базовая конструкция — это ключевое слово For, за которым следует имя переменной (counter), затем знак равенства, начальное значение To end value.
Начальные и конечные значения могут быть указаны как числа, или мы можем использовать целочисленные / длинные переменные вместо них.
For i = 1 To ActiveWorkbook.Worksheets.Count
Эта строка кода возвращает количество листов в активной книге. Тем не менее, он не проходит по каждому листу. Цикл просто перебирает набор чисел. Мы должны создать ссылку на лист с переменной счетчика (i) в качестве номера индекса свойства Worksheets. Шаг 3 показывает эту ссылку.
Шаг 3 — Добавить код, который повторяется для каждой итерации
Остальная часть цикла работает так же, как цикл For Each. Мы можем добавить строки между строками For и Next, которые будут выполняться для каждой итерации цикла. Переменная counter может быть использована несколько раз в этих строках кода.
Worksheets(i).Visible = True
Шаг 4 — Строка Next закрывает цикл
Наконец, мы добавляем строку Next внизу.
Когда макрос запускается, он устанавливает переменную, равную первому числу в строке For. Когда макрос попадает в следующую строку, он добавляет 1 к значению переменной или увеличивает счет. Итак, я = 2 во второй итерации цикла. Он продолжает цикл, пока не будет достигнут последний номер в цикле.
По умолчанию 1 добавляется к счетчику переменных для каждой итерации в цикле. Это называется значением шага, и мы можем контролировать значение каждого шага в счетчике. Значение Step добавляется в конец строки For. Следующая строка добавит 2 к счетчику для каждой итерации в цикле.
Если вы хотите заштриховать все остальные строки на листе, вы можете использовать такой цикл.
Обратный цикл
Мы также можем использовать значение шага для обратной петли, указав отрицательное число.
Обратите внимание, что начальное значение теперь больше, а конечное значение меньше. Циклы начинаются с 100 (начальное значение) и вычитают 1 из переменной счетчика (шаг -1) для каждой итерации в цикле, пока не дойдут до 1 (конечное значение).
Ключевое слово Step не является обязательным. Если вы не укажете его, тогда VBA примет значение шага 1.
Цикл в обратном направлении — это хорошо, если вы удаляете элементы.
Я напишу отдельный пост об этом, но общая идея заключается в том, что когда мы перебираем коллекцию и удаляем элементы, размер коллекции уменьшается при удалении элементов. Цикл обычно выдает ошибку, как только достигает 10-го элемента, когда в коллекции теперь только 9 элементов. Цикл в обратном направлении предотвращает эту потенциальную ошибку.
Как остановить цикл раньше
Обычно цикл перебирает все элементы в коллекции, а затем переходит к следующей строке кода ниже следующей строки. Однако мы можем остановить цикл раньше с помощью оператора Exit For.
В следующем макросе оператор Exit For используется для выхода из цикла после того, как первый лист, начинающийся со слова «Отчет», будет найден скрытым.
Sub Unhide_First_Sheet_Exit_For() ' Отображает первый лист, который содержит определенную фразу ' в имени листа, затем выходит из цикла. Dim ws As Worksheet For Each ws In ActiveWorkbook.Worksheets ' Найдите лист, который начинается со слова «Отчет» If Left(ws.Name, 6) = "Report" Then ws.Visible = xlSheetVisible ' Выход из цикла после того, как первый лист найден Exit For End If Next ws End Sub
Переменная ws сохраняет ссылку на рабочий лист после
преждевременного выхода из цикла и может быть снова использована в коде под
циклом.
Переменная не требуется после ключевого слова Next
Возможно, вы заметили, что я добавил переменную после ключевого слова Next в нижней части цикла в приведенных выше примерах.
Это НЕ обязательно, и вы можете не увидеть его в других примерах, которые вы найдете в Интернете. Однако мне нравится включать переменную после Next по двум причинам.
- Мы можем использовать его при отладке кода,
чтобы увидеть значение переменной, наведя указатель мыши на переменную, когда
код остановлен. - Это облегчает понимание того, к какой строке For
подключена следующая строка. Это особенно верно, когда у вас есть несколько циклов
или вложенных циклов в ваших макросах.
Поэтому я рекомендую добавить переменную после ключевого слова Next в качестве лучшей практики. Немного дополнительной работы заранее сэкономит время и головную боль в будущем. Доверьтесь мне!
Примеры макросов VBA для циклов
Вот дополнительные статьи с макросами, в которых используется хотя бы один цикл For Next Loop.
3 способа показать несколько листов в учебнике по Excel + VBA
Автоматическое форматирование чисел по умолчанию в сводных таблицах Excel
3 совета, как сохранить и закрыть все открытые файлы книги Excel + макрос
Макрос метрики SUBTOTAL — создание сводной таблицы всех
типов функций
Как добавить оглавление Галерея изображений в файлы Excel
Скрыть и отобразить (отфильтровать) столбцы с помощью
слайсера или раскрывающегося меню фильтра
Фильтрация сводной таблицы или среза по самой последней дате или периоду
Как изменить размер панелей Excel для разных размеров экрана
Преобразование сводной таблицы в формулы SUMIFS + бесплатный макрос VBA
Макрос VBA, чтобы скрыть все столбцы, которые содержат
значение в ячейке
Как повторять задачи с помощью кода VBA — Looping — Отличная статья с большим количеством примеров от моего друга Криса Ньюмана из The Spreadsheet Guru.
Какую задачу хотите зациклить вы?
Я надеюсь, что эта статья поможет вам начать работу с циклами. Не забудьте скачать бесплатный файл Excel, содержащий примеры кода.
For Next Loop VBA Macro Examples.xlsm (79.0 KB)
Циклы, безусловно, являются промежуточной техникой кодирования, которая вынуждает нас выйти за рамки MacroRecorder. К сожалению, записанный макрос не может создавать петли. Тем не менее, это навык, который вы сможете использовать снова и снова на протяжении всей своей карьеры для автоматизации простых и сложных задач. Понимание того, как использовать циклы, даст вам волшебную силу с Excel.
Пожалуйста, оставьте комментарий ниже с задачей, которую вы хотите автоматизировать с помощью цикла. Спасибо!
Может возникнуть ситуация, когда вам нужно выполнить блок кода несколько раз. В общем случае операторы выполняются последовательно: сначала выполняется первый оператор в функции, затем второй и т. Д.
Содержание:
- for цикл
- Синтаксис
- Диаграмма потока
- пример
- for … loop
- Синтаксис
- пример
- while..wend loop
- Синтаксис
- Диаграмма потока
- пример
- Цикл do..while
- Синтаксис
- Диаграмма потока
- пример
- Альтернативный синтаксис
- пример
- do..intil loop
- Синтаксис
- Диаграмма потока
- пример
- Альтернативный синтаксис
- Диаграмма потока
- пример
- Записи управления циклом
- Контрольное заявление и описание
- Выход для оператора
- Синтаксис
- Диаграмма потока
- пример
- Exit Do
- Синтаксис
- пример
Языки программирования предоставляют различные структуры управления, которые обеспечивают более сложные пути выполнения.
Оператор цикла позволяет нам выполнять оператор или группу операторов несколько раз. Ниже приведен общий вид оператора цикла в VBA.
VBA предоставляет следующие типы циклов для обработки требований циклирования. Нажмите следующие ссылки, чтобы проверить их детали.
Цикл for — это структура управления повторением, которая позволяет разработчику эффективно писать цикл, который необходимо выполнить определенное количество раз.
Синтаксис
Ниже приведен синтаксис цикла for в VBA.
For counter = start To end [Step stepcount] [statement 1] [statement 2] .... [statement n] [Exit For] [statement 11] [statement 22] .... [statement n] Next
Диаграмма потока
Ниже приведен поток управления в режиме Loop —
- Первый шаг выполняется. Этот шаг позволяет инициализировать любые переменные управления контурами и увеличивать переменную счетчика шагов.
- Во-вторых, условие оценивается. Если это правда, выполняется тело цикла. Если оно ложно, тело цикла не выполняется, и поток управления переходит к следующему оператору сразу после цикла For.
- После выполнения цикла цикла For поток управления переходит к следующему оператору. Этот оператор позволяет вам обновлять любые переменные управления циклом. Он обновляется на основе значения счетчика шагов.
- Условие теперь оценивается снова. Если это правда, цикл выполняется, и процесс повторяется (тело цикла, затем увеличивают шаг, а затем снова условие). После того, как условие становится ложным, цикл For заканчивается.
пример
Добавьте кнопку и добавьте следующую функцию.
Private Sub Constant_demo_Click() Dim a As Integer a = 10 For i = 0 To a Step 2 MsgBox "The value is i is : " & i Next End Sub
Когда приведенный выше код компилируется и выполняется, он производит следующий результат.
The value is i is : 0
The value is i is : 2
The value is i is : 4
The value is i is : 6
The value is i is : 8
The value is i is : 10
Выполняет последовательность операторов несколько раз и сокращает код, управляющий переменной цикла.
for … loop
Для каждого цикла используется для выполнения оператора или группы операторов для каждого элемента в массиве или коллекции.
Для каждого цикла аналогичен For Loop; однако цикл выполняется для каждого элемента в массиве или группе. Следовательно, счетчик шагов не будет существовать в этом типе цикла. Он в основном используется с массивами или используется в контексте объектов файловой системы, чтобы работать рекурсивно.
Синтаксис
Ниже приведен синтаксис цикла For Each в VBA.
For Each element In Group [statement 1] [statement 2] .... [statement n] [Exit For] [statement 11] [statement 22] Next
пример
Private Sub Constant_demo_Click() 'fruits is an array fruits = Array("apple", "orange", "cherries") Dim fruitnames As Variant 'iterating using For each loop. For Each Item In fruits fruitnames = fruitnames & Item & Chr(10) Next MsgBox fruitnames End Sub
Когда вышеуказанный код выполняется, он печатает все имена фруктов с одним элементом в каждой строке.
apple
orange
cherries
Это выполняется, если в группе есть хотя бы один элемент и повторяется для каждого элемента в группе.
while..wend loop
В цикле While While … Wend , если условие равно True, все операторы выполняются до тех пор, пока не встретится ключевое слово Wend.
Если условие ложно, цикл завершается, и элемент управления переходит к следующему оператору после ключевого слова Wend .
Синтаксис
Ниже приведен синтаксис цикла While..Wend в VBA.
While condition(s) [statements 1] [statements 2] ... [statements n] Wend
Диаграмма потока
пример
Private Sub Constant_demo_Click() Dim Counter : Counter = 10 While Counter < 15 ' Test value of Counter. Counter = Counter + 1 ' Increment Counter. msgbox "The Current Value of the Counter is : " & Counter Wend ' While loop exits if Counter Value becomes 15. End Sub
Когда вышеуказанный код выполняется, он выводит следующее в поле сообщения.
The Current Value of the Counter is : 11
The Current Value of the Counter is : 12
The Current Value of the Counter is : 13
The Current Value of the Counter is : 14
The Current Value of the Counter is : 15
Это проверяет условие перед выполнением тела цикла.
Цикл do..while
Do … while цикл используется, когда мы хотим повторить набор операторов, пока условие истинно. Условие может быть проверено в начале цикла или в конце цикла.
Синтаксис
Ниже приведен синтаксис цикла Do … While в VBA.
Do While condition [statement 1] [statement 2] ... [statement n] [Exit Do] [statement 1] [statement 2] ... [statement n] Loop
Диаграмма потока
пример
В следующем примере используется цикл Do … while для проверки состояния в начале цикла. Операторы внутри цикла выполняются, только если условие становится True.
Private Sub Constant_demo_Click() Do While i < 5 i = i + 1 msgbox "The value of i is : " & i Loop End Sub
Когда выполняется вышеуказанный код, он печатает следующий вывод в окне сообщения.
The value of i is : 1
The value of i is : 2
The value of i is : 3
The value of i is : 4
The value of i is : 5
Альтернативный синтаксис
Существует также альтернативный синтаксис для Do … while loop, который проверяет состояние в конце цикла. Основное различие между этими двумя синтаксисами объясняется в следующем примере.
Do [statement 1] [statement 2] ... [statement n] [Exit Do] [statement 1] [statement 2] ... [statement n] Loop While condition
пример
В следующем примере используется цикл Do … while для проверки состояния в конце цикла. Заявления внутри цикла выполняются хотя бы один раз, даже если условие False.
Private Sub Constant_demo_Click() i = 10 Do i = i + 1 MsgBox "The value of i is : " & i Loop While i < 3 'Condition is false.Hence loop is executed once. End Sub
Когда выполняется вышеуказанный код, он печатает следующий вывод в окне сообщения.
The value of i is : 11
Операторы do..While будут выполняться до тех пор, пока условие равно True. (Т. Е.) Петля должна повторяться до тех пор, пока условие не будет False.
do..intil loop
Do … intil цикл не будет использован, когда мы хотим повторить набор операторов, пока условие ложно. Условие может быть проверено в начале цикла или в конце цикла.
Синтаксис
Ниже приведен синтаксис цикла Do..Until в VBA.
Do Until condition [statement 1] [statement 2] ... [statement n] [Exit Do] [statement 1] [statement 2] ... [statement n] Loop
Диаграмма потока
пример
В следующем примере используется Do … До цикла, чтобы проверить условие в начале цикла. Операторы внутри цикла выполняются только в том случае, если условие ложно. Он выходит из цикла, когда условие становится истинным.
Private Sub Constant_demo_Click() i = 10 Do Until i>15 'Condition is False.Hence loop will be executed i = i + 1 msgbox ("The value of i is : " & i) Loop End Sub
Когда выполняется вышеуказанный код, он печатает следующий вывод в окне сообщения.
The value of i is : 11
The value of i is : 12
The value of i is : 13
The value of i is : 14
The value of i is : 15
The value of i is : 16
Альтернативный синтаксис
Существует также альтернативный синтаксис Do … До цикла, который проверяет условие в конце цикла. Основное различие между этими двумя синтаксисами объясняется следующим примером.
Do [statement 1] [statement 2] ... [statement n] [Exit Do] [statement 1] [statement 2] ... [statement n] Loop Until condition
Диаграмма потока
пример
В следующем примере используется Do … До цикла, чтобы проверить условие в конце цикла. Операторы внутри цикла выполняются хотя бы один раз, даже если условие равно True.
Private Sub Constant_demo_Click() i = 10 Do i = i + 1 msgbox "The value of i is : " & i Loop Until i more15 'Condition is True.Hence loop is executed once. End Sub
Когда выполняется вышеуказанный код, он печатает следующий вывод в окне сообщения.
The value of i is : 11
Операторы do..Until будут выполняться до тех пор, пока условие False. (Т. Е.) Петля должна повторяться до тех пор, пока условие не будет истинным.
Записи управления циклом
Операторы управления циклом изменяют исполнение из своей обычной последовательности. Когда выполнение выходит из области действия, все остальные операторы цикла не выполняются.
Контрольное заявление и описание
Выход для оператора
Выход for используется , когда мы хотим , чтобы выйти из For Loop на основе определенных критериев. Когда Exit For выполняется, управление переходит к следующему оператору сразу после цикла For Loop.
Синтаксис
Ниже приведен синтаксис Exit For Statement в VBA.
Диаграмма потока
пример
В следующем примере используется Exit For . Если значение счетчика достигает 4, цикл For Loop завершается, и управление переходит к следующему утверждению сразу после цикла For Loop.
Private Sub Constant_demo_Click() Dim a As Integer a = 10 For i = 0 To a Step 2 'i is the counter variable and it is incremented by 2 MsgBox ("The value is i is : " & i) If i = 4 Then i = i * 10 'This is executed only if i=4 MsgBox ("The value is i is : " & i) Exit For 'Exited when i=4 End If Next End Sub
Когда вышеуказанный код выполняется, он печатает следующий вывод в окне сообщений.
The value is i is : 0
The value is i is : 2
The value is i is : 4
The value is i is : 40
Завершает оператор цикла For и передает выполнение в оператор сразу после цикла
Exit Do
Exit Do Заявление используется , когда мы хотим , чтобы выйти из Do Loops на основе определенных критериев. Он может использоваться как в Do Do … While, так и Do … До циклов.
Когда Exit Do выполняется, управление переходит к следующему оператору сразу после Do Loop.
Синтаксис
Ниже приведен синтаксис выражения Exit Do в VBA.
пример
В следующем примере используется Exit Do . Если значение счетчика достигает 10, выходная линия Do завершается, и управление переходит к следующему оператору сразу после цикла For Loop.
Private Sub Constant_demo_Click() i = 0 Do While i <= 100 If i > 10 Then Exit Do ' Loop Exits if i>10 End If MsgBox ("The Value of i is : " & i) i = i + 2 Loop End Sub
Когда выполняется вышеуказанный код, он печатает следующий вывод в окне сообщения.
The Value of i is : 0
The Value of i is : 2
The Value of i is : 4
The Value of i is : 6
The Value of i is : 8
The Value of i is : 10
Завершает оператор Do While и передает выполнение в оператор сразу после цикла
С уважением, авторы сайта Компьютерапия