¿Tus macros van lentas? ¿Problemas a la hora de ejecutarlas? ¿Cuáles son las técnicas recomendadas?
Cuando de programación de macros Excel se trata, el tema de la eficiencia y la velocidad es clave.
AL COMIENZO DE LAS MACROS
1. Apagar el parpadeo de pantalla
Lo hacemos con la instrucción: Application.ScreenUpdating=False
Evita los movimientos de pantalla que se producen al seleccionar celdas, hojas y libros.
2. Apagar los cálculos automáticos
Lo hacemos con la instrucción: Application.Calculation=xlCalculationManualEvita que se recalcule todo cada vez que se pegan o modifican datos.
3. Apagar los eventos automáticos
Lo hacemos con la instrucción: Application.EnableEvents=FalseEvita que se disparen macros de evento si las hubiere.
4. Apagar visualización de saltos de página
Lo hacemos con la instrucción: ActiveSheet.DisplayPageBreaks = FalseSirve para evitar algunos problemas de compatibilidad entre macros Excel 2003 vs. 2007/2010
En resumen, siempre debemos comenzar las macros así:
Application.Screenupdating=False
Application.Calculation=xlCalculationManual
Application.EnableEvents=False
ActiveSheet.DisplayPageBreaks = False
.
AL FINAL DE LAS MACROS
5. Borrar contenido de portapapeles
Lo hacemos con la instrucción: Application.CutCopyMode = FalsePermite limpiar el portapapeles en caso de haber copiado datos.
Además debemos volver a su estado original las instrucciones con las que comenzamos la macro.
En resumen, siempre debemos finalizar las macros así:
Application.ScreenUpdating=True
Application.Calculation=xlCalculationAutomatic
Application.EnableEvents=True
ActiveSheet.DisplayPageBreaks = True
Application.CutCopyMode = False
.
OTRAS TECNICAS UTILES
6. Usar la instrucción WITH
Se usa para evitar tener que referenciar un mismo objeto muchas veces
Ejecución lenta…
Sheets(1).Range(“A1:Z1”).Font.Italic = True
Sheets(1).Range(“A1:Z1”).Font.Interior.Color = vbRed
Sheets(1).Range(“A1:Z1”).MergeCells = True
Ejecución rápida!
With Sheets(1).Range(“A1:Z1”)
.Font.Italic = True
.Font.Interior.Color = vbRed
.MergeCells = True
End With
7. Evitar la instrucción SELECT
Se genera sobre todo en las macros grabadas
La mayoría de las veces no es necesario seleccionar para cumplir el objetivo
Ejecución lenta…
Range(“E1”).Select
Selection.Copy
Range(“D10”).Select
ActiveSheet.Paste
Ejecución rápida!
Range(“E1”).Copy Range(“D10”)
8. Evitar loops FOR EACH
Tener que ir celda por celda consume mucho tiempo. Se puede resolver el problema de forma más directa.
Ejecución lenta…
For Each cell In Range(“A1:A10000”)
If cell = Empty Then cell = 0
Next cell
* Los loops siempre son leeentos
* En este caso recorre 10.000 celdas!
Ejecución rápida!
Existen diversas formas de evitar los loops. La solución dependerá del caso concreto en cuestión. Generalmente se usan algunas de estas técnicas: agrupar, ir a especial, filtros, filtros avanzados. La idea es poder realizar la acción sobre todos los elementos al mismo tiempo, en lugar de tener que ir uno a uno!
9. Usar las funciones nativas de Excel
No quieras reinventar la rueda. Quizás ya exista una función Excel que lo haga!
Las macros siempre ejecutan más rápido las funciones nativas de Excel
Ejecución lenta…
mProducto = 1
For i = 1 to 100
mProducto = mProducto * Cells(3,i)
Next
Ejecución rápida!
mProducto = Application.WorkSheetFunction.Product(Range(“C1:C100”))
10. Forzar la declaración de variables
En el editor VBA, menú Herramientas > Opciones > pestaña Editor > marcar “Requerir declaración de variables”
Luego usar la variable correcta: si es fecha usar Date, si es texto usar String, si es valor usar Long…
Evitar el uso de la variable Variant ya que insume más recursos…
Usar nombres de variables que nos digan algo (por ej. “UltimaFila” o “FilaZ” en lugar de “f” o “uf”)
11. Escribir las macros en módulos y no en hojas
Las hojas pueden ser borradas o copiadas y esto generaría problemas inesperados
12. Separar el proceso en varias macros (divide y conquistarás)
Si tu macro hace muchas cosas conviene separarla en muchas macros pequeñas y luego unirlas
Es más fácil para controlar, auditar, etc…
Además te permite luego poder rehusar alguna parte del proceso en otras macros
Macro muy larga…
Sub MegaMacro()‘Codigo limpia datos
’Codigo carga datos
’Código arregla datos
’Código arma reporte
End Sub()
Mejor dividir en diferentes macros para cada proceso
Sub LimpiaDatos()
‘Codigo…
End Sub
Sub CargaDatos()
‘Codigo…
End Sub
Sub ArreglaDatos()
‘Codigo…
End Sub
Sub ArmaReporte()
‘Codigo…
End Sub
Finalmente podemos unir todos los procesos
Sub ProcesoCompleto()
Call LimpiaDatos
Call CargaDatos
Call ArreglaDatos
Call ArmaReporte
End Sub()
13. Ser cuidadoso con la instrucción ON ERROR RESUME NEXT
Esta instrucción hace que la macro siga avanzando aunque encuentre un error
En algunos casos esto hará que se ignoren errores que no deberían ser ignorados
Podrías tener errores (bugs) y no enterarte!
14. Comentar bien las macros
¿Qué pasaría si tuvieras que volver a revisar/arreglar/ampliar tu código 8 meses después?
Añadir comentarios te ayudará a describir y recordar la lógica y te ahorrará mucho tiempo!
Espero que les sirva:
Ing. Enrique Neciosup Morales
enrique@expertosenexcelpc.com
Síguenos en Facebook
enrique@expertosenexcelpc.com
Síguenos en Facebook
No hay comentarios.:
Publicar un comentario