Tienes una tarea repetitiva en Excel — formatear una tabla, eliminar filas vacías, aplicar formatos o consolidar datos — y estás cansado de repetir las mismas manipulaciones. Una macro VBA permite automatizar estos gestos en pocos segundos. Este artículo te guía paso a paso para crear una macro simple, entender el código generado, adaptarlo a tus necesidades y evitar los errores comunes, sin suponer que eres desarrollador.
Somaire
En resumen
🔧 Objetivo: automatizar una tarea repetitiva en Excel mediante una macro VBA simple — grabar la acción, corregir el código y luego ejecutarlo cuando sea necesario.
⚙️ Pasos clave: activar la pestaña Desarrollador, guardar el libro (.xlsm), grabar o escribir el código, probar y asegurar la macro.
📁 Datos fuente: si tus datos provienen de un archivo CSV, verifica los formatos antes de automatizar para evitar errores de tipo o de separador.
💡 Consejo práctico: prefiere una macro corta y legible; comenta el código para poder retomarlo fácilmente seis meses después.
¿Por qué automatizar con una macro VBA?
Automatizar no es solo ahorrar tiempo; también es reducir errores humanos y uniformizar el resultado. Cuando una tarea sigue siempre las mismas reglas (seleccionar un rango, ordenar, aplicar formatos, copiar y pegar resultados), la repetición genera olvidos: una columna no formateada, una fila olvidada durante el ordenamiento. Una macro ejecuta la secuencia de forma idéntica cada vez. Podrías pensar que la grabación es suficiente, pero a menudo es necesario entender y ajustar el código para hacerlo robusto frente a variaciones de datos.
Antes de comenzar: precauciones y preparación
Guardar y formato del archivo
Guarda tu libro en formato .xlsm (libro habilitado para macros) antes de grabar o pegar un código VBA. Esto evita perder macros y permite una recuperación fácil en caso de problema. Trabaja sobre una copia si automatizas operaciones destructivas (eliminar filas, sobrescribir celdas).
Activar la pestaña Desarrollador y la seguridad
La pestaña Desarrollador no está visible por defecto en Excel: actívala mediante opciones > Personalizar la cinta de opciones. En cuanto a seguridad, ajusta el centro de gestión de macros: prefiere « Deshabilitar todas las macros con notificación » para poder activar las macros confiables cuando sea necesario, y evita permitir automáticamente todas las macros provenientes de fuentes desconocidas.
Verificar los datos fuente
Antes de automatizar, examina tus datos: tipos de columnas (texto, número, fecha), separadores decimales, celdas combinadas. Si tus datos provienen de un archivo CSV, impórtalos correctamente y corrige los errores comunes — un separador incorrecto puede transformar un número en texto y hacer que la macro falle.
Elección del método: ¿grabar o programar?
Existen dos enfoques: usar el grabador de macros o escribir directamente código VBA. El grabador es rápido para capturar acciones simples y aprender la sintaxis, pero a menudo produce código verboso y dependiente de direcciones precisas. Escribir el código a mano requiere un poco de reflexión pero da una macro más limpia, adaptable y mantenible.
| Método | Ventajas | Inconvenientes |
|---|---|---|
| Grabar la macro | Rápido, accesible para principiantes | Código verboso, frágil ante cambios de estructura |
| Escribir el código | Flexible, optimizable, más robusto | Curva de aprendizaje más elevada |
Ejemplo práctico: macro para limpiar y formatear una tabla
Vamos a crear una macro simple que:
- selecciona el rango utilizado;
- elimina las filas vacías;
- formatea el encabezado (negrita, fondo);
- aplica un formato numérico a las columnas detectadas como números;
- ajusta automáticamente el ancho de las columnas.
Esta secuencia de acciones es típica de un preprocesamiento antes de generar informes o exportar. Aquí está el código, que puedes pegar en el editor VBA (ALT+F11) en un módulo estándar:
Sub NettoyerEtFormaterTableau()
Dim ws As Worksheet
Dim plage As Range
Dim derniereLigne As Long, derniereCol As Long
Set ws = ActiveSheet
' Déterminer la plage utilisée
With ws
If Application.WorksheetFunction.CountA(.Cells) = 0 Then Exit Sub
derniereLigne = .Cells.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
derniereCol = .Cells.Find("*", SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Column
Set plage = .Range(.Cells(1, 1), .Cells(derniereLigne, derniereCol))
End With
' Supprimer les lignes entièrement vides
Dim i As Long
For i = derniereLigne To 1 Step -1
If Application.WorksheetFunction.CountA(ws.Rows(i)) = 0 Then ws.Rows(i).Delete
Next i
' Mettre en forme l'en-tête (première ligne)
With plage.Rows(1).Font
.Bold = True
End With
plage.Rows(1).Interior.Color = RGB(220, 230, 241)
' Appliquer un format numérique aux colonnes qui paraissent numériques
Dim col As Long, sampleVal As Variant
For col = 1 To derniereCol
sampleVal = Application.WorksheetFunction.Index(ws.Columns(col).Value, 2, 1)
If IsNumeric(sampleVal) Then
ws.Columns(col).NumberFormat = "#,##0.00"
End If
Next col
' Ajuster les colonnes
plage.Columns.AutoFit
End Sub
Explicación detallada del código
Las líneas iniciales definen la hoja y determinan el rango utilizado mediante el método Find, más fiable que UsedRange para ignorar celdas formateadas sin contenido. La eliminación de filas vacías se realiza en un bucle inverso para evitar desplazamientos de índice. El formato del encabezado usa Interior.Color para un fondo ligero; puedes reemplazar RGB por una constante de Excel si prefieres. La identificación de columnas numéricas se basa en una muestra (aquí la celda de la segunda fila), una técnica simple pero eficaz para evitar aplicar un formato numérico a una columna de identificadores que contienen ceros en el encabezado.
Adaptar la macro a otros contextos
La robustez proviene de pequeñas protecciones: verificar que la hoja no esté vacía, manejar posibles errores, documentar el código. Para evolucionar la macro hacia un uso multi-hojas, añade un paso que pida al usuario elegir la hoja o recorre todas las hojas del libro. Si tus datos se importan automáticamente, inserta el procedimiento de importación antes de la limpieza.
Cuadro de diálogo y ejecución con botón
Para hacer la macro accesible a usuarios no técnicos, puedes asociarla a un botón en la hoja (Insertar > Formas, luego asignar la macro) o crear un pequeño formulario de usuario (UserForm) para ingresar parámetros (rango, incluir/quitar eliminación de filas vacías, etc.).
Buenas prácticas y trampas a evitar
- Comentar tu código: dos o tres palabras bastan para explicar cada bloque lógico. Te lo agradecerás después.
- Probar en un conjunto de prueba antes de ejecutar sobre datos críticos.
- Manejar errores: un simple On Error GoTo GestionError y un mensaje claro evitan fallos incomprensibles para el usuario.
- Evitar referencias absolutas: usa métodos dinámicos (Find, CurrentRegion, Tablas nombradas) en lugar de Range(«A1:Z100»).
Tabla resumen: errores frecuentes y soluciones
| Síntoma | Causa frecuente | Solución |
|---|---|---|
| La macro se detiene con error 13 (Tipo incompatible) | Valor inesperado (texto vs número) | Verificar tipos con IsNumeric / IsDate; añadir conversiones |
| Resultado diferente según la hoja | Referencia a ActiveSheet no prevista | Especificar ws = ThisWorkbook.Worksheets(«Nombre») o pedir la hoja |
| Columnas no ajustadas | Formato condicional o celdas combinadas | Quitar combinaciones, manejar formatos condicionales antes de AutoFit |
FAQ
¿Cómo ejecutar una macro automáticamente al abrir el archivo?
Coloque un sub llamado Workbook_Open() en el módulo ThisWorkbook. Este procedimiento se ejecutará automáticamente al abrir el libro. Atención: evite realizar acciones riesgosas sin confirmación del usuario.
¿Cuál es la diferencia entre Sub y Function en VBA?
Un Sub ejecuta una serie de instrucciones sin devolver un valor; una Function devuelve un valor y puede usarse en una celda como una fórmula personalizada o llamarse desde un Sub.
La macro elimina datos, ¿puedo deshacer?
Excel no permite deshacer una macro (Ctrl+Z no funciona después de ejecutar un script). Para prevenir pérdidas, haga una copia de seguridad automática al inicio de la macro o use la funcionalidad de versionado de su entorno (OneDrive, SharePoint).
¿Se puede ejecutar una macro en varios archivos?
Sí, abriendo cada archivo vía VBA y aplicando el mismo procedimiento. Cree una macro «madre» que recorra una carpeta, abra cada archivo, ejecute la macro de limpieza y guarde el archivo.