2011-04-18 15 views
6
Dim dFeat As Collection 
Set dFeat = New Collection 

Dim cObj As Collection 
Set cObj = New Collection 
cObj.Add 3, "PASSED" 
cObj.Add 4, "TOTAL" 
dFeat.Add cObj, "M1" 

Set cObj = New Collection 
cObj.Add 5, "PASSED" 
cObj.Add 6, "TOTAL" 
dFeat.Add cObj, "M2" 

dFeat("M1")("TOTAL") = 88 ' Error here 
Debug.Print dFeat("M1")("TOTAL") 

¿Cómo modifico el valor de la colección interna con la tecla?Modificar el valor por la clave

Respuesta

7

El consejo de Alex K. sobre el uso de un Dictionary es correcto, pero creo que el problema aquí es más general de lo que permite su respuesta. Una clave Collection (o posición de índice para ese asunto) solo sirve para leer, no para escribir.

Así pues, en esta línea:

dFeat("M1")("TOTAL") = 88 ' Error here 

dFeat("M1") está muy bien. Devuelve el Collection que ha agregado con la clave "M1". El error está sucediendo porque intenta asignar directamente a un elemento de esa colección. En general, si c es Collection, c("TOTAL") (o c(2)) no puede ser un valor l.

Como dice Alek K., la mejor forma de evitar esto es usar Dictionary para las "colecciones" internas, o para las partes interna y externa. Aquí es cómo utilizar uno para el interior se vería:

Dim d As Dictionary 
Set d = New Dictionary 

d("PASSED") = 3 
d("TOTAL") = 4 

dFeat.Add d, "M1" 

Entonces la línea:

dFeat("M1")("TOTAL") = 88 

funcionará porque dFeat("M1")("TOTAL") es un valor-I válida.

Si por alguna razón usted no puede o no desea incluir la MS Tiempo de ejecución de secuencias de comandos, usted tiene que reemplazar la línea de falla con algo como:

Dim c As Collection 
Set c = dFeat("M1") 

Call c.Remove("TOTAL") 
Call c.Add(88, "TOTAL") 

o más concisamente:

Call dFeat("M1").Remove("TOTAL") 
Call dFeat("M1").Add(88, "TOTAL") 

a continuación, puede leer el valor de dFeat("M1")("TOTAL"), pero todavía no se puede asignar a la misma.

+1

+1 for 'Una clave de recopilación (o posición de índice para el caso) solo es buena para leer, no para escribir'. Limpiar un VBA muy oxidado para un proyecto y esta fue la clave (¡ja!) - reemplazar el ítem completo con un nuevo objeto hizo el truco. En mi caso, esto significaba una nueva matriz llena de valores de la matriz existente + cambios. Probablemente sea una forma más efectiva para objetos grandes, pero solo estoy lidiando con unas pocas docenas de matrices con 2 valores cada una. – brichins

3

No puede actualizar un tipo de valor en una colección;

Dim c as new Collection 
c.add 42, "wth" 
c("wth") = 88 //will error also 

agregar una referencia al tiempo de ejecución de secuencias de comandos Microsoft, reemplace Collection con Dictionary & que debería funcionar.

Cuestiones relacionadas