2012-03-23 12 views
5

estoy escribiendo una macro de Excel , y estoy teniendo problemas para despejar un objeto Scripting.Dictionary:VB Claro Scripting.Dictionary objeto

Dim test As Integer 
test = CompListDict.Count 
CompListDict.RemoveAll 
Set CompListDict = Nothing 
Set CompListDict = CreateObject("Scripting.Dictionary") 
Dim test1 As Integer 
test1 = CompListDict.Count 

Antes de hacer esto, añado elementos para el diccionario, y luego trato de borrarlo, pero test1 igualará la prueba e igualará el número de objetos que he agregado.

¿Qué estoy haciendo mal? ¡Gracias!

Respuesta

6

Si ejecuta la macro siguiente en mi estación de trabajo, funciona:

 Set compListDict = CreateObject("Scripting.Dictionary") 

     compListDict.Add 1, "Test" 

     Dim test As Integer 
     test = compListDict.Count 
     compListDict.RemoveAll 

     Set compListDict = Nothing 
     Set compListDict = CreateObject("Scripting.Dictionary") 

     Dim test1 As Integer 
     test1 = compListDict.Count 

Después de ejecutarlo, test1 es igual a 0, y la prueba es igual a 1.

Asegúrese de que tiene habilitada la opción explícita, y que no tiene ningún error tipográfico en sus nombres de variables.

Además, asegúrese de no tener una declaración "En reanudación de error siguiente", ya que ocultará errores en su código. Intente colocar "En error Goto 0" antes de su fragmento de código, para que Excel muestre cualquier mensaje de error.

Dado que está estableciendo el valor de la variable en Nothing y asignándole un nuevo objeto dictionnary, es imposible que conserve los valores almacenados previamente.

También trató de ejecutar el código siguiente, y también da los mismos resultados:

 Set compListDict = CreateObject("Scripting.Dictionary") 

     compListDict.Add 1, "Test" 

     Dim test As Integer 
     test = compListDict.Count 
     compListDict.RemoveAll 

     Dim test1 As Integer 
     test1 = compListDict.Count 

Esperamos que ayuda ...

3

Su código se ve bien, aunque las líneas 2, donde se establece su dict a nada y recrearlo no es necesario.

No estoy seguro si está relacionado pero hay un error en algunas versiones de IDE de VBA: si ha agregado un reloj en dict(aKeyThatDoesNotExist), puede llevar a que se agregue la tecla tgat al dict y no ser extraíble. la única solución que conozco: reinicie Excel para borrar la memoria.

EDITAR

Para Siddharth: probado con Excel 2003 & 2010.

Crear un nuevo libro.
Abra VBA IDE.
Tipo de esto en el módulo Hoja1:

Option Explicit 

Sub test() 

    Dim d As Variant 
    Set d = CreateObject("Scripting.Dictionary") 

    d.Add "a", "a" 
    Debug.Print d.Count 

    'Add watch here on d and d("b") 

    Debug.Print d.Count 

End Sub 

ejecutarlo en modo paso a paso y cuando en la línea comentada, añadir un reloj en d y d("b"). Se imprimirá el segundo Debug.Print 2. Hasta ahora, podría pensar que el reloj creó una entrada, lo cual es extraño porque no esperaría que el reloj tenga efectos secundarios.

Ejecute de nuevo la macro: primerDebug.Print imprimirá 2 y verá que el diccionario ya tiene una tecla "b".

En realidad, al contrario de lo que dije anteriormente, quitar el reloj en d("b") y volver a ejecutar la macro restablecerá el diccionario correctamente.

+0

Hmmm eso es interesante. ¿Puedes reproducirlo o es algo aleatorio? –

+0

@SiddharthRout Ver mi edición. – assylias

+0

Gracias lo investigaremos hoy :) Y si puedo reproducirlo, presentaré este error con MS hoy :) –