valor - tipos de variables vba excel
¿Cuándo debe eliminarse una variable de Excel VBA o establecerse en Nothing? (2)
VB6 / VBA utiliza un enfoque determinista para destruir objetos. Cada objeto almacena el número de referencias a sí mismo. Cuando el número llega a cero, el objeto se destruye.
Se garantiza que las variables de objeto se limpian (se establece en Nothing
) cuando salen del ámbito, esto disminuye los contadores de referencia en sus respectivos objetos. No se requiere acción manual.
Solo hay dos casos en los que desea una limpieza explícita:
Cuando desee que un objeto se destruya antes de que su variable salga del alcance (por ejemplo, su procedimiento tardará mucho tiempo en ejecutarse, y el objeto contiene un recurso, por lo que desea destruirlo tan pronto como sea posible para liberar el objeto; recurso).
Cuando tiene una referencia circular entre dos o más objetos.
Si
objectA
almacena referencias aobjectB
, yobjectB
almacena una referencia aobjectA
, los dos objetos nunca se destruirán a menos que se frene la cadena estableciendo explícitamenteobjectA.ReferenceToB = Nothing
uobjectB.ReferenceToA = Nothing
.
El fragmento de código que muestra es incorrecto. No se requiere limpieza manual. Incluso es dañino hacer una limpieza manual, ya que le da una falsa sensación de código más correcto .
Si tiene una variable en un nivel de clase, será limpiada / destruida cuando la instancia de la clase sea destruida. Puedes destruirlo antes si lo deseas (ver ítem 1.
).
Si tiene una variable en un nivel de módulo, se limpiará / destruirá cuando su programa se cierre (o, en el caso de VBA, cuando se reinicie el proyecto de VBA). Puedes destruirlo antes si lo deseas (ver ítem 1.
).
El nivel de acceso de una variable (público vs. privado) no afecta su tiempo de vida.
Me he enseñado Excel VBA en los últimos dos años, y tengo la idea de que a veces es apropiado deshacerse de las variables al final de un segmento de código. Por ejemplo, lo he visto hecho en este fragmento adaptado del código de Ron de Bruin para transferir Excel a HTML :
Function SaveContentToHTML (Rng as Range)
Dim FileForHTMLStorage As Object
Dim TextStreamOfHTML As Object
Dim TemporaryFileLocation As String
Dim TemporaryWorkbook As Workbook
...
TemporaryWorkbook.Close savechanges:=False
Kill TemporaryFileLocation
Set TextStreamOfHTML = Nothing
Set FileForHTMLStorage = Nothing
Set TemporaryWorkbook = Nothing
End Function
He hecho algunas búsquedas sobre esto y he encontrado muy poco más allá de cómo hacerlo, y en un foro publico una declaración de que no es necesario borrar las variables locales , ya que dejan de existir en End Sub
. Supongo, basado en el código anterior, que puede no ser cierto en End Function
, o en otras circunstancias que no he encontrado.
Entonces mi pregunta se reduce a esto:
- ¿Hay algún lugar en la web que explique cuándo y por qué para la limpieza variable, y simplemente no lo he encontrado?
Y si no puede alguien aquí por favor explique ...
- ¿Cuándo es necesaria una limpieza variable para Excel VBA y cuándo no?
- Y más específicamente ... ¿Existen usos variables específicos (variables públicas? ¿Variables definidas por función?) Que permanecen cargados en la memoria durante más tiempo que los subs, y por lo tanto, ¿podría causar problemas si no lo hago?
VBA utiliza un recolector de basura que se implementa mediante recuento de referencias .
Puede haber varias referencias a un objeto dado (por ejemplo, Dim aw = ActiveWorkbook
crea una nueva referencia al Libro de trabajo activo), por lo que el recolector de basura solo limpia un objeto cuando está claro que no hay otras referencias. Establecer en Nothing es una forma explícita de disminuir el recuento de referencias. El recuento se reduce implícitamente al salir del alcance.
Estrictamente hablando, en las versiones modernas de Excel (2010+) no es necesario establecer nada, pero había problemas con versiones anteriores de Excel (para lo cual la solución alternativa era establecer explícitamente)