variable valor una trucos refrescar pantalla objetos objeto manejo lista ejemplo crear clase celda asignar vba excel-vba vb6 access-vba

vba - valor - Cómo destruir un objeto



trucos macros (3)

Este código enmendado parece funcionar bien. Parece un matiz con el tenue / nuevo en la misma línea. Con suerte, alguien más puede dar una mejor idea del razonamiento.

Como otros han comentado, si se trata de un dim dentro del sub, entonces se recopilará después de que el sub complete de todos modos.

Sub Test2() Dim Fs As FileSystemObject Set Fs = New FileSystemObject Set Fs = Nothing End Sub

Parece que Set Object = Nothing no destruyó el objeto Fs en este código:

Sub Test2() Dim Fs As New FileSystemObject Set Fs = Nothing MsgBox Fs.Drives.Count '' this line works End Sub

La última línea funciona sin errores !. eso significa que Fs Object todavía existe, ¿no ?.

Entonces, ¿cómo destruir este objeto Fs ?


debe tener que ver con el patrón de "declarar y crear instancias", que suele tratarse como un patrón "a evitar"

si los divides, obtienes Nothing después de configurarlo para:

Sub Test2() Dim Fs As FileSystemObject Set Fs = New FileSystemObject Set Fs = Nothing MsgBox Fs.Drives.Count '' this line DOESN''T work End Sub


Otra forma de garantizar la destrucción adecuada de un objeto es generar su referencia de objeto a un bloque With (es decir, no declarar una variable local):

Sub Test() With New FileSystemObject MsgBox .Drives.Count End With End Sub

El objeto solo existe dentro del bloque With , y cuando la ejecución llega al End With token, si lo prueba con un módulo de clase personalizado observará que se ejecuta el manejador Class_Terminate la clase, confirmando efectivamente la destrucción adecuada del objeto.

En cuanto a la peculiaridad de As New , como ya se explicó , si tiene la intención de establecer la referencia de objeto a Nothing dentro de ese ámbito, no lo declare con As New , porque VBA establecerá la referencia de objeto a Nothing , pero también lo hará felizmente ( "útilmente") cree una nueva instancia para usted tan pronto como vuelva a referenciarla, ya sea para verificar que el objeto sea Is Nothing .

Nota al margen, este (molesto) comportamiento contra-intuitivo es específicamente lo que está detrás del razonamiento para la variable de Objeto de Rubberduck es la inspección de código autoasignada:

(nota: si tiene código que desea inspeccionar, sepa que corre mucho más rápido en el VBE real que en el sitio web)

(si no estaba claro ya: estoy muy involucrado con el proyecto Rubberduck)