For Each Next VBA

Оператор For Each…Next в VBA. Урок №30

Оператор 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.

Результат

for each next пример

Если вдруг мы захотим дописать какое-нибудь значение в эти ячейки до уже имеющегося, то можно использовать следующий код:

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

Чтобы закрепить данную тему, давайте рассмотрим ещё и пример использования цикла 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 массив

Принудительный выход из цикла 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 

Результат

for each next exit for

Main Menu