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

Операторы For Each...Next повторяют блок операторов для каждого объекта в коллекции или каждого элемента массива.For Each...Next statements repeat a block of statements for each object in a collection or each element in an array. Visual Basic автоматически присваивает переменную при каждом выполнении цикла.Visual Basic automatically sets a variable each time the loop runs. Например, следующая процедура закрывает все формы, кроме формы, содержащей выполняемую процедуру.For example, the following procedure closes all forms except the form containing the procedure that's running.

Sub CloseForms() 
 For Each frm In Application.Forms 
 If frm.Caption <> Screen. ActiveForm.Caption Then frm.Close 
 Next 
End Sub

Указанный ниже код перебирает все элементы массива и устанавливает для каждого из них значение переменной-счетчика I.The following code loops through each element in an array and sets the value of each to the value of the index variable I.

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

Проход по диапазону ячеекLooping through a range of cells

Цикл For Each...Next можно использовать для прохода по диапазону ячеек.Use a For Each...Next loop to loop through the cells in a range. Приведенная ниже процедура проходит по диапазону ячеек A1:D10 на листе Sheet1 и присваивает каждой ячейке, абсолютное значение которой меньше 0,01, значение 0 (ноль).The following procedure loops through the range A1:D10 on Sheet1 and sets any number whose absolute value is less than 0.01 to 0 (zero).

Sub RoundToZero() 
 For Each myObject in myCollection 
 If Abs(myObject.Value) < 0.01 Then myObject.Value = 0 
 Next 
End Sub

Выход из цикла For Each...Next до его завершенияExiting a For Each...Next loop before it is finished

Из цикла For Each...Next можно выйти с помощью оператора Exit For.You can exit a For Each...Next loop by using the Exit For statement. Например, при возникновении ошибки можно использовать оператор Exit For в блоке True оператора If...Then...Else или оператора Select Case, который используется непосредственно для проверки ошибок.For example, when an error occurs, use the Exit For statement in the True statement block of either an If...Then...Else statement or a Select Case statement that specifically checks for the error. Если ошибка не возникает, оператор If…Then…Else получает значение False, и цикл продолжает работу.If the error does not occur, the If…Then…Else statement is False and the loop continues to run as expected.

В следующем примере выполняется поиск первой ячейки диапазона A1:B5, не содержащей число.The following example tests for the first cell in the range A1:B5 that does not contain a number. Если такая ячейка найдена, выводится сообщение и выполняется выход из цикла с помощью оператора Exit For.If such a cell is found, a message is displayed and Exit For exits the loop.

Sub TestForNumbers() 
 For Each myObject In MyCollection 
 If IsNumeric(myObject.Value) = False Then 
 MsgBox "Object contains a non-numeric value." 
 Exit For 
 End If 
 Next c 
End Sub

Использование цикла For Each...Next для итерации в классе VBAUsing a For Each...Next loop to iterate over a VBA class

Циклы For Each...Next осуществляют итерацию не только в массивах и экземплярах объекта Collection.For Each...Next loops don't only iterate over arrays and instances of the Collection object. Они также могут выполнять итерацию в созданном вами классе VBA.For Each...Next loops can also iterate over a VBA class that you have written.

Ниже приведен пример, в котором показано, как это сделать.Following is an example demonstrating how you can do this.

  1. Создайте модуль класса в редакторе Visual Basic (VBE) и присвойте ему имя CustomCollection.cc1Create a class module in the VBE (Visual Basic Editor), and rename it CustomCollection.cc1

  2. Вставьте следующий код в только что созданный модуль.Add the following code in the newly created class.

    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. Экспортируйте этот модуль в файл и сохраните его в локальном расположении.cc2Export this module to a file and store it locally.cc2

  4. После экспорта модуля откройте экспортированный файл, используя текстовый редактор (программы Блокнот в Windows должно быть достаточно).After you export the module, open the exported file by using a text editor (Window's Notepad software should be sufficient). Содержимое файла должно выглядеть следующим образом.The file's contents should now look like the following.

    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 в файле.Using the text editor, remove the ' character from the first line under the Property Get NewEnum() As IUnknown text in the file. Сохраните измененный файл.Save the modified .webpart file.

  6. В редакторе VBE удалите класс, созданный из проекта VBA, и не экспортируйте его при появлении соответствующего запроса.cc3Back in the VBE, remove the class that you created from your VBA project and don't choose to export it when prompted.cc3

  7. Импортируйте файл, из которого вы удалили знак ', назад в VBE.cc4Import the file that you removed the ' character from back into the VBE.cc4

  8. Выполните следующий код, чтобы проверить возможность итерации в своем созданном пользовательском классе VBA, используя VBE и текстовый редактор.Run the following code to see that you can now iterate over your custom VBA class that you have written by using both the VBE and a text editor.

    Dim Element
    Dim MyCustomCollection As New CustomCollection
    For Each Element In MyCustomCollection
    MsgBox Element
    Next
    
СноскиFootnotes ОписаниеDescription
[cc1][cc1] Вы можете создать модуль класса, выбрав Class Module (Модуль класса) в меню Insert (Вставка).You can create a class module by choosing Class Module on the Insert menu. Вы можете переименовать модуль класса, изменив его свойства в окне Properties (Свойства).You can rename a class module by modifying its properties in the Properties window.
[cc2][cc2] Вы можете активировать диалоговое окно Экспорт файла, выбрав Export File (Экспорт файла) в меню File (Файл).You can activate the Export File dialog box by choosing Export File on the File menu.
[cc3][cc3] Вы можете удалить модуль класса из VBE, выбрав Remove Item (Удалить элемент) в меню File (Файл).You can remove a class module from the VBE by choosing Remove Item on the File menu.
[cc4][cc4] Вы можете импортировать файл внешнего модуля класса, запустив диалоговое окно Импорт файла (выберите Import File (Импорт файла) в меню File (Файл)).You can import an external class-module file by activating the Import File dialog box (choose Import File on the File menu).

См. такжеSee also

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

Есть вопросы или отзывы, касающиеся Office VBA или этой статьи?Have questions or feedback about Office VBA or this documentation? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.Please see Office VBA support and feedback for guidance about the ways you can receive support and provide feedback.