Vba цикл for: VBA Excel. Цикл For… Next
Содержание
VBA Excel. Цикл For… Next
Цикл For… Next в VBA Excel, его синтаксис и описание отдельных компонентов. Примеры использования цикла For… Next.
Цикл For… Next в VBA Excel предназначен для выполнения группы операторов необходимое количество раз, заданное управляющей переменной цикла — счетчиком. При выполнении цикла значение счетчика после каждой итерации увеличивается или уменьшается на число, указанное выражением оператора Step, или, по умолчанию, на единицу. Когда необходимо применить цикл к элементам, количество которых и индексация в группе (диапазон, массив, коллекция) неизвестны, следует использовать цикл For Each… Next.
Синтаксис цикла For… 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:
1 2 3 4 5 6 | Sub test1() Dim i As Long For i = 1 To 10 Cells(i, 1) = i Next End Sub |
Простейший цикл с шагом
В предыдущий цикл добавлен оператор Step со значением 3, а результаты записываем во второй столбец:
1 2 3 4 5 6 | Sub test2() Dim i As Long For i = 1 To 10 Step 3 Cells(i, 2) = i Next End Sub |
Цикл с отрицательными аргументами
Этот цикл заполняет десять первых ячеек третьего столбца в обратной последовательности:
1 2 3 4 5 6 | Sub test3() Dim i As Long For i = 0 To -9 Step -1 Cells(i + 10, 3) = i + 10 Next End Sub |
Увеличиваем размер шага до -3 и записываем результаты в четвертый столбец активного листа Excel:
1 2 3 4 5 6 | Sub test4() Dim i As Long For i = 0 To -9 Step -3 Cells(i + 10, 4) = i + 10 Next End Sub |
Вложенный цикл
Внешний цикл последовательно задает индексы первых десяти строк активного листа, а вложенный цикл складывает числа в первых четырех ячейках строки с текущем индексом и записывает сумму в ячейку пятого столбца. Перед запуском вложенного цикла с накопительным сложением, пятую ячейку соответствующей строки обнуляем, чтобы в случае нахождения в ней какого-либо числа, оно не прибавилось к итоговой сумме.
1 2 3 4 5 6 7 8 9 10 | 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:
1 2 3 4 5 6 7 | Sub test6() Dim i As Long For i = 1 To 10 Cells(i, 6) = Choose(i, «Медведь», «Слон», «Жираф», «Антилопа», _ «Крокодил», «Зебра», «Тигр», «Ящерица», «Лев», «Бегемот») Next End Sub |
Следующий цикл будет искать в шестом столбце крокодила, который съел галоши. В ячейку седьмого столбца цикл, пока не встретит крокодила, будет записывать строку «Здесь был цикл», а когда обнаружит крокодила, запишет «Он съел галоши» и прекратит работу, выполнив команду Exit For. Это будет видно по ячейкам рядом с названиями животных ниже крокодила, в которых не будет текста «Здесь был цикл».
1 2 3 4 5 6 7 8 9 10 11 | 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.
Содержание рубрики VBA Excel по тематическим разделам со ссылками на все статьи.
Циклы VBA: for, while и другие
Доброго времени суток! Данную статью я решил посвятить рубрике по основам программирования в Visual Basic for Application. И сегодня мы поговорим о циклах в VBA, разберём их синтаксис и рассмотрим несколько примеров, которые часто встречаются программисту.
Сначала напомню, что цикл — процесс повторения части кода, выполняемый, пока не будет выполнено или нарушено заданное нами условие.
В данной статье мы разберём синтаксис и примеры следующих циклов в VBA:
- For
- For each
- While
- Until
Цикл For в VBA
Цикл for в VBA обычно используется при зацикливании фрагмента кода, если нам известно конечное значение counter — счетчика, при котором мы выйдем из цикла.
Возьмём для примера самый распространённый пример:
Сгенерировать массив из 5 целых значений
Dim mas(5) As Integer For i% = 0 To 4 mas(i) = Int((10 * Rnd) + 1) Next i
Обратите ваше внимание, что в этом примере используется неявное объявление при работе с циклами в VBA. i% — означает неявное объявление переменной i в формате integer. Такая конструкция по сути заменяет следующую: dim i as integer
. Это используется для сокращения кода и для удобства написания и чтения. В старых версиях VBA необходимо указывать знак формата после каждого использования неявной переменной. В более поздних версиях достаточно всего один раз.
VBA для цикла for даёт возможность использовать функцию Step. Как ясно из перевода, это шаг, с которым мы будем проходить наш интервал. По умолчанию, он равен 1. Популярный вариант использования встречается в случаях, когда counter связан с переменной, используемой внутри цикла. Например, при написании программ, связанных с функциями.
Найти пересечение графика функции y = 5*x + 5 с осью ординат
Function expr(x As Integer) As Integer expr = 5 * x + 5 End Function Sub CodeTown() Dim i As Integer For i = -10 To 10 Step 1 If expr(i) = 0 Then MsgBox "При Y = 0, Х = "+ CStr(i) Next i End Sub
Теперь представим, что у нас достаточно большой диапазон и мы не хотим заставлять компьютер считать лишние итерации. На этот случай существует команда Exit For. Перепишем наш последний пример с новой командой.
Function expr(x As Integer) As Integer expr = 5 * x + 5 End Function Sub CodeTown() Dim i As Integer For i = -10 To 10 Step 1 If expr(i) = 0 Then MsgBox "При Y = 0, Х = "+ CStr(i) Exit For End If Next i End Sub
C помощью команды Exit можно закончить выполнение любого цикла в VBA. Достаточно указать после Exit название используемого цикла. Также им возможно завершить работу любой процедуры или функции.
Цикл For Each в VBA
For Each в VBA основан на переборе всех элементов, указанного типа в массиве, объекте или группе.
Самый популярный вариант его использования — перебор страниц в рабочей книге.
Вывести названия всех листов в рабочей книге
For Each ws In ThisWorkbook.Worksheets MsgBox ws.Name Next ws
И ещё один интересный пример:
Изменить размер шрифта и выравнить по центру текст в label
For Each element In UserForm1.Controls If InStr(1, UserForm1.Controls.Item(i%).Name, "Label") > 0 Then UserForm1.Controls.Item(i%).TextAlign = fmTextAlignCenter UserForm1.Controls.Item(i%).Font.Size = 20 i% = i% + 1 End If Next element
Тут следует понимать, что через Controls можно обратиться к любому элементу формы. Если отфильтровать по имени, например, как мы сделали выше, то можно выделить группы элементов и изменить их свойства. В данном случае, размер шрифта и выравнивание.
Цикл While в VBA
Циклы в VBA, которые используют структуру Do..Loop (это while и until циклы) можно записывать с разным расположением фрагмента условия. Как видите на картинке выше, условие может проверяться после выполнения одной итерации, а может перед запуском цикла.
Самый популярный пример:
Отсортируйте по возрастанию сгенерированный массив методом пузырька
Dim mas(5) As Integer For i% = 0 To 4 mas(i%) = Int((10 * Rnd) + 1) Next i Dim count As Integer, temp As Integer count = 1 Do While count > 0 count = 0 For i% = 0 To 3 If mas(i) > mas(i + 1) Then temp = mas(i) mas(i) = mas(i + 1) mas(i + 1) = temp count = count + 1 End If Next i% Loop
В вышеуказанном примере мы отсортировали массив с рандомными значениями в порядке возрастания. Метод пузырька считается достаточно долгим, но простым в реализации. В основном, им сортируют небольшие числовые массивы.
Цикл Until в VBA
Как видите, отличия от while крайне несущественные. Цикл Until в VBA можно реализовать с помощью конструкции while NOT (condition). Тем не менее, приведу пример:
Заставить пользователя ввести число
Dim temp As Variant Do temp = InputBox("Введите число") Loop Until IsNumeric(temp)
Почему заставить? Потому, что если пользователь закроет окно ввода, это его не спасёт, оно будет появляться вновь и вновь пока он не введёт любое число.
На этом мы закончим. Сегодня мы рассмотрели важную тему циклов в VBA, разобрали основные примеры. Конечно все примеры по этой обширной теме сложно разобрать, но, тем не менее, основы вы должны понять. Оставляйте ваши комментарии, если у вас возникли вопросы.
Скачать исходник
Для…Следующая инструкция (VBA) | Microsoft Узнайте
Редактировать
Твиттер
Фейсбук
Электронная почта
- Статья
Повторяет группу операторов указанное количество раз.
Синтаксис
Для счетчик = начало К конец [ Шаг Шаг ]
[ Операторы ]
[ Выход Для ]
[ Операторы ]
Следующий [ счетчик ]
Для… Следующий синтаксис инструкции состоит из следующих частей:
Часть | Описание |
---|---|
счетчик | Обязательно. Числовая переменная, используемая в качестве счетчика циклов. Переменная не может быть логическим значением или элементом массива. |
начало | Обязательно. Начальное значение счетчика . |
конец | Обязательно. Окончательное значение счетчика . |
шаг | Дополнительно. Счетчик суммы изменяется каждый раз в цикле. Если не указано, шаг по умолчанию равен единице. |
выписки | Дополнительно. Одно или несколько утверждений между Для и Следующие выполняются указанное количество раз. |
Аргумент шага может быть как положительным, так и отрицательным. Значение аргумента шага определяет обработку цикла следующим образом.
Значение | Цикл выполняется, если |
---|---|
Положительный или 0 | счетчик <= конец |
Отрицательный | счетчик >= конец |
После выполнения всех инструкций в цикле шаг добавляется к счетчику . В этот момент либо операторы в цикле выполняются снова (на основе того же теста, который вызвал первоначальное выполнение цикла), либо цикл завершается, и выполнение продолжается с оператора, следующего за оператором Next .
Совет
Изменение значения счетчика внутри цикла может затруднить чтение и отладку кода.
Любое количество операторов Exit For может быть размещено в любом месте цикла в качестве альтернативного способа выхода. Exit For часто используется после оценки некоторого условия, например If…Then , и передает управление оператору, непосредственно следующему за Next .
Вы можете вложить циклы For…Next , поместив один цикл For…Next в другой. Дайте каждому циклу уникальное имя переменной в качестве счетчика . Следующая конструкция верна:
Для I = от 1 до 10 Для J = от 1 до 10 Для К = от 1 до 10 ... Следующий К Следующий J Далее я
Примечание
Если вы опустите счетчик в операторе Next , выполнение продолжится, как если бы счетчик был включен. Если оператор Next встречается перед соответствующим оператором For , возникает ошибка.
Пример
В этом примере оператор For…Next используется для создания строки, содержащей 10 экземпляров чисел от 0 до 9., каждая строка отделена от другой одним пробелом. Внешний цикл использует переменную счетчика цикла, которая уменьшается каждый раз в цикле.
Dim Words, Charms, MyString For Words = 10 To 1 Step -1 ' Установите 10 повторений. For Chars = 0 To 9 ' Установите 10 повторений. MyString = MyString & Chars ' Добавляет число к строке. Next Chars ' Счетчик приращений MyString = MyString & " " ' Добавляем пробел. Следующие слова
См. также
- Ускорение цикла For…Next
- Использование операторов For…Next
- Для каждого… следующего оператора
- Типы данных
- Заявления
Поддержка и отзывы
Есть вопросы или отзывы об Office VBA или этой документации? См. раздел Поддержка и отзывы Office VBA, чтобы узнать, как вы можете получить поддержку и оставить отзыв.
VBA FOR LOOP (для следующего, для каждого) — руководство + примеры
Главная > VBA > VBA FOR LOOP (For Next, For Each) — руководство + примеры 002 Для каждого следующего цикла
Синтаксис
Пример для понимания цикла For Each Next
Связанные учебные пособия
Ключевые моменты
For Next Loop
VBA FOR NEXT — фиксированный цикл, использующий счетчик для выполнения итераций. Проще говоря, вам нужно указать, сколько раз вы хотите запустить цикл, и как только он достигнет этого цикла, он автоматически остановится. Вот почему это фиксированный цикл, наиболее популярный среди разработчиков VBA.
Синтаксис
Ниже приведен синтаксис для следующего цикла VBA:
Для счетчика = от начала до конца [размер шага]
[заявления]
Далее [счетчик]
- Счетчик : это переменная, которая хранит количество повторений и увеличивает свое значение с каждым повторением. Например, если цикл находится в пятом повторении, значение счетчика будет равно пяти, и как только цикл выполнит оператор для пятой итерации, значение счетчика изменится на шесть.
- Start : Это числовая переменная, в которой хранится начальное значение счетчика.
- End : Это числовая переменная, в которой хранится конечное значение счетчика.
- Размер шага : Эта переменная определяет большое увеличение или уменьшение значения счетчика. По умолчанию размер шага равен единице, но вы также можете использовать любое положительное или отрицательное значение.
- Заявление : это набор кода, который вы хотите выполнять на каждой итерации цикла For Next.
- Next : это оператор конца для одной итерации цикла, который использует значение счетчика, чтобы указать VBA повторить цикл, и как только счетчик достигает конечного значения, он завершает цикл.
Пример для понимания следующего цикла
Чтобы понять, как использовать его для следующего цикла, давайте напишем простой код для добавления серийных номеров в столбец.
Позвольте мне немного уточнить: Нам нужно написать код, который может переходить от выбранной ячейки к следующим 10 ячейкам одну за другой и добавлять серийные номера только на снимке ниже.
Чтобы использовать следующий цикл, вы можете выполнить следующие шаги:
- Во-первых, вам нужно объявить переменную, которую вы можете использовать для хранения значения счетчика.
- Далее нам нужно присвоить переменной значение счетчика.
- Теперь пришло время написать код для цикла, поэтому в первой строке вам нужно использовать переменную счетчика и определить начальное и конечное значение. Здесь, в этом коде, у вас есть переменная «i» в качестве конечного значения.
- Отсюда вам нужно написать код, который может добавить серийные номера в активную ячейку, а затем перейти к следующей ячейке. Поскольку значение счетчика увеличивается на каждой итерации, вы можете использовать его для ввода серийного номера в активную ячейку, а после этого вы можете использовать смещение, чтобы переместить выделение на следующую ячейку вниз.
- В конце используйте ключевое слово next и переменную counter для завершения кода цикла.
SubAddSerialNumbers()
Dim i как целое число
я = 10
Для i = 1 Для i
ActiveCell.Value = я
ActiveCell.Offset(1, 0).Активировать
Далее я
Конец суб
Вы можете видеть на снимке ниже, когда я запускаю этот код, он начинается с выбранной ячейки путем ввода серийного номера, а затем переходит к следующей ячейке с каждой итерацией.
Как вы знаете, For Next — это фиксированный цикл, и в этом коде, когда вы присваиваете числовое значение, VBA указывает, что цикл должен выполняться указанное количество раз.
И вы можете видеть снимок ниже, который я сделал во второй итерации цикла, где значение переменной-счетчика «i» равно двум.
Я пытаюсь подчеркнуть, что счетная переменная изменяет свое значение на каждой итерации и вводит это значение в активную ячейку, а затем смещение активирует следующую ячейку, расположенную ниже той, которая завершает одну итерацию.
В конце концов, ключевое слово «Далее» — это VBA, чтобы вернуться к первой строке цикла и повторить его. Как вы видели в синтаксисе For Next, вы также можете использовать значение шага в цикле, чтобы счетчик работал в соответствии с ним.
Таким образом, если вы используете два в качестве значения шага, код будет примерно таким, как показано ниже.
Sub AddSerialNumbers()
Dim i как целое число
я = 10
Для i = 1 Для i Шаг 2
ActiveCell.Value = я
ActiveCell.Offset(1, 0).Активировать
Далее я
Конец суб
И когда вы запустите этот код, он будет работать примерно так, как показано ниже.
Когда вы используете значение шага (например, шаг 2, который вы использовали в приведенном выше коде), VBA пропускает каждую вторую итерацию в цикле, и, как вы можете видеть, у вас есть пять чисел с разницей в один в каждом числе .
Примечание : В приведенном выше примере вы использовали «i» в качестве переменной-счетчика, но вы также можете использовать другое имя по своему усмотрению.
For Each Next Loop
VBA FOR EACH NEXT — это фиксированный цикл, который может перебирать все объекты в коллекции. В For Each Next вам не нужно указывать количество итераций. Вместо этого вы можете указать набор объектов, и он сможет перебирать все эти объекты один за другим.
Например, : Если вы хотите перебрать все ячейки из диапазона. В этом случае диапазон — это коллекция, а ячейки — это объекты, которые у вас есть.
Синтаксис
Ниже приведен синтаксис VBA для каждого следующего цикла:
для каждого объекта в коллекции
[заявления]
Next [object]
- Объект : представляет один объект в коллекции объектов, в которых вы зацикливаетесь. С каждой итерацией происходит переход от одного объекта к другому.
- Коллекция : Это коллекция объектов, которые вы хотите зациклить.
- Заявление : строки кода, которые необходимо выполнить в каждом цикле для всех объектов в коллекции.
- Next : это оператор завершения одной итерации цикла, который указывает VBA перейти к следующему объекту в коллекции.
Пример для понимания цикла For Each Next
Чтобы понять цикл For Each Next, давайте напишем код для скрытия всех листов, кроме активного рабочего листа. Этот код проверит имя каждого рабочего листа и сопоставит его с именем активного рабочего листа и скроет его, если оно не совпадает.
Чтобы использовать цикл For Each Next, вы можете использовать следующие шаги:
- Во-первых, вам нужно объявить переменную для использования в качестве рабочего листа.
- После этого используйте ключевое слово «Для каждого», а затем переменную «mySheet» для листа и используйте «ActiveWorkbook.Worksheets» для сбора листов из активной книги.
- Затем вам нужно использовать оператор VBA IF, чтобы проверить, НЕ РАВНО ли имя листа, который в данный момент находится в этой итерации цикла, активному рабочему листу, и если это условие истинно, то скрыть лист, который сейчас находится в цикле итерация.