Iteración a través de la Lista de objetos en VBA
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?
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
Esto puede ser útil http://msdn.microsoft.com/en -us / revista / bb985086.aspx