2012-03-23 10 views
5

sto scrivendo un macro di Excel, e sto avendo problemi l'eliminazione di un oggetto Scripting.Dictionary:VB Cancella Scripting.Dictionary oggetto

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

Prima di fare questo, aggiungo elementi da il dizionario, e poi provo a cancellarlo, ma test1 sarà uguale al test e uguale al nr degli oggetti che ho aggiunto.

Cosa sto sbagliando? Grazie!

risposta

6

Se eseguo la seguente macro sulla mia workstation, funziona:

 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 

Dopo l'esecuzione di esso, test1 uguale a 0, e la prova è uguale a 1.

Assicurarsi di avere abilitato Option Explicit, e che non hai errori di battitura nei nomi delle variabili.

Inoltre, assicurarsi di non avere un'istruzione "On Error Resume Next", in quanto nasconderà gli errori nel codice. Prova ad inserire "On Error Goto 0" prima del tuo snippet di codice, in modo che Excel visualizzi qualsiasi messaggio di errore.

Dato che si imposta il valore della variabile su Nothing e assegnandolo a un nuovo oggetto Dictionary, è impossibile che mantenga i valori memorizzati in precedenza.

Ho anche provato a fare funzionare il seguente codice, e dà anche gli stessi risultati:

 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 

Speranza che aiuta ...

3

il codice sia ok anche se le 2 linee in cui si imposta il tuo dict a nulla e ricrearlo non è necessario.

Non sono sicuro se è correlato ma c'è un bug in alcune versioni di VBA IDE: se hai aggiunto un orologio su dict(aKeyThatDoesNotExist) può portare alla chiave tgat che viene aggiunta al dict e non può essere rimossa. l'unica soluzione che conosco: riavviare Excel per cancellare la memoria.

EDIT

Per Siddharth: Testato con Excel 2003 & 2010.

Creare un nuovo libro.
Apri VBA IDE.
Digitare nel modulo Foglio1:

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 

eseguirlo in modalità passo passo, e quando sulla linea commentato, aggiungere un orologio sul d e d("b"). Il secondo Debug.Print stamperà 2. Finora, si potrebbe pensare che l'orologio abbia creato una voce, il che è strano perché non ci si aspetta che l'orologio abbia effetti collaterali.

Eseguire nuovamente la macro: il primaDebug.Print verrà stampato 2 e si noterà che il dizionario ha già un tasto "b".

In realtà, contrariamente a quanto ho detto sopra, rimuovere l'orologio su d("b") e rieseguire la macro ripristinerà correttamente il dizionario.

+0

Hmmm che è interessante. Puoi riprodurlo o è una cosa casuale? –

+0

@SiddharthRout Vedi la mia modifica. – assylias

+0

Grazie lo esamineremo oggi :) E se riesco a riprodurlo, allora scriverò questo bug con MS oggi :) –