相关文章推荐
八块腹肌的小蝌蚪  ·  WP ListBox ...·  1 年前    · 
踢足球的帽子  ·  MVVM架构与MVVM ...·  1 年前    · 
绅士的机器人  ·  fastjson 添加key ...·  1 年前    · 

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
End Sub

下面的代码将循环访问数组中的每个元素,并将每个元素的值设置为索引变量 I 的值。

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

循环读取一系列单元格

使用 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 
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 编辑器)中创建一个类模块,并将其重命名为 CustomCollectioncc1

  • 将以下代码置于新建模块中。

    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
    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
    
  •