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?

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top