4

我想遍历引用库中任何类的成员,就像使用对象浏览器完成的一样。如何使用 VBA 做到这一点?

4

5 回答 5

9

实际上,如何做到这一点是无证的,但是是可能的。如果您希望为集合实现 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)
于 2009-12-12T23:34:23.173 回答
3

我从 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
于 2010-06-30T21:53:54.500 回答
2

不幸的是,Access VBA 不支持反射。您可以尝试创建自己的对象层次结构抽象,为您检查属性值等。你可能会从这样的事情开始:

http://msdn.microsoft.com/en-us/library/aa663065%28office.11​​%29.aspx

于 2009-12-12T02:37:43.757 回答
1

如果您安装了 VB6 - 那么您可以尝试 tlbinf32.dll。AFAIR - 如果有多个类来获取任何类型库的信息,请参阅http://support.microsoft.com/kb/224331

于 2009-12-16T12:44:12.937 回答
1

这可能会有所帮助http://msdn.microsoft.com/en-us/magazine/bb985086.aspx

于 2010-06-30T22:54:16.747 回答