Frage

Ich mag durch Mitglieder einer Klasse in einer referenzierten Bibliothek viel iterieren gern getan wird, um den Objekt-Browser verwenden. Wie kann dies geschehen VBA?

War es hilfreich?

Lösung 2

fand ich ein KB von Microsoft die ich tun durfte nur. Es umfasst auch Iteration über Mitglied Details auch.

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

Andere Tipps

Eigentlich wie dies zu tun ist nicht dokumentiert, aber es ist möglich. Wenn Ihr auf der Suche eine for..Each Syntax für eine Sammlung zu implementieren, können Sie wie folgt vor:

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

Beachten Sie die Attributeinstellungen in der oben. Sie haben die SaveAsText und Bearbeiten von Code, wie oben im Editor zu verwenden. Sie dann wieder importieren Sie den Code loadfromText in der Debug-Befehlszeile. Sobald Sie die oben tun, dann können Sie gehen:

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

Und wenn Sie nicht zu verwenden, suchen sie ... jeweils für eine Sammlung, könnte Du / kann auch eine Standardeigenschaft der Klasse, indem Sie:

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

Dann können Sie gehen:

Dim n       As clstest1
Dim i       As Integer

Set n = New clstest1

For i = 1 To n.count
   Debug.Print n(i)
Next

Allerdings bewusst, dass ich nicht, wie Sie die automatischen jede Methode / Mitglied der Klasse zu einer integrierten Objektsammlung automatischer hinzufügen können (es gibt keine Möglichkeit, dies mit Compiler-Optionen zur Serialisierung, aber ich habe Code mit jedem Verfahren mit Attribute gesehen Item.VB_UserMemId = 1, dann 2, dann 3). Vielleicht hat jemand mit mehr Wissen kann in springen).

Da jedoch die oben zeigt, können Sie eine for..each für Sammlungen implementieren. Und Sie können einen Index für jede der Eigenschaften / Methoden implementieren, wenn Sie eine benutzerdefinierte Elementeigenschaft erstellen. Und, wie die oben zeigt, können Sie einstellen, auch das Element Eigenschaft, die Sie als Standard erstellen. Ich habe in der „optional“ und damit auch:

debug.print n

Wird arbeiten, oder

debug.print n.Item(1)

Leider Access VBA unterstützt keine Reflexion. Sie könnten versuchen, Ihre eigene Abstraktion der Objekthierarchie erstellen, die Eigenschaftswerte inspizieren etc. für Sie. Sie könnten mit etwas wie folgen beginnen:

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

Wenn Sie VB6 installiert haben - dann können Sie Tlbinf32.dll versuchen. AFAIR - wenn Anzahl der Klassen hat Informationen jeglicher Typelibrary zu erhalten Siehe http://support.microsoft.com/kb/224331

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top