2011-09-26 12 views
8

Me sorprende lo difícil que ha sido hacer esto, pero me imagino que es una solución rápida, así que pregunto aquí (busqué en google y en la documentación pero ninguno me ayudó). Tengo un código que agrega elementos a una colección usando claves. Cuando me encuentro con una clave que ya existe en la colección, simplemente quiero configurarla agregando un número al valor actual.Estableciendo la propiedad Item de una Colección en VBA

Aquí está el código:

If CollectionItemExists(aKey, aColl) Then 'If key already has a value 
    'add value to existing item 
    aColl(aKey).Item = aColl(aKey) + someValue 
Else 
    'add a new item to the collection (aka a new key/value pair) 
    mwTable_ISO_DA.Add someValue, aKey 
End If 

La primera vez que añadir el par clave/valor en la colección, añado un entero como el valor. Cuando vuelvo a encontrar la clave, trato de agregar otro entero al valor, pero esto no funciona. No creo que el problema radique en ningún tipo de desajuste de objeto o algo similar. El mensaje de error momento que consigo es

Tiempo de ejecución Error 424: Objeto requerido

+0

Esta respuesta a una pregunta anterior relacionada también debería responder a su pregunta: http://stackoverflow.com/questions/5709444/modify-value-by-key/5710063 # 5710063. La versión corta es que las colecciones no funcionan como matrices; no puedes reasignar un "elemento". Las respuestas que otros ya le dieron son buenas formas alternativas de obtener lo que desea. – jtolle

Respuesta

12

No puede editar los valores una vez que han sido agregados a una colección. Así que esto no es posible:

aColl.Item(aKey) = aColl.Item(aKey) + someValue 

En su lugar, se puede tomar el objeto fuera de la colección, editar su valor, y añadir de nuevo.

temp = aColl.Item(aKey) 
aColl.Remove aKey 
aColl.Add temp + someValue, aKey 

Esto es un poco tedioso, pero coloca estas tres líneas en un Sub y ya estás listo.

Las colecciones son más amigables cuando se usan como contenedores para objetos (a diferencia de los contenedores para variables "primitivas" como enteros, dobles, etc.). No puede cambiar la referencia de objeto contenida en la colección, pero puede manipular el objeto adjunto a esa referencia.

En una nota lateral, creo que has malentendido la sintaxis relacionada con Item. No puede decir: aColl(aKey).Item. La sintaxis correcta es aColl.Item(aKey), o, para abreviar, aColl(aKey) ya que Item es el método predeterminado del objeto Collection. Sin embargo, prefiero usar la forma completa y explícita ...

0

creo que es necesario para eliminar el par clave-valor existente y luego añadir la clave de la colección de nuevo, pero con el nuevo valor

8

Dictionaries son más versátiles y más eficientes que Collections. Si usted fue esta ruta podría ejecutar un simple análisis de Exists en el diccionario directamente debajo, y luego actualizar el valor de la clave

Patrick Matthews ha escrito un excelente artículo sobre dictionaries v collections

Sub Test() 
    Dim MyDict 
    Set MyDict = CreateObject("scripting.dictionary") 
    MyDict.Add "apples", 10 
    If MyDict.exists("apples") Then MyDict.Item("apples") = MyDict.Item("apples") + 20 
    MsgBox MyDict.Item("apples") 
End Sub 
+1

El diccionario es mejor que la Colección para todo excepto una cosa: el diccionario no conserva el orden. En la mayoría de mis aplicaciones, la orden * es * importante; ¡Terminé atornillado una o dos veces por Dictionary debido a esto! –

Cuestiones relacionadas