Funciones y macros personalizadas en VBA

Resumen

Visual Basic for Applications (VBA) es el motor de programación que vive detrás de Excel y te permite automatizar tareas, crear macros personalizadas y diseñar funciones propias cuando las fórmulas nativas no alcanzan. Si trabajas con Power Query y Power Pivot, dominar VBA te abre la puerta a integrar todo en un flujo automatizado para tu proyecto final.

¿Cómo entrar a Visual Basic en Excel y reconocer su entorno?

Para abrir el editor, ve a la pestaña Programador y haz clic en Visual Basic, o usa el atajo Alt + F11 [00:32]. Una vez dentro, verás del lado izquierdo todos los proyectos abiertos, cada uno con sus hojas (hoja uno, hoja dos, etc.) y la opción de añadir módulos, que es donde normalmente se escriben las macros.

Los módulos concentran los procesos repetitivos que decides automatizar. Para crear uno, haz clic derecho sobre el proyecto, elige Insertar y selecciona Módulo. Puedes renombrarlo cuando quieras para mantener tu trabajo organizado.

¿Qué es un módulo en VBA? Es el contenedor donde escribes tus macros y funciones personalizadas. Cada workbook puede tener varios módulos para organizar el código por temas o procesos.

¿Cómo se estructura una macro básica en VBA?

Toda macro empieza con Sub seguido del nombre y termina con End Sub. Esa palabra Sub viene de subrutina, que es el conjunto de procesos que ejecutará tu macro [02:38]. El nombre no admite espacios y puedes mezclar mayúsculas y minúsculas.

Vamos con un ejemplo sencillo: una macro llamada ActualizarConsultas que refresca todas las tablas dinámicas y consultas del archivo.

vba Sub ActualizarConsultas() ThisWorkbook.RefreshAll End Sub

Aquí entra en juego la programación orientada a objetos, que es la lógica con la que trabaja VBA. Siempre tienes tres niveles: objeto, método (acción) y, cuando aplica, parámetros o propiedades. Es como decir "celular, vibrar": el objeto es ThisWorkbook (este archivo), el método es RefreshAll (refrescar todo).

¿Cómo ejecutar y asignar la macro a un botón?

Una vez guardada, vuelves a Excel, vas a la pestaña Macros y verás ActualizarConsultas lista para ejecutarse. También puedes asignarla a una forma o botón con clic derecho y Asignar macro, así un solo clic dispara todo el proceso.

¿Cuáles son los objetos y palabras clave esenciales en VBA?

Entender los objetos es clave porque definen dónde aplicará tu acción. Algunos de los más usados son:

  • Application: aplica al Excel completo.
  • Workbook: al archivo de trabajo.
  • Worksheet: a una hoja específica.
  • Range y Cells: a celdas o rangos.
  • Selection: al rango actualmente seleccionado.
  • PivotTable: a una tabla dinámica concreta.

Tanto en VBA como en Power Query siempre programas en inglés, sin importar el idioma de tu Excel [06:45].

¿Qué son las variables y cómo se declaran?

Las variables funcionan como cajitas donde guardas información temporal para usarla más adelante. Se declaran con Dim, seguido del nombre y el tipo con As.

  • Dim totalVentas As Double para números con decimales.
  • Dim pt As PivotTable para una tabla dinámica.
  • Set se usa para asignar objetos a una variable, no valores simples.

¿Para qué sirve Dim en VBA? Sirve para declarar una variable indicando su nombre y tipo de dato. Así VBA reserva espacio en memoria y sabe cómo tratar la información que guardarás dentro.

Otras palabras clave importantes: Public hace que la macro sea visible desde Excel, mientras Private la limita al editor de VBA. Los apóstrofos (') marcan comentarios en verde, útiles para documentar qué hace cada bloque del código.

¿Cómo crear una función personalizada en Excel con VBA?

Cuando las funciones nativas de Excel no cubren un cálculo específico, puedes crear la tuya con Function. La estructura es similar a Sub, pero la función devuelve un valor que puedes usar directamente en una celda.

Veamos una función llamada CompararTotales que recibe dos rangos (uno de gastos y otro de ventas), obtiene el total general de cada tabla dinámica y devuelve la diferencia entre ventas y gastos [10:42].

vba Public Function CompararTotales(rng_gastos As Range, rng_ventas As Range) As Double Dim ptGastos As PivotTable Dim ptVentas As PivotTable Dim totalGastos As Double Dim totalVentas As Double

Set ptGastos = rng_gastos.PivotTable Set ptVentas = rng_ventas.PivotTable totalGastos = ptGastos.DataBodyRange.Columns(1).Cells(ptGastos.DataBodyRange.Rows.Count, 1).Value totalVentas = ptVentas.DataBodyRange.Columns(1).Cells(ptVentas.DataBodyRange.Rows.Count, 1).Value CompararTotales = totalVentas - totalGastos

End Function

¿Cómo funciona el flujo interno de la función?

Primero declaras cuatro variables: dos para guardar las tablas dinámicas (ptGastos, ptVentas) y dos para los totales numéricos (totalGastos, totalVentas) en formato Double porque pueden ser cifras grandes con decimales.

Luego usas Set para vincular cada rango con su tabla dinámica. Después extraes el total final de cada tabla (la última fila de la primera columna) y lo guardas en su variable. Finalmente, asignas a CompararTotales la resta de totalVentas menos totalGastos.

¿Cómo se usa la función ya en una hoja de Excel?

En una celda escribes =CompararTotales(, seleccionas el rango de la tabla dinámica de gastos, una coma, seleccionas el rango de la tabla dinámica de ventas y cierras paréntesis. El resultado es la diferencia automática entre ambos totales.

Si quisieras obtener el porcentaje en lugar de la diferencia, solo cambias la última línea por una división. Misma estructura, distinto resultado.

Practica este ejercicio con el archivo de recursos y comparte en los comentarios qué otra función personalizada te gustaría construir para tu proyecto.