2009-11-21 8 views
5

¿Hay alguna manera de forzar la recolección de basura en VBA/Excel 2000?Forcing Garbage Collection

Esta pregunta se refiere al lenguaje de macros en Excel. No está utilizando VB .NET para manipular Excel. Por lo tanto, GC.collect() no funcionará

Respuesta

11

No puede aprovechar la recolección de basura proporcionada por .NET Framework cuando usa VBA directo. Perhaps this article por Eric Lippert será útil

+1

No sabía que VBA utilizaba el recuento de referencias y no admitía la limpieza de referencias circulares. Ese podría ser el problema subyacente. El problema original era que a veces los libros de trabajo no se cerraban correctamente cuando se cerraban y desviaban en destructores de clase. Pensé que el problema provenía de que el objeto aún no había sido recolectado. Lo más probable es que tenga una referencia circular en algún lugar que entre en juego algunas veces. Gracias por el consejo. – Zen

+0

Acepto, no puede hacerlo directamente desde VBA. Pero en realidad PUEDE aprovechar el GC de .NET si hace referencia a una biblioteca COM. Ver [** mi respuesta **] (http://stackoverflow.com/questions/20398477/how-to-set-application-name-in-adodb-connection-string/20406284#20406284), específicamente la parte sobre el Método '.Dispose()' llamado desde VBA. –

3

VBA/Excel no tiene recolección de basura, como el viejo VB. En lugar de GC, utiliza el recuento de referencias. La memoria se libera cuando configura un puntero a nada (o cuando la variable sale del alcance). Al igual que en el antiguo VB, significa que las referencias circulares nunca se liberan.

+0

Ejemplo de un problema conocido aquí: https://support.microsoft.com/en-us/help/280454/password-prompt-for-vba-project-appears-after-excel-quits –

3

No se puede forzar GC en VBA, pero es bueno establecer en Nothing las variables globales.

El artículo mencionado por kd7 dice que es inútil establecer en Nothing las variables locales antes de que salgan del alcance, pero no habla de las variables globales.

En VBA, las variables globales definidas en un módulo permanecen activas durante toda la sesión de Excel, es decir, hasta que se cierra el documento que contiene el módulo VBA que las define.

Así que no pongas inútiles Set O = Nothing cuando O es local, pero hazlo cuando es global.