For Each...Next 语句会为集合中的每个 对象并为数组中的每个元素重复语句块。 在每次循环运行时,Visual Basic 会自动设置一个变量。 例如,以下 过程 将 10 添加到 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 循环来循环访问范围中的单元格。 下面的过程将循环访问 Sheet1 上的范围 A1:D10,并将其绝对值小于 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 循环完成前退出该循环
可使用 Exit For 语句退出 For Each...Next 循环。 例如,发生错误时,可使用 If...Then...Else 语句或 Select Case 语句的 True 语句块中的 Exit For 语句,它专用于检查错误。 如果未发生错误,则 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 类
对于每个...下一个 循环不仅循环访问 集合 对象的数组和实例。 For Each...Next 循环还可以循环访问你已编写的 VBA 类。
下面的示例显示了如何完成此操作。
在 VBA(Visual Basic 编辑器)中创建一个类模块,并将其重命名为 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运行以下代码,以查看你现在是否可以循环访问使用 VBE 和文本编辑器编写的自定义 VBA 类。
Dim Element Dim MyCustomCollection As New CustomCollection For Each Element In MyCustomCollection MsgBox Element Next
| 脚注 | 说明 |
|---|---|
| [cc1] | 可以通过选择“插入”菜单上的“类模块”创建“类模块”。 可以通过在“属性”窗口中修改其属性来重命名类模块。 |
| [cc2] | 可以通过在“文件”菜单上的“导出文件”来激活“导出文件”对话框。 |
| [cc3] | 可以通过在“文件”菜单中选择“删除项”来从 VBA 中删除类模块。 |
| [cc4] | 可以通过激活“导入文件”对话框(在“文件”菜单上选择“导入文件”)来导入外部类模块文件。 |
另请参阅
支持和反馈
有关于 Office VBA 或本文档的疑问或反馈? 请参阅 Office VBA 支持和反馈,获取有关如何接收支持和提供反馈的指南。