Pregunta

Me gustaría iterar a través de los miembros de cualquier clase en una biblioteca referenciada al igual que se hace con el Examinador de objetos. ¿Cómo se puede hacer esto con VBA?

¿Fue útil?

Solución 2

KB de Microsoft lo que me permitió hacer precisamente eso. También cubre iteración sobre detalles miembros también.

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

Otros consejos

En realidad, cómo hacer esto está documentada, pero es posible. Si lo que buscas para poner en práctica una sintaxis for..Each para una colección, entonces usted puede hacer lo siguiente:

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

Tenga en cuenta los valores de atributo en el anterior. Usted tiene que utilizar el SaveAsText y editar código como anteriormente en el bloc de notas. A continuación, volver a importar el código utilizando loadfromText en la línea de comandos de depuración. Una vez hecho lo anterior, a continuación, se puede ir:

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

Y, si no que buscan utilizar para cada uno ... para una colección, que podría / puede también configurar una propiedad predeterminada de la clase yendo:

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

A continuación, se puede ir:

Dim n       As clstest1
Dim i       As Integer

Set n = New clstest1

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

Sin embargo, no me cuenta cómo se puede automático de añadir cada método / miembro de la clase a una colección integrada automática de objetos (no hay manera de serializar esto con las opciones del compilador, pero he visto código con cada procedimiento tiene Atributo Item.VB_UserMemId = 1, entonces 2 a continuación, 3). Tal vez alguien con más conocimiento puede saltar).

Sin embargo, como los espectáculos anteriores, se puede implementar un for..each para las colecciones. Y se puede aplicar un índice para cada una de las propiedades / métodos si se crea una propiedad de elemento personalizado. Y, como los espectáculos anteriores, incluso se puede establecer que la propiedad del elemento se crea de forma predeterminada. Pongo en el "opcional", y por lo tanto aún:

debug.print n

funcionará, o

debug.print n.Item(1)

Por desgracia, VBA de Access no es compatible con la reflexión. Usted podría intentar la creación de su propia abstracción de la jerarquía de objetos que va a inspeccionar los valores de propiedad, etc para usted. Podría empezar con algo como esto:

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

Si tiene instalado Visual Basic 6 - entonces usted puede intentar tlbinf32.dll. AFAIR - si tiene número de clases para obtener información de cualquier librería de tipos Ver http://support.microsoft.com/kb/224331

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top