Jump to content

Recommended Posts

Hola a todos,

Quisiera su ayuda y/o recomendaciones ya que en los ejercicios que a veces postean veo que cuando ponen un código como:

Sub Test()

Dim Hoja As Objeto

            Set Hoja = Sheets(“Hoja1”)

            ………..

            Set Hoja = Nothing

End Sub

Pero e visto código como:

Sub Demo()
Dim Hoja As Objeto

            For n=1 to 10

                        Set Hoja = Sheets(1)

                        …………….

                        Set Hoja = Nothing

            Next n

End Sub

Veo que a veces lo ponen al final de la Sub los “Nothing” y he visto que si hay un For Next dentro de este For Next asignan las variables con Set y las Vacian con Nothing.

Se que con Nothing se libera lo guardado en memoria sobre la asignación de Set, pero…

  1. ¿Cuando se termina la Sub, quedan residuos?
  2. ¿Dónde es adecuado poner los Nothing?
  3. ¿Y en qué casos las tenemos que vaciar constantemente?
  4. ¿Por qué es bueno ponerlos y por qué no?

He buscado información, pero no me queda claro.

https://stackoverflow.com/questions/19038350/when-should-an-excel-vba-variable-be-killed-or-set-to-nothing/19038890

Gracias por su ayuda o recomendaciones.

Saludos.

 

 

Share this post


Link to post
Share on other sites
Hace 6 horas, Leopoldo Blancas dijo:
  • ¿Cuando se termina la Sub, quedan residuos?
  • ¿Dónde es adecuado poner los Nothing?
  • ¿Y en qué casos las tenemos que vaciar constantemente?
  • ¿Por qué es bueno ponerlos y por qué no?

Lo recomendable es hacerlo al final de cada procedimiento, pero es relativo a lo que estas haciendo, por ejemplo puede ser que utilices varios ciclos, en los cuales son diferentes variables objetos, por lo que lo mejor, es por cada bucle liberarlos, sin esperar al final

Si no los liberas, Excel ira llenando la memoria de su uso; yo sugiero que siempre, se deben terminar con Nothing, no importa en que lugar del procedimiento

Si son proyectos completos, lo mejor es utilizarlos en cada procedimiento o función y si es un simple proceso, a veces no es ni necesario crearlos

Lo que si veo poco practico es liberarlos dentro de un bucle, a menos que sea algo muy especifico, pero no le veo sentido, puesto que lo vuelves a iniciar, dentro del mismo

 

Saludos

Share this post


Link to post
Share on other sites

Vamos a ver. Yo lo entiendo así:

Set variable_objeto = {[New] expresión_objeto | Nothing}

Set en una instrucción que lo que hace es asignar una referencia de un objeto a una variable. No se crea ninguna copia del objeto en esa variable, se crea una referencia al objeto

---------------------------------------------------------

ej:
Dim Hoja As Objet
Set Hoja = Sheets(“Hoja1”)

- en este caso da igual que la vacies si esta declarada a nivel de procedimiento.En cuanto sale del procedimiento desaparece 🤨
- en el caso de que la declares a nivel de módulo, entonces tu sabrás.

----------------------------------------------------------

Pero si usamos la parte New, entonces lo que estamos haciendo es crear una instancia de un objeto/libreria en concreto.

----------------------------------------------------------

ej:
Set Hoja = New Excel

- Aquí mi consejo es que cada vez que la uses para lo que sea, despues de usarla hay que cerrarla. No sé porque exactamente pero todo el mundo lo cierra. Así que por mi parte siempre lo cierro 😉

- SI la usas a nivel de modulo , entonces con repetir  Set Hoja = New Excel, vacias

----------------------------------------------------------------------

A esta hora no se me ocurre nada más.

Espero te sirva

Share this post


Link to post
Share on other sites

Gracias @Gerson Pineda, @ikanni y @Antoni

Gracias por responder a mi pregunta, yo siempre los cierro al final de la Sub pero vi un vídeo donde lo cierran en cada ciclo For, que para mi tampoco tiene sentido ya que como dice @Gerson Pineda se reinician en cada ciclo, como una variable, y fue cuando me pregunte: ¿Qué Excel guarda en memoria en cada ciclo las asignaciones de Set? (Acumula basura ocupando memoria). y gracias a sus respuestas me queda claro que no, solo hay que cerrarlas o limpiarlas cuando ya no se ocupe esa asignación de Set, como  dice @Antoni.

@ikanni, y si entiendo lo que mencionas de como este declarada la variable, a nivel de Sub o a nivel de modulo...

Gracias y Saludos a todos.

 

Share this post


Link to post
Share on other sites

Lo que siempre debes mantener a la hora de programar, son las buenas practicas, ¿si VBA te lo pone a disposición porque no usarlo?

Con Set creas una referencia, misma que se debe liberar/cerrar... es como si enciendes tu auto, pero si sabes que vas a esperar a tu amigo un buen rato para iniciar transito, entonces lo recomendable es apagarlo, hasta que veas a tu amigo llegar, si no pues consume todo el combustible que deseas :D, pero no te quejes con tu amigo

 

Saludos 

Share this post


Link to post
Share on other sites
Hace 5 minutos , Gerson Pineda dijo:

Lo que siempre debes mantener a la hora de programar, son las buenas practicas

Exactamente pregunte para tener buenas práctica sobre el código...

... siempre he tenido la "mala" costumbre de llegar antes de la hora citada, una hora antes o por lo menos media hora y siempre apago el carro, camino un rato y regreso a la hora acordada... y nunca he reclamado a mi amigo ni él a mi.

Saludos.

Share this post


Link to post
Share on other sites

Hay algo muy relacionado a las buenas costumbres, como dice Gerson. La declaración de variables es una, no necesariamente obligatoria en VBA, pero que definitivamente ayuda (al menos en "algo") a acelerar los proceso además de ayudar a mejorar el orden o que otros entiendan lo que se está haciendo. Otra buena es el dejar libres dichas variables, como con el uso de Erase o el Nothing con Set. Tampoco necesarios ya que el "End Sub" libera toda la memoria. 

Yo, como soy de la "vieja guardia", siempre, pero absolutamente los uso. Desde mi "viejo" punto de vista, los buenos programadores jamás dejarán de usar esas cosas.

Un abrazo a todos... menos a los brasileños por haber goleado a Perú.

Abraham Valencia

Share this post


Link to post
Share on other sites

@avalencia

Buenas costumbres:

  1. Declarar variables ---> acelara la aplicación
  2. Entiendan otros lo que estas haciendo
  3. Nothing con Set
  4. End Sub Libera toda la memoria
  5. La "vieja guardia" no dejaran de hacerlo
  6. Los buenos programadores no dejaran de hacer esas cosas.

Si, yo también soy de la "Vieja Escuela" o "Vieja Guardia" y como me inicie con Clipper5.2, QuatroPro, Lotus123 y Excel 5 jajaja si ya estoy viejo, jajaja, también lo que hago es usar las sangrías con "Tab" para poder seguir el código más fácilmente... bueno para mi, a lo mejor a otros no les es agradable.

Deje Excel muchos años y apenas conocí a Set, a With, a Collection, a Dictionary, a For each, a resize... y por eso sigo aprendiendo y preguntando... por las buenas costrumbres.

Saludos a todos.

 

Share this post


Link to post
Share on other sites

@Leopoldo Blancas

Mira te hemos resumido la clase jaja

Hace 52 minutos , Antoni dijo:

Set, encender auto, Nothing, apagar auto. 😂

 

Hace 46 minutos , avalencia dijo:

Un abrazo a todos... menos a los brasileños por haber goleado a Perú.

Y a Honduras [estoy contigo en estas malas jaja]

Hace 49 minutos , avalencia dijo:

La declaración de variables es una, no necesariamente obligatoria en VBA, pero que definitivamente ayuda (al menos en "algo") a acelerar los proceso

En procedimientos simples no es necesario, pero cuando se trata de una aplicación, es realmente obligatoria; pues la velocidad del proceso se nota mejor rendimiento

 

Saludos

Share this post


Link to post
Share on other sites
Ahora mismo, Gerson Pineda dijo:

Mira te hemos resumido la clase jaja

Gracias, quedo claro. Ya sin duda al respecto!!! y Resumiendo, sin echar a un lado todo lo que dijeron los demás en los post anteriores.

 

Resumiendo:

Hace 1 hora, Antoni dijo:

Set, encender auto, Nothing, apagar auto. 😂

Con esto que dijo @Antoni y como dices tu :

Hace 3 minutos , Gerson Pineda dijo:

En procedimientos simples no es necesario, pero cuando se trata de una aplicación, es realmente obligatoria; pues la velocidad del proceso se nota mejor rendimiento

Por el uso de la memoria que ocupa Set.

Saludos a todos.

Share this post


Link to post
Share on other sites
Guest
This topic is now closed to further replies.

×
×
  • Create New...

Important Information

Privacy Policy