2009-11-21 11 views
5

Esiste un modo per forzare la garbage collection in VBA/Excel 2000?Forcing Garbage Collection

Questa domanda si riferisce al linguaggio macro in Excel. Non si utilizza VB .NET per manipolare Excel. Così GC.Collect() non funziona

risposta

11

Non si può usufruire di garbage collection fornita da .NET Framework quando si utilizza dritto VBA. Perhaps this article da Eric Lippert sarà utile

+1

Non sapevo che VBA usasse il conteggio dei riferimenti e non supportasse la pulizia dei riferimenti circolari. Questo potrebbe essere il problema del sottosuolo. Il problema originale era che a volte le cartelle di lavoro non si chiudevano correttamente quando venivano chiuse e de-referenziate in distruttori di classi. Pensavo che il problema derivasse dal fatto che l'oggetto non era stato ancora raccolto. Molto probabilmente ho un riferimento circolare ad alcuni wheyer che entrano in gioco alcune volte. Grazie per il consiglio. – Zen

+0

Sono d'accordo, non puoi farlo direttamente da VBA. Ma in realtà puoi trarre vantaggio dal GC di .NET se fai riferimento a una libreria COM. Vedi [** my answer **] (http://stackoverflow.com/questions/20398477/how-to-set-application-name-in-adodb-connection-string/20406284#20406284), in particolare la parte relativa al '.Dispose()' metodo chiamato da VBA. –

3

VBA/Excel non ha garbage collection, come il vecchio VB. Invece di GC, usa il conteggio dei riferimenti. La memoria viene liberata quando si imposta un puntatore su nulla (o quando la variabile esce dall'ambito). Come nel vecchio VB significa che i riferimenti circolari non vengono mai liberati.

+0

Esempio di un problema noto qui: https://support.microsoft.com/en-us/help/280454/password-prompt-for-vba-project-appears-after-excel-quits –

3

Non è possibile forzare GC in VBA, ma è opportuno impostare su Nothing le variabili globali.

L'articolo citato da KD7 dice che è inutile impostare Nothing le variabili locali prima di andare fuori portata, ma non parla di variabili globali.

In VBA le variabili globali definite in un modulo rimangono attive attraverso l'intera sessione di Excel, vale a dire fino a quando il documento contenente il modulo VBA che le definisce chiuse.

modo da non mettere inutile Set O = Nothing quando O è locale, ma farlo quando è globale.