bien, gracias a Alain y KyleNZ Ahora he encontrado una manera de trabajar para hacer esto, sin tener una colección o un objeto enumerable a continuación.
Básicamente, gracias al nombre de la! operador, descubrí, que el acceso a través del operador bang/pling es equivalente a acceder al miembro predeterminado de un objeto. Si la propiedad Value
es el miembro predeterminado de mi módulo de clase, entonces hay tres declaraciones equivalentes de acceso a esa propiedad:
obj.Value("param")
obj("param")
obj!param
Así que para hacer un corto sintaxis de trabajo para un módulo de clase personalizada, todo lo que uno tiene que hacer es para definir un miembro predeterminadoPor ejemplo, ahora he utilizado la Value
propiedad siguiente:
Property Get Value(name As String) As String
Value = SomeLookupInMyXMLDocument(name)
End Property
Property Let Value(name As String, val As String) As String
SetSomeNodeValueInMyXMLDocument(name, val)
End Property
Normalmente, se puede acceder ahora a que de esta manera:
obj.Value("foo") = "New value"
MsgBox obj.Value("foo")
Ahora para hacer que la propiedad del miembro predeterminado, hay que añadir una línea a la definición de la propiedad:
Attribute Value.VB_UserMemId = 0
Así, termino con esto:
Property Get Value(name As String) As String
Attribute Value.VB_UserMemId = 0
Value = SomeLookupInMyXMLDocument(name)
End Property
Property Let Value(name As String, val As String) As String
Attribute Value.VB_UserMemId = 0
SetSomeNodeValueInMyXMLDocument(name, val)
End Property
Y después de eso, esto funciona y equivalente a la palabra clave:
obj("foo") = "New value"
MsgBox obj("foo")
' As well as
obj!foo = "New value"
MsgBox obj!foo
' Or for more complex `name` entries (i.e. with invalid identifier symbols)
obj![foo] = "New value"
MsgBox obj![foo]
Tenga en cuenta que hay que añadir la Attribute Value.VB_UserMemId = 0
en algún otro editor que el editor de VBA que se incluye con Microsoft Office, como que uno oculta las directivas Attribute
por algún motivo. Puede exportar fácilmente el módulo, abrirlo en el bloc de notas, agregar las directivas e importarlo de nuevo en el editor de VBA. Siempre y cuando no cambie demasiado con el miembro predeterminado, la directiva no se debe eliminar (solo asegúrese de comprobarlo de vez en cuando en un editor externo).
Bien, gracias hasta ahora ... ¿pero hay alguna forma de usar esto sin tener un Dictionary/Collection subyacente? Mis datos provienen de un archivo XML y la clave de índice que quiero usar se basa parcialmente en la ruta. – poke
Si su biblioteca XML expone el contenido de los nodos relevantes como un diccionario, podría definir una propiedad que devuelva ese diccionario y convertir esa propiedad en el miembro predeterminado; si es un poco más complicado, podrías intentar crear propiedades de mapeo del diccionario para el XPath a instancias particulares. Esta técnica se basa bastante en un diccionario o colección. – KyleNZ