Una macro de Excel es un pequeño programa escrito en VBA que repite por sí solo las tareas que haces a mano. Cuando dentro de la macro escribes un SI (en VBA, If … Then), el programa decide, fila a fila, qué texto dejar en cada celda según el valor que encuentre. Aquí lo vamos a aplicar a una hoja de ventas: una macro que recorra las ventas del día, marque «Revisar» las que bajen de 1.000 y deje «OK» en el resto. Funciona en Excel 2007, 2010, 2013, 2016, 2019, 2021, 2024 y Microsoft 365, en Windows y en Mac. Excel para la web no ejecuta macros VBA, así que allí toca repetirlas con Scripts de Office o a mano. Al terminar vas a saber grabar una macro, escribir un If con dos ramas, anidarlo y, además, leerás los tres errores que más atascan a quien empieza.
Qué es una macro y por qué le añade un SI dentro
Una macro es un bloque de código VBA que Excel ejecuta cuando se lo pides: al pulsar un botón, al abrir el libro o al hacer clic en un menú. Dentro de ese código puede haber un SI, igual que en una celda escribes =SI(A2>10;"Alto";"Bajo"), pero escrito en lenguaje VBA: If ventas < 1000 Then … End If.
La gracia está en lo que VBA hace y una fórmula no: recorrer cientos o miles de celdas, mirar cada una y dejar un resultado distinto sin que tú tengas que arrastrar nada. Imagina la hoja de ventas del mes. Copiar la fórmula =SI(B2<1000;"Revisar";"OK") hacia abajo funciona, sí, pero tienes que arrastrarla cada vez que entran datos nuevos. Una macro con If mira la columna B, decide y rellena la columna C sola, tantas veces como la lances. Y, además, puede abrir libros, enviar correos o guardar un PDF al final.
Las piezas del editor de VBA que vas a usar
Para escribir macros se usa el editor de Visual Basic, una ventana aparte que abres con Alt+F11. Ahí dentro vas a tocar siempre las mismas cuatro zonas.
- Explorador de proyectos (a la izquierda): lista los libros abiertos y, dentro de cada uno, sus hojas y sus módulos. Un módulo es una hoja en blanco donde se pega el código.
- Ventana de código (en el centro): el papel donde escribes los
Suby las funciones. CadaSubes una macro independiente. - Ventana Inmediato (abajo): una consola donde escribes
?Variabley das Entrar para ver el valor de una variable, oDebug.Print "texto"desde el código para volcar mensajes. - Menú Insertar > Módulo: cada macro va en un módulo; si no hay ninguno, lo creas desde este menú.
Para volver a Excel sin cerrar el editor, Alt+Q o Alt+F11 otra vez.
La estructura de un SI en VBA: If, ElseIf y Else
La traducción de =SI en VBA es If … Then … Else … End If. Si la condición se cumple, VBA ejecuta lo que hay entre Then y Else; si no, ejecuta lo que hay entre Else y End If. Y si quieres más de dos ramas, encadenas ElseIf antes del Else.
La sintaxis es:
If ventas < 1000 Then
resultado = "Revisar"
Else
resultado = "OK"
End If
If y End If son obligatorios: VBA necesita saber dónde empieza y dónde acaba la decisión. ElseIf y Else son opcionales y se usan cuando hay más de un caso. El sangrado (un Tab al principio de cada línea de dentro) no es obligatorio para que funcione, pero es la única forma de leer un If cuando crece.
Comparaciones con números, textos y fechas
La condición dentro de un If usa los mismos operadores que las fórmulas: =, <>, >, >=, <, <=. Con textos se compara entre comillas dobles; con fechas, entre almohadillas #.
| Operador | Significado | Ejemplo en VBA | Resultado |
|---|---|---|---|
| = | Igual | If zona = "Norte" Then |
Verdadero si la celda contiene exactamente Norte |
| <> | Distinto | If estado <> "Pagado" Then |
Verdadero si no está pagado |
| > | Mayor | If ventas > 1000 Then |
Verdadero si la venta supera 1.000 |
| >= | Mayor o igual | If nota >= 5 Then |
Verdadero con 5 o más |
| < | Menor | If stock < 10 Then |
Verdadero si queda poco |
| <= | Menor o igual | If edad <= 18 Then |
Verdadero hasta 18 incluido |
| Like | Patrón con comodines | If nombre Like "*García*" Then |
Verdadero si contiene García |
Con fechas, VBA exige el formato mes/día/año entre almohadillas: #1/15/2026# para el 15 de enero de 2026. Y ojo: VBA compara textos sin distinguir mayúsculas, «norte» y «Norte» son iguales para él.
Anidar varios SI sin liarse
Cuando tienes más de dos tramos —por ejemplo Bajo, Medio y Alto—, puedes anidar If dentro de If. La idea es leer cada If de arriba abajo: la primera condición que se cumple gana.
If ventas < 500 Then
nivel = "Crítico"
ElseIf ventas < 1000 Then
nivel = "Bajo"
ElseIf ventas < 2000 Then
nivel = "Medio"
Else
nivel = "Alto"
End If
ElseIf se escribe junto, sin espacio, y VBA evalúa cada uno hasta dar con el primero que se cumple. Si ninguno, ejecuta Else. Este código hace lo mismo que =SI.CONJUNTO(B2<500;"Crítico";B2<1000;"Bajo";B2<2000;"Medio";VERDADERO;"Alto") en la hoja, así que si solo trabajas con la fórmula, SI.CONJUNTO (en inglés IFS), desde Excel 2019, es más limpio.
Activar la pestaña Programador y grabar tu primera macro
Antes de escribir código a mano, conviene ver qué hace Excel por ti cuando grabas. La pestaña Programador viene oculta y hay que encenderla.
- Abre Excel y entra en Archivo > Opciones.
- En la ventana, elige Personalizar cinta de opciones.
- En la columna derecha, marca la casilla Programador y pulsa Aceptar.
Ahora graba una macro tonta para ver qué genera VBA.
- Abre un libro nuevo y ve a Programador > Código > Grabar macro.
- Nombre:
MiPrimera. Guardar en: Libro de macros personal. Aceptar. - Selecciona la celda A1, escribe
Holay pulsa Entrar. - Vuelve a Programador > Código > Detener grabación.
- Pulsa Alt+F11 para abrir el editor. En Módulos > Módulo1 tienes el código que Excel escribió por ti.
Sub MiPrimera()
Range("A1").Select
ActiveCell.FormulaR1C1 = "Hola"
End Sub
Ya tienes tu primer programa en VBA. A partir de aquí vas a escribirlo tú, a mano, porque escribir a mano es más rápido que grabar para cualquier cosa con un If dentro.
Crear una macro con un SI que decide qué escribir en cada fila
Volvemos a la hoja de ventas. Empiezas con esta hoja, tal cual la escribirías a mano.
| A | B | |
|---|---|---|
| 1 | Cliente | Venta |
| 2 | Ana | 850 |
| 3 | Berta | 1.250 |
| 4 | David | 1.980 |
| 5 | Eva | 420 |
| 6 | Fer | 2.100 |
| 7 | Gema | 760 |
| 8 | Hugo | 1.500 |
| 9 | Inés | 3.250 |
La macro va a recorrer la columna B, y si la venta baja de 1.000, escribirá «Revisar» en la misma fila de la columna C. Si no, escribirá «OK».
- Abre el archivo de ventas y, si no la tienes, activa la pestaña Programador como en la sección anterior.
- Pulsa Alt+F11 para abrir el editor.
- En el menú Insertar > Módulo, pega el código de la subsección siguiente.
- Cierra el editor con Alt+Q.
- Vuelve a la hoja y pulsa Alt+F8, elige
RevisarVentasy pulsa Ejecutar.
El código entero, listo para copiar y pegar
Sub RevisarVentas()
' Declara la celda que vamos a mirar
Dim celda As Range
' Recorre cada celda del rango de ventas B2:B9
For Each celda In Worksheets("Ventas").Range("B2:B9")
' Si la venta es menor que 1.000, marca Revisar
If celda.Value < 1000 Then
' Escribe en la columna C, una fila a la derecha
celda.Offset(0, 1).Value = "Revisar"
' Si no, marca OK
Else
celda.Offset(0, 1).Value = "OK"
End If
' Cierra el If y el bucle
Next celda
End Sub
For Each celda In … recorre cada celda del rango sin que tengas que escribir un contador. celda.Offset(0, 1) se mueve una columna a la derecha (el 0 son filas, el 1 son columnas). Los comentarios con la comilla simple ' los puedes borrar; VBA los ignora.
Asignar la macro a un botón en la hoja
Teclear Alt+F8 cada vez es pesado. Mejor un botón dibujado en la propia hoja, al lado de los datos.
- En la hoja Ventas, ve a Insertar > Ilustraciones > Formas y elige la del rectángulo redondeado.
- Dibuja el botón al lado de la tabla, por ejemplo en E1, y escribe dentro
Revisar ventas. - Clic derecho sobre la forma y elige Asignar macro.
- Selecciona
RevisarVentasen la lista y pulsa Aceptar. - Clic fuera del botón para deseleccionar.
Sub RevisarVentas()
Dim celda As Range
For Each celda In Worksheets("Ventas").Range("B2:B9")
If celda.Value < 1000 Then
celda.Offset(0, 1).Value = "Revisar"
Else
celda.Offset(0, 1).Value = "OK"
End If
Next celda
End Sub
Una macro con SI.CONJUNTO en vez de If anidados
La misma hoja, ahora con cuatro tramos: Crítico (< 500), Bajo (500 a 999), Medio (1.000 a 1.999) y Alto (>= 2.000). En VBA, lo limpio es Select Case, que es el equivalente de SI.CONJUNTO: evalúa el valor una vez y salta al primer caso que encaje.
| A | B | C | |
|---|---|---|---|
| 1 | Cliente | Venta | Nivel |
| 2 | Ana | 850 | |
| 3 | Berta | 1.250 | |
| 4 | David | 1.980 | |
| 5 | Eva | 420 | |
| 6 | Fer | 2.100 | |
| 7 | Gema | 760 | |
| 8 | Hugo | 1.500 | |
| 9 | Inés | 3.250 |
Sub ClasificarVentas()
Dim celda As Range
Dim nivel As String
For Each celda In Worksheets("Ventas").Range("B2:B9")
Select Case celda.Value
Case Is < 500
nivel = "Crítico"
Case 500 To 999.99
nivel = "Bajo"
Case 1000 To 1999.99
nivel = "Medio"
Case Is >= 2000
nivel = "Alto"
End Select
celda.Offset(0, 1).Value = nivel
Next celda
End Sub
Select Case celda.Value toma el valor de la celda una sola vez. Case Is < 500 cubre los críticos; Case 500 To 999.99 cubre el tramo bajo sin escribir un If con dos condiciones; Case Is >= 2000 cierra por arriba. Case Else existe para el «en otro caso», aquí no hace falta porque todos los valores numéricos caen en algún tramo.
Por qué tu macro con SI no hace lo que esperas
Tres fallos aparecen una y otra vez cuando se empieza con If en VBA. Vale la pena verlos con la hoja abierta delante.
El SI compara texto y números sin comillas
Escribes If ventas < 1000 Then y VBA te suelta «No coinciden los tipos». La celda trae un texto ("850" guardado como cadena), no un número. Se arregla convirtiendo el valor antes de comparar, con CLng para enteros o Val para números en general.
| A | B | |
|---|---|---|
| 1 | Ana | 850 |
' Falla: B2 contiene "850" como texto
If Worksheets("Ventas").Range("B2").Value < 1000 Then
MsgBox "Menor"
End If
' Arreglo: convertir a número antes de comparar
If CLng(Worksheets("Ventas").Range("B2").Value) < 1000 Then
MsgBox "Menor"
End If
CLng redondea; con decimales usa CDbl.La macro se ejecuta pero no se ve nada
La macro corre, no da error, pero la columna C sigue vacía. Casi siempre es porque la hoja activa no es Ventas: el código escribe en la hoja que esté seleccionada, no en la que tú crees.
| A | B | |
|---|---|---|
| 1 | ||
| 2 |
' Mal: si la hoja activa es Hoja2, escribe ahí
Range("C2").Value = "Revisar"
' Bien: apunta siempre a la hoja por su nombre
Worksheets("Ventas").Range("C2").Value = "Revisar"
Excel bloquea la macro al abrir el archivo
Abres el .xlsm y ves una franja amarilla: «Las macros se han deshabilitado». Es la protección que Microsoft aplica a los archivos descargados de internet o recibidos por correo. Se desbloquea en sus Propiedades.
General | Seguridad | Detalles | Versiones anteriores
Este archivo proviene de otro equipo y puede
estar bloqueado para ayudar a proteger a
este equipo.
- Clic derecho sobre el archivo en el Explorador de Windows > Propiedades.
- En la pestaña General, marca Desbloquear y pulsa Aceptar.
- Vuelve a abrir el archivo en Excel.
Si trabajas siempre con los mismos archivos, añade su carpeta a las Ubicaciones de confianza desde Archivo > Opciones > Centro de confianza > Configuración del Centro de confianza > Ubicaciones de confianza, y Excel no volverá a molestarte con esa carpeta.
Dónde VBA no llega y qué usar en su lugar
VBA necesita el escritorio de Windows o de Mac. En Excel para la web las macros VBA no corren; allí la automatización se hace con Scripts de Office o con Power Automate. Si tu archivo es .xlsx y lo abre un compañero desde el navegador, los botones no harán nada.
Para decidir si te conviene VBA o una fórmula, mira esto:
- Si la lógica vive en una celda y se arrastra, usa SI (en inglés IF), SI.ERROR o SI.CONJUNTO (IFS, desde Excel 2019) en la propia celda. Más sencillo de mantener.
- Si la lógica recorre un rango, abre otro libro, manda un correo o crea un PDF, VBA es lo que toca.
- Si la macro se vuelve lenta con muchos
SelectoActivate, mete los datos en un array en memoria conRange.Value, trábaja ahí y vuelve a escribir conRange.Resize(, ).Value = matriz. La diferencia se nota a partir de unos pocos miles de filas.
Lo que ya sabes hacer con macros y SI
- Abrir el editor con Alt+F11, crear un módulo y escribir una macro
Sub … End Sub. - Recorrer un rango con
For Each celda In …y decidir conIf … Then … Else … End Ifqué dejar en cada fila. - Encadenar ramas con
ElseIfo sustituir varios If por una estructuraSelect Case. - Asignar la macro a un botón en la hoja y desbloquear un archivo con macros para que arranque.
El siguiente paso natural es usar la grabadora de macros como profesora: graba una acción que uses a menudo (dar formato, filtrar, guardar PDF), mira el código que escribe Excel y adivina qué hace cada línea. Así se aprende el nombre real de los objetos: Selection, ActiveSheet, ThisWorkbook.Save, ActiveSheet.PivotTables. Empieza por una grabación corta y ve quitando lo que sobra.
Dudas al usar macros con SI en VBA
- ¿Qué pasa si mi Excel está en inglés? Las funciones de la hoja se llaman igual (IF, IFS, IFERROR) y VBA es en inglés siempre (If, Then, Else, End If), así que nada cambia.
- ¿Por qué mi macro funciona una vez y a la segunda falla? Suele ser porque la hoja activa no es la que toca, o porque el rango se quedó con los datos de la primera ejecución. Apunta siempre a la hoja por nombre:
Worksheets("Ventas").Range(...). - ¿Puedo usar SI.CONJUNTO dentro de VBA? No como fórmula: VBA no evalúa fórmulas de hoja. Su equivalente es
Select Case, que es lo que hemos visto arriba. - ¿Cómo guardo un libro con macros? Archivo > Guardar como > Libro de Excel habilitado para macros (.xlsm). En
.xlsxlas macros se borran al guardar. - ¿Sirve esto en Excel para la web o en el móvil? No. VBA solo corre en Excel de escritorio (y en algunos planes de Mac). En la web usa Scripts de Office.
- ¿Puedo hacer que la macro se ejecute al abrir el archivo? Sí, con
Sub Workbook_Open()dentro del móduloThisWorkbook. Cada vez que abras el libro, Excel lanza esa macro sola.
Datos verificados en octubre de 2026.
Fuentes
- Microsoft2007 Office Excel Macro not working in Excel 2026 – Microsoft Learnconsultado el 12/10/2026
- MicrosoftPROMEDIO.SI — documentación oficialconsultado el 12/10/2026
- MicrosoftCONTAR.SI — documentación oficialconsultado el 12/10/2026
- MicrosoftCONTAR.SI.CONJUNTO — documentación oficialconsultado el 12/10/2026
- MicrosoftSIFECHA — documentación oficialconsultado el 12/10/2026