Оператор For Each…Next не использует счётчик циклов. Он повторяет блок операторов для каждого объекта коллекции (о коллекциях мы поговорим немного позже), или каждого элемента массива.
Содержание урока:
Синтаксис For Each…Next в VBA
For Each элемент In группа
(операторы)
Next элемент
Здесь,
- элемент – переменная, которая используется для интерации (повторения) по всем элементам коллекции, или массиву.
- группа – определяет объект коллекции, или массив.
Если в параметре группа указан объект коллекции, то переменная элемент может иметь тип Variant, Object, или такой же тип как у коллекции.
Если в параметре группа указан массив, то переменная элемент обязательно должна быть объявлена только с типом Variant.
Пример кода For Each…Next в VBA
Sub myCode()
For Each myNum In Range("A1:A5")
myNum.Value = 0
Next myNum
End Sub
В данном примере, происходит проход по диапазону ячеек и заполнение их указанным значением. То есть в каждую ячейку в диапазоне от A1 по A5 будет записан 0.
Результат

Если вдруг мы захотим дописать какое-нибудь значение в эти ячейки до уже имеющегося, то можно использовать следующий код:
Sub myCode()
myNum = 0
For Each myNum In Range("A1:A5")
myNum.Value = myNum + 2
Next myNum
End Sub
В данном примере, происходит проход по ячейкам в диапазоне от A1 по A5 и к уже имеющемуся значению в этих ячейках добавляется 2. То есть, если например, в ячейке A1 у нас изначально было записано число 1, то после выполнения нашей программы там уже будет записано 3 потому что 1+2=3.
Результат

Чтобы закрепить данную тему, давайте рассмотрим ещё и пример использования цикла For Each…Next при работе с массивами:
Sub myCode()
Dim myElem As Variant, myName As String, myGroup As Variant
myGroup = Array("Іван", "Степан", "Сергій", "Юлія", "Марина")
myName = "Масив містить наступні імена:" & Chr(13)
For Each myElem In myGroup
myName = myName & Chr(13) & myElem
Next
MsgBox myName
End Sub
Результат

Принудительный выход из цикла For Each…Next
Для того чтобы прервать цикл до его завершения используют Exit For. Например, в следующем коде, мы проходим по диапазону ячеек от A1 по A5, но как только нам попадается пустая ячейка (в которой ничего не записано), то цикл сразу же прерывается.
Sub myCode()
For Each rng In Range("A1:A5")
If rng.Value = "" Then
MsgBox "Комірка " & rng.Address & " пуста."
Exit For
End If
Next
End Sub
Результат

