Scorrendo il Visualizzatore oggetti in VBA
Domanda
Vorrei per scorrere i membri di una classe in una libreria di riferimento molto simile viene fatto utilizzando il Visualizzatore oggetti. Come può questo essere fatto utilizzando VBA?
Soluzione 2
Ho trovato un KB di Microsoft che mi ha permesso di fare proprio questo. Esso copre anche l'iterazione su dettagli Stati pure.
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
Altri suggerimenti
In realtà, come fare questo è documentato, ma è possibile. Se la vostra ricerca per implementare una sintassi for..Each per una collezione, allora si può fare quanto segue:
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
Si notino le impostazioni degli attributi di cui sopra. Devi usare il SaveAsText e modificare il codice come sopra in notepad. È quindi reimportare il codice utilizzando loadfromText nella riga di comando di debug. Una volta fatto ciò, allora si può andare:
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
E, se non cercando di utilizzare per la ... ciascuno per una collezione, si potrebbe / può anche impostare una proprietà di default della classe andando:
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
Quindi, si può andare:
Dim n As clstest1
Dim i As Integer
Set n = New clstest1
For i = 1 To n.count
Debug.Print n(i)
Next
Tuttavia, non riesco a conoscenza come è possibile aggiungere automaticamente ogni metodo / membro della classe da un built-in di raccolta oggetto automatico (non v'è alcun modo per serializzare questo con opzioni del compilatore, ma ho visto il codice di ogni procedura che ha attributo Item.VB_UserMemId = 1, quindi 2 quindi 3). Forse qualcuno con più conoscenza può saltare in).
Tuttavia, come gli spettacoli di cui sopra, è possibile implementare un for..each per le collezioni. E si può implementare un indice per ciascuna delle proprietà / metodi se si crea una proprietà elemento personalizzato. E, come gli spettacoli di cui sopra, si può anche impostare la proprietà oggetto si crea come predefinito. Ho messo nel "optional", e quindi anche:
debug.print n
funzionerà, o
debug.print n.Item(1)
Purtroppo, accesso VBA non supporta riflessione. Si potrebbe provare a creare il proprio astrazione della gerarchia degli oggetti che si ispezionare i valori delle proprietà, ecc per voi. Si potrebbe iniziare con qualcosa di simile:
http://msdn.microsoft.com /en-us/library/aa663065%28office.11%29.aspx
Se hai installato VB6 - allora si può provare Tlbinf32.dll. AFAIR - se ha il numero di classi per ottenere informazioni di qualsiasi TypeLibrary Vedere http://support.microsoft.com/kb/224331
Questo può essere utile http://msdn.microsoft.com/en -us / magazine / bb985086.aspx