Edición de macros de Excel VBA

Trabajar con macros de Excel VBA

Las macros en Excel se almacenan como código VBA y, a veces, querrá 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 de edición comunes.

Ver macros

Se puede mostrar una lista de macros en el cuadro de diálogo Macros. Para ver este cuadro de diálogo, seleccione la pestaña Desarrollador en la cinta y haga clic en el botón Macros.

Si hay varios libros abiertos, las macros de todos los libros se mostrarán en la lista. Las macros en el libro activo aparecerán solo por su nombre, mientras que las macros en otros libros tendrán el prefijo del nombre del libro y un signo de exclamación (es decir, "Book2! OtherMacro").

Abrir una macro para editarla

Puede utilizar el cuadro de diálogo Macro para abrir el código de una macro seleccionando el nombre de la macro y haciendo clic en el botón Editar. Esto abrirá la macro en el Editor de VB.

Alternativamente, puede abrir VB Editor directamente haciendo clic en el botón Visual Basic en la pestaña Desarrollador o presionando el método abreviado de teclado ALT + F11.

Con este método, deberá navegar hasta la macro deseada (también llamada "procedimiento"). Repasaremos el diseño del Editor de VBA:

Descripción general del editor de VB

El VB Editor tiene varias ventanas; en este tutorial cubriremos la ventana del proyecto, la ventana de propiedades y la ventana de código.

Ventana de proyecto

La ventana del proyecto muestra cada archivo de Excel como su propio proyecto, con todos los objetos de ese proyecto categorizados por tipo. Las macros grabadas aparecerán en la categoría "Módulos", generalmente 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 cuadro de diálogo Macros mencionado anteriormente).

Ventana Propiedades

La ventana de propiedades muestra las propiedades y los valores asociados de un objeto; por ejemplo, al hacer clic en un objeto de la hoja de trabajo en la ventana del proyecto, se mostrará una lista de propiedades para la hoja de trabajo. 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 Proyecto, se mostrará que solo tiene una propiedad, “(Nombre)”. Puede cambiar el nombre de un módulo haciendo doble clic en el valor de la propiedad, escribiendo un nuevo nombre y presionando Enter. Cambiar el nombre de un módulo lo cambiará en la ventana del 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 desea ver el código de una macro ubicada en Module1, debe hacer doble clic en "Module1" en la ventana del proyecto.

Ejecución de macros en el editor de VB

Las macros se pueden ejecutar directamente desde VB Editor, que es útil para probar y depurar.

Ejecutando una macro

  • En la ventana del 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 Código, coloque el cursor en cualquier lugar del código de la macro entre "Sub" y "End Sub"
  • Haga clic en el Correr en la barra de herramientas, o presione el atajo de teclado F5

"Recorrer" una macro

En lugar de ejecutar la macro de una vez, puede ejecutar la macro una línea a la vez, utilizando un método abreviado de teclado para "recorrer" el código. La macro se detendrá en cada línea, lo que le permitirá asegurarse de que cada línea de código haga lo que espera en Excel. También puede evitar que una macro continúe en cualquier momento utilizando este método.

Para "recorrer" una macro:

  • En la ventana del 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 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 través"
  • Presione F8 repetidamente para avanzar en la ejecución del código, indicado por el resaltado amarillo en la ventana Código
  • Para evitar que una macro continúe, presione el Reiniciar botón

¿Por qué editar macros de VBA?

La grabadora de macros, aunque eficaz, también es muy limitada. En algunos casos, produce macros lentas, registra acciones que no tenía la intención de repetir o graba cosas que no pensaba que estaba haciendo. Aprender a editar sus macros les ayudará a ejecutarse de forma más rápida, eficiente y predecible.

Además de solucionar esos problemas, también obtendrá un aumento masivo de la productividad cuando aproveche todo el poder de las macros. Las macros no solo tienen que ser grabaciones de tareas; las macros pueden incluir lógica para que solo realicen tareas en determinadas condiciones. ¡En solo un par de minutos puede codificar bucles que repiten una tarea cientos o miles de veces de una vez!

A continuación, encontrará algunos consejos útiles que le ayudarán a optimizar su código de macros, así como herramientas para hacer que sus macros funcionen más duro y de forma más inteligente.

Ejemplos comunes de edición de macros

Acelerar macros

Si tiene una macro que tarda mucho en ejecutarse, puede haber un par de razones por las que se ejecuta con lentitud.

Por un lado: cuando se ejecuta una macro, Excel mostrará todo como sucede en tiempo real, mientras que puede Mira rápido para ti, en realidaddemostración el trabajo es un éxito significativo en el rendimiento. Una forma de hacer que Excel se ejecute significativamente más rápido es diciéndole que dejar de actualizar la pantalla:

'Deshabilitar la aplicación de actualización de pantalla. ScreenUpdating = False' Habilitar la aplicación de actualización de pantalla. ScreenUpdating = True

La línea "Application.ScreenUpdating = False" significa que no verá la macro funcionando, pero se ejecutará mucho más rápido. Tenga en cuenta que siempre debe configurar ScreenUpdating en True al final de su macro, de lo contrario, es posible que Excel no actúe de la manera que espera más adelante.

Otra forma de acelerar las macros:desactivar el cálculo automático en la macro. Si ha trabajado con hojas de cálculo complejas, sabrá que los pequeños cambios pueden desencadenar miles de cálculos que tardan en completarse, razón por la cual muchas personas desactivan el cálculo automático en las opciones de Excel. También puede alternar esto con el código VBA, por lo que su macro seguirá funcionando rápidamente en otras computadoras. Esto ayuda en los casos en los que está copiando y pegando muchas celdas de fórmula o haciendo que se activen muchos cálculos al pegar datos en un rango:

'Deshabilitar la aplicación de cálculo automático. Cálculo = xlCalculationManual' Habilitar la aplicación de cálculo automático. Cálculo = xlCalculationAutomatic

Agregar bucles y lógica (declaraciones If)

La grabadora de macros guarda todas sus acciones como código en un lenguaje llamado VBA. VBA es más que una forma de registrar 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.

Bucle

Digamos que quería hacer una macro que preparara un informe y, como parte de esa macro, tenía que agregar diecinueve hojas al libro de trabajo, para un total de veinte. Puede grabarse haciendo clic en el botón (+) una y otra vez, o puede escribir un bucle que repita la acción por usted, como este:

Sub ReportPrep () Dim i As Long for i = 1 to 19 Sheets.Add Next i End Sub

En este ejemplo, usamos un En bucle, que es una especie de bucle que recorre una serie de elementos. Aquí, nuestro rango son los números del 1 al 19, utilizando una variable llamada "i" para que el bucle pueda realizar un seguimiento. Dentro de nuestro bucle, solo hay una acción que se repite entre los por ySiguiente líneas (la hoja se agrega), pero puede agregar tanto código dentro del ciclo como desee para hacer cosas como formatear la hoja o copiar y pegar datos en cada hoja, lo que sea que desee repetir.

Si declaraciones

Un Si declaración se utiliza para decidir si se ejecuta algún código o no, utilizando una prueba lógica para tomar la decisión. A continuación, se muestra un ejemplo sencillo:

Sub ClearIfSmall () If Selection.Value <100 Then Selection.Clear End If End Sub

Este simple ejemplo muestra cómo funciona la instrucción If: prueba alguna condición que sea Verdadera o Falsa (¿El valor de la celda seleccionada es menor que 100?), y si la prueba devuelve True, se ejecuta el código interno.

Una deficiencia de este código es que solo prueba una celda a la vez (y fallaría si seleccionara 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 ciclo For ligeramente diferente: este no recorre un rango de números, sino que recorre todas las celdas de la selección, utilizando una variable llamada "c" para realizar un seguimiento. Dentro del ciclo, el valor de "c" se utiliza para determinar si la celda debe borrarse o no.

Los bucles y las declaraciones If se pueden combinar de la forma que desee; puede poner bucles dentro de bucles, o un If dentro de otro, o usar un If para decidir si un bucle debe ejecutarse.

<<>>

Eliminar efectos de desplazamiento

Una razón común para editar el código de macro es eliminar el desplazamiento de la pantalla. Al grabar 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 saturar su código con cientos o incluso miles de líneas de código innecesario. A continuación, se muestra un ejemplo del código que se registra cuando hace clic y arrastra en la barra de desplazamiento:

Este tipo de código es completamente innecesario y podría eliminarse sin afectar ninguna otra funcionalidad. Incluso si quisiera retener el desplazamiento, este código aún podría condensarse en un bucle.

Quitar código redundante

Las macros grabadas tienden a agregar una gran cantidad de código redundante que no refleja necesariamente lo que desea que haga la macro. Tome el siguiente código grabado, por ejemplo, que registra el cambio de un nombre de fuente en una celda:

Aunque solo 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. ¡la macro grabada no funcionaría!

Es posible cambiar esta macro para que cambie solo el nombre de la fuente:

Esta macro no solo funcionará según lo previsto ahora, sino que también es mucho más fácil de leer.

Eliminar 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 que se ejecuta una macro.

Al igual que con el desplazamiento, usted Es posible que deba mover el cursor y seleccionar diferentes celdas para realizar una tarea, pero las macros no tienen que usar 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 qué hoja estamos copiandode - esto podría ser un problema si la macro se ejecutó en la hoja incorrecta

Además, el código es difícil de leer y derrochador. Estos problemas se pueden resolver con bastante facilidad:

En este código, está claro que estamos copiando de Sheet1, y ni la hoja de trabajo activa ni el rango seleccionado necesitan cambiar para pegar los datos. (Un cambio significativo es el uso de "PasteSpecial" en lugar de "Pegar": los objetos de rango, como "Rango (" C4 ″) ", solo tienen acceso al comando PasteSpecial).

Siempre que 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.

wave wave wave wave wave