Оператор 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
Результат

