Использование операторов 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.
Ниже приведен пример, в котором показано, как это сделать.
Создайте модуль класса в редакторе Visual Basic (VBE) и присвойте ему имя CustomCollection.cc1
Вставьте следующий код в только что созданный модуль.
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
Экспортируйте этот модуль в файл и сохраните его в локальном расположении.cc2
После экспорта модуля откройте экспортированный файл, используя текстовый редактор (программы Блокнот в 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
Используя текстовый редактор, удалите знак
'
из первой строки под текстомProperty Get NewEnum() As IUnknown
в файле. Сохраните измененный файл.В редакторе VBE удалите класс, созданный из проекта VBA, и не экспортируйте его при появлении соответствующего запроса.cc3
Импортируйте файл, из которого вы удалили знак
'
, назад в VBE.cc4Выполните следующий код, чтобы проверить возможность итерации в своем созданном пользовательском классе 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 и обратная связь.