Поделиться через


Использование операторов For Each...Next

Операторы For Each...Next повторяют блок операторов для каждого объекта в коллекции или каждого элемента массива. Visual Basic автоматически присваивает переменную при каждом выполнении цикла. Например, следующая процедура добавляет 10 к значению каждой ячейки в диапазоне от A1 до A10.

Sub Add10ToAllCellsInRange()
    Dim rng As Range
    For Each rng In Range("A1:A10")
        rng.Value = rng.Value + 10
    Next
End Sub

Указанный ниже код перебирает все элементы массива и устанавливает для каждого из них значение переменной-счетчика I.

Sub SetArrayValue()
    Dim TestArray(10) As Integer, I As Variant 
        For Each I In TestArray 
        TestArray(I) = I 
    Next I 
End Sub

Проход по диапазону ячеек

Цикл For Each...Next можно использовать для прохода по диапазону ячеек. Приведенная ниже процедура проходит по диапазону ячеек A1:D10 на листе Sheet1 и присваивает каждой ячейке, абсолютное значение которой меньше 0,01, значение 0 (ноль).

Sub RoundToZero() 
    For Each rng in Range("A1:D10") 
        If Abs(rng.Value) < 0.01 Then rng.Value = 0 
    Next 
End Sub

Выход из цикла For Each...Next до его завершения

Из цикла For Each...Next можно выйти с помощью оператора Exit For. Например, при возникновении ошибки можно использовать оператор Exit For в блоке True оператора If...Then...Else или оператора Select Case, который используется непосредственно для проверки ошибок. Если ошибка не возникает, оператор If…Then…Else получает значение False, и цикл продолжает работу.

В следующем примере выполняется поиск первой ячейки диапазона A1:B5, не содержащей число. Если такая ячейка найдена, выводится сообщение и выполняется выход из цикла с помощью оператора Exit For.

Sub TestForNumbers() 
    For Each rng In Range("A1:B5") 
        If IsNumeric(rng.Value) = False Then 
            MsgBox "Cell " & rng.Address & " contains a non-numeric value." 
            Exit For 
        End If 
    Next rng 
End Sub

Использование цикла For Each...Next для итерации в классе VBA

Для каждого... Следующие циклы не только итерируют массивы и экземпляры объекта Collection . Они также могут выполнять итерацию в созданном вами классе VBA.

Ниже приведен пример, в котором показано, как это сделать.

  1. Создайте модуль класса в редакторе Visual Basic (VBE) и присвойте ему имя CustomCollection.cc1

  2. Вставьте следующий код в только что созданный модуль.

    Private MyCollection As New Collection
    
    ' The Initialize event automatically gets triggered
    ' when instances of this class are created.
    ' It then triggers the execution of this procedure.
    Private Sub Class_Initialize()
        With MyCollection
            .Add "First Item"
            .Add "Second Item"
            .Add "Third Item"
        End With
    End Sub
    
    ' Property Get procedure for the setting up of
    ' this class so that it works with 'For Each...'
    ' constructs.
    Property Get NewEnum() As IUnknown
    ' Attribute NewEnum.VB_UserMemId = -4
    
    Set NewEnum = MyCollection.[_NewEnum]
    End Property
    
  3. Экспортируйте этот модуль в файл и сохраните его в локальном расположении.cc2

  4. После экспорта модуля откройте экспортированный файл, используя текстовый редактор (программы Блокнот в Windows должно быть достаточно). Содержимое файла должно выглядеть следующим образом.

    VERSION 1.0 CLASS
    BEGIN
    MultiUse = -1  'True
    END
    Attribute VB_Name = "CustomCollection"
    Attribute VB_GlobalNameSpace = False
    Attribute VB_Creatable = False
    Attribute VB_PredeclaredId = False
    Attribute VB_Exposed = False
    Private MyCollection As New Collection
    
    ' The Initialize event automatically gets triggered
    ' when instances of this class are created.
    ' It then triggers the execution of this procedure.
    Private Sub Class_Initialize()
        With MyCollection
            .Add "First Item"
            .Add "Second Item"
            .Add "Third Item"
        End With
    End Sub
    
    ' Property Get procedure for the setting up of
    ' this class so that it works with 'For Each...'
    ' constructs.
    Property Get NewEnum() As IUnknown
    ' Attribute NewEnum.VB_UserMemId = -4
    
    Set NewEnum = MyCollection.[_NewEnum]
    End Property
    
  5. Используя текстовый редактор, удалите знак ' из первой строки под текстом Property Get NewEnum() As IUnknown в файле. Сохраните измененный файл.

  6. В редакторе VBE удалите класс, созданный из проекта VBA, и не экспортируйте его при появлении соответствующего запроса.cc3

  7. Импортируйте файл, из которого вы удалили знак ', назад в VBE.cc4

  8. Выполните следующий код, чтобы проверить возможность итерации в своем созданном пользовательском классе VBA, используя VBE и текстовый редактор.

    Dim Element
    Dim MyCustomCollection As New CustomCollection
    For Each Element In MyCustomCollection
        MsgBox Element
    Next
    
Сноски Описание
[cc1] Вы можете создать модуль класса, выбрав Class Module (Модуль класса) в меню Insert (Вставка). Вы можете переименовать модуль класса, изменив его свойства в окне Properties (Свойства).
[cc2] Вы можете активировать диалоговое окно Экспорт файла, выбрав Export File (Экспорт файла) в меню File (Файл).
[cc3] Вы можете удалить модуль класса из VBE, выбрав Remove Item (Удалить элемент) в меню File (Файл).
[cc4] Вы можете импортировать файл внешнего модуля класса, запустив диалоговое окно Импорт файла (выберите Import File (Импорт файла) в меню File (Файл)).

См. также

Поддержка и обратная связь

Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.