Iterieren durch den Object Browser in VBA
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?
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
Dies kann hilfreich sein, http://msdn.microsoft.com/en -US / Magazin / bb985086.aspx