Cuando se debe usar = Nothing en Excel

En los foros de VBA y excel veo que a veces ponen por ejemplo Rango = Nothing o alguna otra variable y otras veces veo que no lo ponen. Entiendo que trata sobre liberar espacio en memoria ram pero no me queda claro cuando usarlo y cuando no y me preocupa que haga una aplicacion grande y me quede sin espacio en memoria por no saber cuando usarlo

Respuesta
2

Algunos aficionados te dirán que se usa para limpiar objetos de la memoria y liberar espacio, si estas de suerte te darán un ejemplo en donde ponen Objeto = Nothing justo antes del End Sub.

Esto es una novatada, y solo se me ocurren dos razones de por que lo hacen:

1-Porque en realidad no saben lo que hacen y/o creen que se ve "cool"

2-Porque vienen de otros lenguajes como C o C++ (pero probablemente la causa sea la numero 1)

C y C++ son ejemplos de lenguajes en los que el programador es responsable de la creación y la destrucción de los objetos.

Ahora te explicaré por que NO NECESITAS destruir los objetos manualmente, y te diré las únicas 3 ocasiones en que SI DEBES destruirlos manualmente.

En VBA como en algunos otros lenguajes de programación como por ejemplo Java, creo que Ruby también, y algunos otros que se me escapan ahora mismo, existe algo que se denomina Garbage Collector que traducido al español seria "Recolector de Basura". Esto es una característica de estos lenguajes, y una de las razones por las que los hace tan lentos y de bajo rendimiento.

El garbage collector se basa en un contador de referencias, VBA te garantiza la destrucción de un objeto cuando sus referencias llegan a 0; y las referencias de un objeto llegan a 0 cuando este sale de su ámbito; y su ámbito termina en el End Sub.

Por eso antes te decía que destruir objetos justo antes del End Sub no hace absolutamente nada mas que verse un poco ridículo. El propio End Sub establece la referencia en 0 y el Garbage Collector destruye el objeto por ti.

Ahora te diré 3 ocasiones en que si deberías hacerlo manualmente y te las diré en orden de probabilidad de que te ocurran:

Caso 1: Cuando tienes un proceso relativamente largo en donde usaras un objeto hasta cierto punto y luego ya no lo necesitaras mas, en ese caso seria conveniente destruir el objeto para dar paso al resto del código. Ejemplo:

Sub CodigoIlustrativo()
Dim Objeto as Objeto
Set Objeto = Objeto Nuevo
  Objeto.Metodo 'aquí trabajas todo lo que quieras con tu objeto'
  Set Objeto = Nothing 'Aquí ya no necesitas mas el objeto pero tu macro continuará haciendo otras cosas'
'Mas código'
'Mas código'
'Mas código'
End Sub

Caso 2: Cuando necesitas inicializar un objeto dentro de un bucle, imagina que debes hacer un bucle de mil repeticiones y dentro del bucle necesitas inicializar un objeto cada vez. Una buena practica seria destruir el objeto al final de la iteración para volverlo a inicializar desde 0 en la próxima iteración. Ejemplo:

Sub CodigoIlustrativo()
Dim Objeto as Objeto
  For i = 1 to 1000
    Set Objeto = Objeto Nuevo
    'resto de código del bucle'
    Set Objeto = Nothing
  'para la próxima iteracion las referencias vuelven a estar en 0'
  Next i
End Sub

Caso 3 (y esto probablemente nunca te ocurrirá): Cuando dos objetos mantienen una referencia uno de otro, en estos casos el Garbage Collector de VBA es pésimo, y los objetos nunca se destruirán hasta que tu mismo rompas la cadena. Ejemplo:

Si tu ObjetoA tiene una referencia de tu ObjetoB y tu ObjetoB también tiene una referencia de tu ObjetoA, VBA no será capaz de destruirlo a menos que explícitamente digas: ObjetoA.ReferenciaObjetoB = Nothing o viceversa.

Ni siquiera se me ocurre un ejemplo con sentido en este momento ya que estos casos son muy raro verlos especialmente cuando no programas POO (cosa que casi nadie hace en VBA)

Que significa POO?

Programación Orientada a Objetos.

Es cuando creas tus propios objetos en los Módulos de Clases, es posible que te crees algún objeto en cuya instancia hace referencia a otro de tus Objetos y viceversa. En ese caso el Garbage Collector no funcionará.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas