我想遍历引用库中任何类的成员,就像使用对象浏览器完成的一样。如何使用 VBA 做到这一点?
5 回答
实际上,如何做到这一点是无证的,但是是可能的。如果您希望为集合实现 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
注意上面的属性设置。您必须使用上面的 SaveAsText 并在记事本中编辑代码。然后在调试命令行中使用 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
而且,如果您不希望将 for...each 用于集合,您可以/也可以通过以下方式设置类的默认属性:
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
然后,你可以去:
Dim n As clstest1
Dim i As Integer
Set n = New clstest1
For i = 1 To n.count
Debug.Print n(i)
Next
但是,我不知道如何自动将类的每个方法/成员自动添加到内置对象集合中(无法使用编译器选项对其进行序列化,但我已经看到每个过程的代码都具有 Attribute Item.VB_UserMemId = 1,然后是 2,然后是 3)。也许有更多知识的人可以加入)。
但是,如上所示,您可以为集合实现 for..each。如果您创建自定义项目属性,您可以为每个属性/方法实现索引。而且,如上所示,您甚至可以将您创建的项目属性设置为默认值。我输入了“可选”,因此甚至:
debug.print n
将工作,或
debug.print n.Item(1)
我从 Microsoft找到了一个KB,它允许我这样做。它还涵盖了对成员详细信息的迭代。
Private Sub ListClassesInAccess()
Dim TypeLibrary As TypeLibInfo
Dim ClassList As CoClasses
Dim i As Integer
Dim Path As String
Path = "C:\Program Files\Microsoft Office\OFFICE11\MSACC.OLB"
Set TypeLibrary = TypeLibInfoFromFile(Path)
Set ClassList = TypeLibrary.CoClasses
For i = 1 To ClassList.Count
MsgBox ClassList.Item(i).Name
Next
Set TypeLibrary = Nothing
Set ClassList = Nothing
End Sub
不幸的是,Access VBA 不支持反射。您可以尝试创建自己的对象层次结构抽象,为您检查属性值等。你可能会从这样的事情开始:
http://msdn.microsoft.com/en-us/library/aa663065%28office.11%29.aspx
如果您安装了 VB6 - 那么您可以尝试 tlbinf32.dll。AFAIR - 如果有多个类来获取任何类型库的信息,请参阅http://support.microsoft.com/kb/224331