Hola, haber si me puedes echar una mano. Uso numerosos libros Excel con User Form de VBA (compilador de Excel). Después de un tiempo de llevar funcionando, abrir y cerrar los formularios en numerosas ocasiones, las operaciones que realizan estos UserForm se van relantizando, supongo que al ir restando memoria al equipo. ¿Cómo puedo liberar esta memoria para evitar que vaya lento?
Gracias de antemano.
Respuesta de fejoal
1
1
fejoal, Por falta de tiempo para responder como me gusta hacerlo suspendo...
Hay que preguntarse, primero, si lo que ralentiza tu programa es el uso del formulario en si, o el procedimiento en general de las macros que incluye. Como buena práctica de programación sería haber diseñado un diagrama de flujo que pudiera servir para identificar "cuellos de botella" o reiteraciones innecesarias en el procedimiento. Pero, en general, revisa estos conceptos: a.- Uso de SET Este es un gran comedor de recursos. Controla que por cada instrucción del tipo: Set <Variable1> = ... Exista, al final una instrucción de vaciado como: Set <Variable1> = Nothing Idem con OnError Debe haber su correspondiente OnError goto 0 --- b.- Trata de declarar el tipo que tendrá cada variable. Si posible, intenta usar más del tipo Integer o Boolean que son las que ocupan menos memoria. En el otro extremo están las "Variant" o no declararlas... Una consideración adicional: Una declaración del tipo: Dim Var1, Var2, Var3 as Integer Sólo define a Var3 como Integer. Las otras dos reservan memoria como Variant (o sea más). Para que las tres sean declaradas como Integer, la instrucción debe ser: Dim Var1 as Integer, Var2 as Integer, Var3 as Integer --- c.- Evita la selección de objetos, celdas o rangos, en la macro: Por ejemplo, la grabadora de macro puedo haberte dado esto: Sheets("Hoja1"). Activate Range("U2").Select ActiveCell.Value = "Hola!" Pues bien, esto se logra con esta única línea: Sheets("Hoja1").Range("U2").Value = "Hola!" Esto acelerará tu procedimiento, notablemente, si hubiera muchos movimientos --- d.- Controla desde la macro el método de recalculo y la actualización de pantalla. Si el libro estuviera en recalculo automático, puede haber procedimientos donde no sea necesario que las hojas se recalculen ante cada cambio. Previo a ellos coloca una instrucción del tipo: Application.Calculation =xlManual y al terminar la ejecución de tu formulario, vuélvela a automático con: Application.Calculation = xlAutomatic. De igual modo, puede no ser necesario que la pantalla muestre todo lo que está haciendo la macro y hasta es un toque de prolijidad del programador desactivar la actualización de pantalla. Tal instrucción es: Application.Screenupdating = False Cuando necesites mostrar un mensaje o al terminar el proceso coloca esta: Application.Screenupdating = True ------ Desde luego, con esto, no puedo asegurarte que tus formularios mantengan un grado razonable de agilidad a lo largo de su utilización, pues mucho dependerá de qué controles ActiveX le hayas incorporado y de las rutinas que se ejecuten. Pero si puedo decirte que habrás hecho casi todo lo posible para evitar la ralentización... Espero que esto te ayude. Que tengas un muy buen fin de semana Fernando