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)