实际上,如何做到这一点是没有证件的,但是可能的.如果您希望为集合实现for..Each语法,则可以执行以下操作:
Option Compare Database
Option Explicit
Public colT As New Collection
Public Function NewEnum() As IUnknown
Set NewEnum = colT.[_NewEnum]
End Function
Public Property Get NextItem() As IUnknown
Attribute NextItem.VB_UserMemId = -4
Attribute NextItem.VB_MemberFlags = "40"
Set NextItem = colT.[_NewEnum]
End Property
Run Code Online (Sandbox Code Playgroud)
请注意上面的属性设置.你必须在记事本中使用SaveAsText并编辑上面的代码.然后使用debug命令行中的loadfromText重新导入代码.完成上述操作后,您可以:
Dim n As clstest1
Dim v As Variant
Set n = New clstest1
[ code here that adds to collection]
For Each v In n
Debug.Print v
Next
Run Code Online (Sandbox Code Playgroud)
并且,如果你不想用于...每个集合,你可以/也可以通过以下方式设置类的默认属性:
Public Property Get Item(Optional ndx As Integer = 1) As Variant
Attribute Item.VB_UserMemId = 0
Select Case ndx
Case 1: Item = Me.s1
Case 2: Item = Me.s2
Case 3: Item = Me.s3
End Select
End Property
Public Property Get count() As Integer
count = 3
End Property
Run Code Online (Sandbox Code Playgroud)
然后,你可以去:
Dim n As clstest1
Dim i As Integer
Set n = New clstest1
For i = 1 To n.count
Debug.Print n(i)
Next
Run Code Online (Sandbox Code Playgroud)
但是,我不知道如何自动将类的每个方法/成员自动添加到内置对象集合中(没有办法使用编译器选项对其进行序列化,但我看到每个过程都有属性Item.VB_UserMemId的代码= 1,然后是2然后3).也许有更多知识的人可以跳进去).
但是,如上所示,您可以为集合实现for..each.如果创建自定义项属性,则可以为每个属性/方法实现索引.并且,如上所示,您甚至可以将您创建的项属性设置为默认值.我放入"可选",因此甚至:
debug.print n
Run Code Online (Sandbox Code Playgroud)
会工作,还是
debug.print n.Item(1)
Run Code Online (Sandbox Code Playgroud)