代码之家  ›  专栏  ›  技术社区  ›  Curtis Inderwiesche

在VBA中迭代对象浏览器

  •  4
  • Curtis Inderwiesche  · 技术社区  · 15 年前

    我想迭代引用库中任何类的成员,就像使用对象浏览器一样。如何使用VBA完成此操作?

    5 回复  |  直到 6 年前
        1
  •  9
  •   Albert D. Kallal    15 年前

    实际上,如何做到这一点是没有文件证明的,但也是可能的。如果要为集合实现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
    

    而且,如果您不想将…每个用于集合,您也可以/也可以通过执行以下操作来设置类的默认属性:

    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)
    
        2
  •  3
  •   Curtis Inderwiesche    11 年前

    我找到了一个 KB from Microsoft 这让我可以这么做。它还包括对成员细节的迭代。

    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
    
        3
  •  2
  •   Andy West    15 年前

    不幸的是,Access VBA不支持反射。您可以尝试创建自己的对象层次结构抽象,它将为您检查属性值等。您可以从以下内容开始:

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

        4
  •  1
  •   Alex Dybenko    15 年前

    如果安装了vb6,则可以尝试tlbinf32.dll。afair-if有许多类可以获取任何类型库的信息 见 http://support.microsoft.com/kb/224331

        5
  •  1
  •   user110236    15 年前
    推荐文章