Modificación de Macros – VBA Excel
Trabajar con Macros VBA de Excel
Las macros en Excel se almacenan como código VBA, y a veces querrás editar este código directamente. Este tutorial cubrirá cómo ver y editar macros, describirá algunas técnicas de depuración de macros y dará algunos ejemplos comunes de edición.
Ver Macros
Una lista de macros puede ser mostrada en el diálogo de Macros. Para ver este cuadro de diálogo, seleccione la pestaña Desarrollador en la cinta de opciones y haga clic en el botón Macros.
Si hay varios libros de trabajo abiertos, las macros de todos los libros de trabajo se mostrarán en la lista. Las macros del libro de trabajo activo aparecerán sólo por su nombre, mientras que las macros de otros libros de trabajo irán precedidas del nombre del libro de trabajo y de un signo de exclamación (es decir, «Libro2! OtroMacro»).
Abrir una Macro para Modificarla
Puede utilizar el diálogo de macros para abrir el código de una macro seleccionando el nombre de la macro y haciendo clic en el botón Modificar. Esto abrirá la macro en el Editor VB.
También puede abrir el Editor VB directamente haciendo clic en el botón Visual Basic de la pestaña Programador, o pulsando el atajo de teclado ALT+F11.
Utilizando este método, tendrá que navegar hasta la macro deseada (también llamada «procedimiento»). Vamos a repasar el diseño del Editor VBA:
Resumen del Editor VB
El Editor VB tiene varias ventanas; en este tutorial cubriremos la Ventana del Proyecto, la ventana de Propiedades y la Ventana de Código.
Ventana Explorador del Proyecto
La ventana de proyecto muestra cada archivo de Excel como su propio proyecto, con todos los objetos de ese proyecto clasificados por tipo. Las macros grabadas aparecerán en la categoría «Módulos», normalmente en el objeto «Módulo1». (Si su proyecto tiene varios Módulos y no está seguro de dónde está almacenada su macro, simplemente ábrala desde el mencionado diálogo de Macros)
Ventana de Propiedades
La Ventana de Propiedades muestra las propiedades y los valores asociados de un objeto – por ejemplo, al hacer clic en un objeto de hoja de cálculo en la Ventana de Proyecto se mostrará una lista de propiedades para la hoja de cálculo. Los nombres de las propiedades están a la izquierda, y los valores de las propiedades están a la derecha.
Al seleccionar un módulo en la Ventana de Proyecto se mostrará que sólo tiene una propiedad, «(Name)». Puede cambiar el nombre de un módulo haciendo doble clic en el valor de la propiedad, escribiendo un nuevo nombre y pulsando Intro. Al cambiar el nombre de un módulo se le cambiará el nombre en la ventana de proyecto, lo cual es útil si tiene muchos módulos.
Ventanas de Código
Las ventanas de código son editores de texto especiales en los que puede editar el código VBA de su macro. Si quiere ver el código de una macro ubicada en el Módulo1, deberá hacer doble clic en el ‘Módulo1’ en la Ventana de Proyecto.
Ejecución de Macros en el Editor VB
Las macros pueden ejecutarse directamente desde el Editor VB, lo que resulta útil para probar y depurar.
Ejecutar una macro
- En la Ventana de Proyecto, haga doble clic en el módulo que contiene la macro que desea probar (para abrir su ventana de Código)
- En la ventana de Código, coloque el cursor en cualquier lugar del código de la macro entre «Sub» y «End Sub»
- Haga clic en el botón Ejecutar de la barra de herramientas, o pulse el atajo de teclado F5
«Recorrer Paso a Paso» una Macro
En lugar de ejecutar la macro de una sola vez, puedes ejecutar la macro línea por línea, utilizando un atajo de teclado para «recorrer» el código. La macro se detendrá en cada línea, lo que te permitirá asegurarte de que cada línea de código hace lo que esperas en Excel. También puedes impedir que una macro continúe en cualquier momento utilizando este método.
Para «recorrer» una macro:
- En la Ventana de Proyecto, haga doble clic en el módulo que contiene la macro que desea probar (para abrir su ventana de Código)
- En la ventana de Código, coloque el cursor en cualquier lugar del código de la macro
- Presione el atajo de teclado F8 para comenzar el proceso de «paso a paso»
- Pulse F8 repetidamente para avanzar en la ejecución del código, indicado por el resaltado amarillo en la ventana de Código
- Para impedir que una macro continúe, pulse el botón de Restablecer
¿Por Qué Editar Macros VBA?
El grabador de macros -aunque eficaz- también es muy limitado. En algunos casos produce macros lentas, graba acciones que no tenías intención de repetir, o graba cosas que no pensabas que estabas haciendo. Aprender a editar tus macros te ayudará a que se ejecuten más rápido, de manera más eficiente y más predecible.
Además de solucionar esos problemas, también obtendrás un enorme aumento de la productividad cuando aproveches todo el poder de las macros. Las macros no sólo tienen que ser registros de tareas: las macros pueden incluir lógica para que sólo realicen tareas bajo ciertas condiciones. En sólo un par de minutos puedes codificar bucles que repitan una tarea cientos o miles de veces de una sola vez.
A continuación, encontrará algunos consejos útiles para ayudar a optimizar su código de macros, así como herramientas para hacer que sus macros trabajen más y de forma más inteligente.
Ejemplos Comunes de Edición de Macros
Acelerar las Macros
Si tienes una macro que tarda mucho en ejecutarse, puede haber un par de razones por las que se esté ejecutando lentamente.
Por un lado, cuando una macro se ejecuta, Excel muestra todo lo que sucede en tiempo real; aunque a ti te parezca rápido, mostrar el trabajo es un golpe de rendimiento significativo. Una forma de hacer que Excel se ejecute significativamente más rápido es decirle que deje de actualizar la pantalla:
' Desactivar la actualización de la pantalla
Application.ScreenUpdating = False
' Habilitar la actualización de pantalla
Application.ScreenUpdating = True
La línea «Application.ScreenUpdating = False» significa que no verás la macro funcionando, pero se ejecutará mucho más rápido. ¡Tenga en cuenta que siempre debe establecer ScreenUpdating a True al final de su macro, o de lo contrario Excel podría no actuar como usted espera más tarde!
Otra forma de acelerar las macros: desactivar el autocálculo en la macro. Si has trabajado con hojas de cálculo complejas, sabrás que pequeños cambios pueden desencadenar miles de cálculos que tardan en completarse, por lo que mucha gente desactiva el autocálculo en las opciones de Excel. También puedes desactivar esto con el código VBA, para que tu macro siga funcionando rápidamente en otros ordenadores. Esto ayuda en los casos en los que estás copiando y pegando muchas celdas con fórmulas, o haciendo que se disparen muchos cálculos al pegar datos en un rango:
' Desactivar el cálculo automático
Application.Calculation = xlCalculationManual
' Habilitar el cálculo automático
Application.Calculation = xlCalculationAutomatic
Añadir Bucles y Lógica (Sentencias If)
El grabador de macros guarda todas sus acciones como código en un lenguaje llamado VBA. VBA es más que una forma de grabar acciones en Excel: es un lenguaje de programación, lo que significa que puede contener código para tomar decisiones sobre qué acciones realizar, o repetir acciones hasta que se cumpla una condición.
Bucles
Digamos que quieres hacer una macro que prepare un informe, y como parte de esa macro tienes que añadir diecinueve hojas al libro, para un total de veinte. Podrías grabarte haciendo clic en el botón (+) una y otra vez, o podrías escribir un bucle que repitiera la acción por ti, así
Sub ReportPrep()
Dim i As Long
For i = 1 To 19
Sheets.Add
Next i
End Sub
En este ejemplo, utilizamos un bucle For, que es un tipo de bucle que itera a través de un rango de elementos. Aquí, nuestro rango son los números del 1 al 19, usando una variable llamada ‘i’ para que el bucle pueda llevar la cuenta. Dentro de nuestro bucle, sólo hay una acción que se repite entre la línea for y la siguiente (la adición de la hoja), pero puedes añadir todo el código que quieras dentro del bucle para hacer cosas como formatear la hoja, o copiar y pegar datos en cada hoja – lo que quieras repetir.
Sentencias If
Una Sentencia If se utiliza para decidir si algún código se ejecuta o no, utilizando una prueba lógica para tomar la decisión. He aquí un ejemplo sencillo:
Sub ClearIfSmall()
If Selection.Value < 100 Then
Selection.Clear
End If
End Sub
Este sencillo ejemplo muestra cómo funciona la sentencia If – se comprueba alguna condición que sea Verdadera o Falsa(¿es el valor de la celda seleccionada menor que 100?), y si la prueba devuelve Verdadero, el código que hay dentro se ejecuta.
Un defecto de este código es que sólo comprueba una celda a la vez (y fallaría si se seleccionaran varias celdas). Esto sería más útil si pudiera… recorrer cada celda seleccionada y probar cada una…
Sub ClearIfSmall()
Dim c As Range
For Each c In Selection.Cells
If c.Value < 100 Then
c.Clear
End If
Next c
End Sub
En este ejemplo, hay un bucle For ligeramente diferente – éste no hace un bucle a través de un rango de números, sino que hace un bucle a través de todas las celdas de la selección, utilizando una variable llamada ‘c’ para llevar la cuenta. Dentro del bucle, el valor de ‘c’ se utiliza para determinar si la celda debe ser borrada o no.
Los bucles y las sentencias If pueden combinarse de cualquier manera: puede poner bucles dentro de bucles, o un If dentro de otro, o utilizar un If para decidir si un bucle debe ejecutarse.
Eliminar los Efectos del Desplazamiento
Una razón común para editar el código de la macro es eliminar el desplazamiento de la pantalla. Cuando se graba una macro, es posible que tenga que llegar a otras áreas de una hoja de trabajo desplazándose, pero las macros no necesitan desplazarse para acceder a los datos. El desplazamiento puede desordenar tu código con cientos o incluso miles de líneas de código innecesario. Este es un ejemplo del código que se graba cuando se hace clic y se arrastra en la barra de desplazamiento:
Este tipo de código es completamente innecesario y podría ser eliminado sin afectar a ninguna otra funcionalidad. Incluso si quisieras conservar el desplazamiento, este código podría condensarse en un bucle.
Eliminar el Código Redundante
Las macros grabadas tienden a añadir mucho código redundante que no refleja necesariamente lo que usted quiere que haga la macro. Por ejemplo, el siguiente código grabado, que registra el cambio de un nombre de fuente en una celda:
Aunque sólo se cambió el nombre de la fuente, se registraron once (11) cambios de fuente como el tamaño de la fuente, los efectos del texto, etc. Si la intención de la macro era sólo cambiar el nombre de la fuente (dejando todas las demás propiedades) esta macro grabada no funcionaría Es posible cambiar esta macro para que sólo cambie el nombre de la fuente:
Ahora esta macro no sólo funcionará como se pretende, sino que también es mucho más fácil de leer.
Eliminar los Movimientos del Cursor
Otra cosa que se registra en las macros son las selecciones de hojas de trabajo y celdas. Esto es un problema porque un usuario puede perder fácilmente la pista de lo que estaba trabajando si el cursor se mueve a una posición diferente después de la ejecución de la macro.
Al igual que con el desplazamiento, puede ser necesario mover el cursor y seleccionar diferentes celdas para realizar una tarea, pero las macros no tienen que utilizar el cursor para acceder a los datos. Considere el siguiente código, que copia un rango y luego lo pega en otras tres hojas:
Hay algunos problemas con este código:
- El usuario perderá su lugar anterior en el libro de trabajo
- La macro no especifica de qué hoja estamos copiando – esto podría ser un problema si la macro se ejecuta en la hoja equivocada
Además, el código es difícil de leer y derrochador. Estos problemas pueden resolverse fácilmente:
En este código, está claro que estamos copiando desde la Sheet1, y ni la hoja de cálculo activa ni el rango seleccionado necesitan cambiar para pegar los datos. (Un cambio significativo es el uso de «PasteSpecial» en lugar de «Paste» – los objetos de rango, como «Range(«C4″)», sólo tienen acceso al comando PasteSpecial)
Cuando el código se llena de referencias a «.Select» y «Selection», es una pista de que hay espacio para optimizar ese código y hacerlo más eficiente.