Buenas prácticas en VBA

Excel Macros VBA

Cuando creamos una macro para automatizar una tarea, nuestro objetivo principal es conseguir hacer tareas repetitivas de una forma mas eficiente. Con estos consejos sobre buenas prácticas en VBA, además lograremos que se ejecuten de forma mas rápida y las haremos mas robustas ante posibles errores.

Indice de buenas prácticas

Moverte por diferentes hojas

Haz referencia a las hojas simepre por el nombre asignado a ellas en el proyecto VBA.

Buenas prácticas en VBA - Referencia a hojas del libro

Por defecto, las hojas se llaman Hoja1, Hoja2,… pero puedes personalizar ese nombre en las propiedades, modificándola como ves en la imagen anterior. Ha referencia a ellas por ese nombre.

Si haces referencia a la hoja por su nombre con Sheets(«Mi_Hoja_1»), el el caso de que el usuario decida cambiar el nombre a dicha hoja, se generará un error ya que tu código no la encontrará.

También puedes referirte a la hoja usando el índice Sheets(1), pero tampoco puedes estar seguro de que éste se mantenga en el tiempo ya que se pueden añadir o eliminar hojas y dicho índice podría variar.

En resumen, mejor Hoja1.Range(«A1»).Value=0 que Sheets(«Mi_Hoja_1»).Range(«A1»).Value=0 o Sheets(1).Value=0 Tu código será mucho mas robusto.

Usa siempre el identificador de hoja para trabajar con rangos

Nunca hagas referencias a rangos asumiendo en que hoja te encuentras: Range(«A1»).Value=0. Te puedes llevar la sorpresa de que la hoja activa no es la que esperas y puedes generar un desastre. Identifica perfectamente a que hoja te refieres. Hoja2.Range(«A1»).Value=0.

Mejor Cells que Range

Es mucho mas rápido hacer
     Hoja1.Cells(1,1).Value=0

que
     Hoja1.Range(«A1»).Value=0

y ya no digamos que
     Hoja1.Range(«A1»).Select
     ActiveCell.Value=0

Detén la visualización

Una de las cosas que mas tiempo consume es la actualización de la visualización. Si, ya se que es muy hipnotizante ver como se van haciendo las cosas que queremos por si solas en la pantalla mientras piensas la de tiempo de teclear que te estás ahorrando, pero si al principio de tu código detienes la actualización de visualización mediante Application.ScreenUpdating = False y la activas de nuevo justo antes de finalizar con Application.ScreenUpdating = True, el tiempo de ejecución se reducirá de forma drástica.

Haz la prueba, con un código muy sencillo como el siguiente:
    Sub Probando1
        For x=1 to 500.000
            Hoja1.Cells(x,1).Value=x
        Next x
    End Sub


Y compara el tiempo con respecto a este:
    Sub Probando2
         Application.ScreenUpdating = False
        For x=1 to 500.000
            Hoja1.Cells(x,1).Value=x
        Next x
        Application.ScreenUpdating = True
    End Sub

No calcules cada cambio

Salvo que sea estrictamente necesario, pon el modo de calculo en manual al comienzo del código
     Application.Calculation = xlCalculationManual

y activa el modo automático al finalizar
     Application.Calculation = xlCalculationAutomatic

Si a lo largo de la ejecución hubiese un punto donde necesitas que la hoja se recalcule para trabajar con dichos datos recalculados, fuerza esta actualización con
     Application.Calculate

No te posiciones en cada celda

Posicionarse en cada celda lleva tiempo. Códigos del tipo
     Hoja1.Range(“A1”).Select
     For x=1 to 100
         ActiveCell.Value=x
         Activecell.Offset(1,0).Select
     Next x


Llevan muchísimo tiempo más que:
    For x=1 to 100
        Hoja1.cells(x,1).Value=x
    Next x

Usa las funciones del propio Excel

Si tienes que hacer cálculo y existe una función propia de Excel, utilízala en vez de calcularlo con una rutina. Haz, por ejemplo:
    MiMaximo = Application.WorksheetFunction.Max(Hoja3.Range(«A1:A10»))

en vez de:
    MiMaximo = 0
    For x = 1 To 10
        If Hoja3.Cells(x, 1).Value > MiMaximo Then MiMaximo = Hoja3.Cells(x, 1).Value
     Next x

Deshazte de los objetos en cuanto dejes de necesitarlos

Aunque tu PC o portátil tenga mucha memoria, Excel es capaz de manejar solo 4 GB en su versión 32 bits. Y si instalas la versión de 64 bits, podrás manejar mas memoria pero probablemente tengas problemas de compatibilidad con tu código. Es frecuente en libros pesados con muchas macros encontrarte con el mensaje de que «no hay memoria suficiente».

Cada vez que defines una variable, esta ocupa espacio en memoria, por ello es muy recomendable liberar dicha memoria en cuanto no la necesites.

Si haces un Set, por ejemplo, Set MiRango = Hoja1.UsedRange, destruye el objeto al terminar de manipularlo con Set MiRango = Nothing.

No abuses de los If

Las expresiones If … Then … Else son lentas. Intenta simplificarlas o usar alternativas. Por ejemplo:

Mejor
    Select Case x
        Case 1
            Hoja1.cells(1,1).Value=0
        Case 2
            Hoja1.cells(1,1).Value=4
        Case 3
            Hoja1.cells(1,1).Value=10
        Case Else
            Hoja1.cells(1,1).Value=50
    End Select

Que
    If x= 1 then
        Hoja1.cells(1,1).Value=0
    End if
    If x= 2 then
        Hoja1.cells(1,1).Value=4
    End if
    If x= 3 then
        Hoja1.cells(1,1).Value=10
    End if
    If x<>1 and x<>2 and x<>3 then
        Hoja1.cells(1,1).Value=50
    End if

Cada variable, de su tipo

Además de ser una buena práctica establecer la opción de declarar variables de forma obligatoria para asegurarnos de que por un error al escribir no nos encontramos con un problema en la ejecución del código, l mayoría de las veces, difícil de localizar, es también recomendable evitar declaraciones de variables del tipo que no son. Si vamos a manejar datos en una variable que son de tipo Integer, no tenemos porque declarar una de tipo Long y reservar el doble de espacio en memoria. (4 bytes en vez de 2 bytes) y menos, una Variant, que es cierto que «facilita» las cosas, porque sirve para todo, pero también ocupa 16 bytes (8 veces mas de lo que necesitaríamos!!!).

Si quieres refrescar tus ideas sobre el espacio usado en memoria por cada tipo de variable, puedes ir al resumen de tipos de datos de Microsoft.

Usa las constantes propias de VBA

VBA tiene toda un serie de constantes predefinidas. Su uso no es obligatorio, pero si recomendable por dos motivos:

  • si usas la constante predefinida, te aseguras que futuros cambios en las versiones de VBA no te vayan a afectar, por un cambio en el valor que representa
  • normalmente, la legibilidad del código es mas sencilla

Por ejemplo, si esperas una respuesta de un MSgBox vbYesNo, es más sencillo de interpretar un
    If Respuesta=vbYes…

que un
     If Respuesta=6…

Si tienes curiosidad, puedes consultar el listado de constantes de VBA.

Termina los ciclos For… Next en cuanto puedas

Si estás haciendo algo dentro de un ciclo For… Next pero que no tiene por que llegar hasta el último valor de la variable usada y, además, no hay forma de hacerlo con un Do Until… Loop o Do While… Loop (cosa bastante difícil), inserta una condición de salida de dicho ciclo en cuanto sea posible para no ejecutar instrucciones innecesarias. Bien haz que la variables del bucle iguale o supere el valor máximo del ciclo o, mas fácilmente, inserta una instrucción Exit For.

Conclusión

Si aplicas estas buenas prácticas en VBA tus programas, verás que se ejecutan mucho mas rápido y que reduces problemas de robustez. Son consejos sencillos de implementar, pero verás que la recompensa es grande.

Y si tienes alguna otra sugerencia sobre buenas prácticas, por favor, compártela con nosotros en los comentarios.

Buenas prácticas en VBA - Haz volar a tus macros

Tal vez te interese también:

Deja una respuesta