🚀The world's best VBA AI has evolved. ExcelMaster is now an autonomous Agent.Read more →
Back to Blog

VBA If Then Else en Excel — 6 ejemplos prácticos (If, ElseIf, anidado)

|

VBA If Then Else en Excel — 6 ejemplos prácticos (If, ElseIf, anidado)

Probado en: Excel 365 v2509 · Excel 2021 · Excel 2019 · última verificación 05/06/2026

En resumen — La instrucción If...Then...Else ejecuta código distinto según si una condición es verdadera o no. Copia este esqueleto y adáptalo:

Sub CalcularNota()
    Dim puntos As Long
    puntos = Range("A1").Value

    If puntos >= 90 Then
        Range("B1").Value = "Sobresaliente"
    ElseIf puntos >= 75 Then
        Range("B1").Value = "Notable"
    ElseIf puntos >= 60 Then
        Range("B1").Value = "Aprobado"
    Else
        Range("B1").Value = "Suspenso"
    End If
End Sub

Ese único bloque cubre el 90 % de todo lo que harás con condiciones en VBA. El resto de esta guía muestra los patrones que te libran de los errores que todos cometen.

Por qué importa la instrucción If

Toda macro que «decide» algo —marcar facturas vencidas, colorear celdas por encima del presupuesto, saltar filas vacías— se apoya en If. Domina la estructura una vez y dejarás de escribir esas condiciones enredadas que hacen que el VBA sea tan difícil de mantener.

Las cuatro formas de If

Forma Cuándo usarla ¿Necesita End If?
If en una línea Una acción corta, sin Else No
Bloque If...End If Una rama, varias líneas
If...Else Dos resultados
If...ElseIf...Else Tres o más resultados
' Una línea — sin End If, una sola instrucción
If celda.Value = 0 Then celda.Value = "n/d"

' Bloque — varias líneas necesitan End If
If celda.Value = 0 Then
    celda.Value = "n/d"
    celda.Interior.Color = vbYellow
End If

Regla práctica: en cuanto necesites dos acciones o un Else, pasa a la forma de bloque con End If. Mezclar la sintaxis de una línea con la de bloque es la causa n.º 1 del error de compilación «Bloque If sin End If».

Ejemplo 1 — Marcar facturas vencidas

Sub MarcarVencidas()
    Dim r As Range
    For Each r In Range("D2:D200")          ' D = fecha de vencimiento
        If r.Value < Date And r.Offset(0, 1).Value <> "Pagada" Then
            r.Offset(0, 2).Value = "VENCIDA"
            r.Offset(0, 2).Interior.Color = RGB(255, 199, 206)
        End If
    Next r
End Sub

Dos condiciones unidas con And: ambas deben ser verdaderas. La factura está vencida y aún sin pagar.

Ejemplo 2 — And frente a Or, por fin claro

And exige que todas las condiciones sean verdaderas. Or solo necesita una. Aquí es donde los principiantes tropiezan una y otra vez:

' Aprobar solo si el importe es bajo Y quien solicita es responsable
If importe <= 5000 And rol = "Responsable" Then estado = "Aprobado auto"

' Escalar si el importe es alto O la cuenta está marcada
If importe > 50000 Or estaMarcada = True Then estado = "Requiere revisión"

VBA no evalúa en cortocircuito por defecto. No llames a una función en la segunda condición que falle si la primera es falsa: divídelo en If anidados.

Ejemplo 3 — If anidado para un árbol de decisión real

Sub NivelEnvio()
    Dim peso As Double, pais As String
    peso = Range("A2").Value
    pais = Range("B2").Value

    If pais = "ES" Then
        If peso <= 1 Then
            Range("C2").Value = "Estándar 4,99 EUR"
        Else
            Range("C2").Value = "Pesado 9,99 EUR"
        End If
    Else
        Range("C2").Value = "Internacional 24,99 EUR"
    End If
End Sub

Dos niveles de anidación están bien. Más allá, la legibilidad se desploma: esa es tu señal para pasar a Select Case (más abajo).

Ejemplo 4 — IIf para asignaciones rápidas en una línea

Para una elección simple de dos salidas, la función IIf cabe en una línea:

Range("C2").Value = IIf(Range("A2").Value > 0, "Beneficio", "Pérdida")

Cuidado: IIf evalúa ambos argumentos, incluso el que descarta. Nunca metas una división por cero ni una llamada de función arriesgada.

Ejemplo 5 — Comprobar una celda, no solo una variable

Sub ResaltarVacias()
    Dim r As Range
    For Each r In Range("A2:A500")
        If IsEmpty(r) Then
            r.Interior.Color = vbRed
        ElseIf Not IsNumeric(r.Value) Then
            r.Interior.Color = vbYellow
        End If
    Next r
End Sub

IsEmpty, IsNumeric e IsError son los guardianes que evitan que tu If se rompa con datos sucios.

Ejemplo 6 — Salir pronto en lugar de anidar en profundidad

Sub ProcesarFila(r As Range)
    If r.Value = "" Then Exit Sub          ' cláusula de guarda — salir rápido
    If Not IsNumeric(r.Value) Then Exit Sub

    r.Offset(0, 1).Value = r.Value * 1.2
End Sub

Las cláusulas de guarda aplanan el código. En vez de envolver todo en If válido Then ... End If, rechaza los casos erróneos al principio y deja que la lógica principal corra sin sangría.

Cuándo usar If y cuándo Select Case

Situación Usar
1–2 resultados, o condiciones sobre variables distintas If...Else
3 o más resultados sobre la misma variable Select Case
Rangos de valores (1–10, 11–20…) Select Case ... To
Combinar And/Or entre variables If...ElseIf

Si te encuentras escribiendo ElseIf x = 1 ... ElseIf x = 2 ... ElseIf x = 3 sobre una variable, Select Case es más limpio y se lee mejor.

Errores comunes (y su solución)

«Bloque If sin End If» — Abriste un If de varias líneas y no lo cerraste. Cada If de bloque necesita exactamente un End If.

«Else sin If» — Suele ser un End If perdido encima del Else, o un If de una línea seguido de un Else huérfano. Vuelve a sangrar el bloque y el desajuste salta a la vista.

La condición siempre se cumple o nunca — Comparaste texto con un número o escribiste mal el operador. Muestra la condición con Debug.Print para ver qué evalúa VBA realmente.

La comparación de texto falla sin motivo aparente"pagada" = "Pagada" es False. Envuelve ambos lados en LCase() o pon Option Compare Text al inicio del módulo.

Deja de escribir condiciones a mano: describe la regla

La lógica condicional es justo donde el VBA se vuelve frágil: un If anidado de más y nadie se atreve a tocarlo seis meses después. ExcelMaster Agent te permite expresar la regla en español claro —«marca en rojo las filas de la columna D cuya fecha de vencimiento haya pasado y cuyo estado no sea Pagada»— y genera la lógica equivalente, sin un End If que olvidar. Pruébalo gratis →

Guías relacionadas

Preguntas frecuentes

¿Puedo escribir If Then Else en una sola línea? Sí, pero solo para una acción única sin un Else de varias líneas: If x > 0 Then y = 1. En cuanto añades un Else o una segunda instrucción, necesitas la forma de bloque con End If.

¿Cuántas ramas ElseIf puedo tener? Las que necesites, pero si todas prueban la misma variable, Select Case es la opción más legible a partir de tres.

¿Por qué mi condición If siempre se ejecuta? Casi siempre por un conflicto de tipos (texto comparado con número) o por mayúsculas/minúsculas ("Sí" <> "sí"). Muestra la condición con Debug.Print.

¿Cuál es la diferencia entre If e IIf? If es una instrucción que controla qué líneas se ejecutan. IIf() es una función que devuelve uno de dos valores, y evalúa ambos, así que mantén fuera las expresiones arriesgadas.