🚀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 — cómo funciona y cuándo usarlo (vs Select Case)

|

VBA If Then Else en Excel — cómo funciona y cuándo usarlo (vs Select Case)

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

En resumenIf...Then...Else ejecuta código distinto según si una condición es verdadera. Copia y adapta:

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 bloque es el 90 % de lo que harás con condiciones. Pero saber qué forma elegir —y la trampa que rompe If en silencio— importa más que coleccionar otro fragmento.

La idea central: If es una lista de comprobación de preguntas independientes

If...ElseIf es una lista de comprobación. VBA la lee de arriba abajo, hace una pregunta sí/no cada vez, y ejecuta el bloque bajo la primera pregunta que responde True; el resto lo omite. Lo definitorio: cada pregunta puede consultar una variable distinta.

If horas > 40 Then                  ' pregunta sobre las horas
    pago = "horas extra"
ElseIf rol = "Autónomo" Then        ' otra pregunta, sobre el rol
    pago = "tarifa fija"
Else
    pago = "estándar"
End If

Esa libertad —cada rama pregunta por algo distinto— es justo la razón de ser de If. Y es la línea que te dice cuándo lo has superado: en cuanto cada rama prueba el mismo valor (puntos >= 90, puntos >= 75…), has construido una centralita con piezas de lista de comprobación. Esa es la señal para pasar a Select Case.

La trampa que rompe más macros que cualquier error de sintaxis: VBA no evalúa en cortocircuito

En la mayoría de los lenguajes, If a And b se detiene en a cuando a es falso; b nunca se mira. VBA no hace eso. Evalúa ambos lados, siempre. Esto parece seguro y no lo es:

' FALLO cuando rng es Nothing — VBA evalúa rng.Rows.Count de todos modos
If Not rng Is Nothing And rng.Rows.Count > 0 Then ...

Como VBA comprueba rng.Rows.Count incluso cuando rng Is Nothing, obtienes un error en tiempo de ejecución en una línea que parece una guarda. El arreglo: haz las preguntas secuenciales —anídalas para que la segunda solo se ejecute si la primera pasó:

If Not rng Is Nothing Then
    If rng.Rows.Count > 0 Then ...
End If

Este único comportamiento explica una enorme parte de los errores «¡pero mi condición If es correcta!». Una vez que sabes que VBA siempre evalúa ambos operandos, dejas de poner llamadas arriesgadas dentro de un And/Or.

La otra regla: el If de una línea no lleva End If

Cada If tiene una de dos formas, y mezclarlas es el error de compilación n.º 1 («Bloque If sin End If»):

' Una línea — exactamente una acción, SIN End If
If celda.Value = 0 Then celda.Value = "n/d"

' Bloque — en cuanto necesitas una segunda línea o un Else, necesitas End If
If celda.Value = 0 Then
    celda.Value = "n/d"
    celda.Interior.Color = vbYellow
End If

La regla es simple: ¿dos acciones o un Else? Forma de bloque, cerrada con End If. No hay término medio.

Las formas, como prueba — And, Or, anidación, IIf

Ya tienes el modelo; aquí las construcciones que lo ponen a trabajar.

And exige todo verdadero; Or necesita una — la distinción en la que tropiezan los principiantes:

If importe <= 5000 And rol = "Responsable" Then estado = "Aprobado auto"
If importe > 50000 Or estaMarcada Then estado = "Requiere revisión"

La anidación gestiona preguntas realmente dependientes — pero dos niveles es el límite antes de que la legibilidad se desplome (y de nuevo tu señal para Select Case):

If pais = "ES" Then
    If peso <= 1 Then envio = "Estándar" Else envio = "Pesado"
Else
    envio = "Internacional"
End If

IIf es una función, no una instrucción — útil para una elección de dos salidas en una línea, pero evalúa ambos argumentos (la misma regla sin cortocircuito), así que nunca metas una división por cero ni una llamada arriesgada:

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

Cuándo usar If y cuándo Select Case

Situación Usar
Las ramas preguntan por variables distintas If...ElseIf
1–2 resultados If...Else
3 o más resultados sobre el mismo valor Select Case
Rangos de un valor (1–10, 11–20…) Select Case ... To

La regla honesta: preguntas distintas → lista de comprobación (If); un valor, muchas respuestas → centralita (Select Case).

Errores comunes — y por qué ocurren

  • «Bloque If sin End If» / «Else sin If». Mezclaste sintaxis de una línea y de bloque. Vuelve a sangrar; cada If de bloque necesita exactamente un End If.
  • La condición siempre se cumple o nunca. Suele ser un conflicto de tipos (texto vs número) o mayúsculas ("Sí" <> "sí"). Muestra la condición con Debug.Print.
  • Una «guarda» falla igual. Sin cortocircuito — separa el And en If anidados.
  • La comparación de texto falla. "pagada" <> "Pagada". Envuelve ambos lados en LCase(), o Option Compare Text.

Cuando las condiciones sobreviven al código

If es la herramienta correcta para ramificar según preguntas distintas, pero las reglas de negocio no se quedan quietas. Cada nuevo umbral significa editar, volver a probar y esperar no haber roto una rama seis meses después. ExcelMaster Agent te permite enunciar la regla en español —«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, sin un End If que olvidar. Pruébalo gratis →

Guías relacionadas

Preguntas frecuentes

¿Cuándo debo usar If en lugar de Select Case? Cuando tus ramas preguntan por variables distintas, o solo tienes uno o dos resultados. En cuanto cada rama prueba el mismo valor contra tres o más opciones, Select Case se lee mejor.

¿VBA evalúa And / Or en cortocircuito? No. VBA evalúa ambos operandos cada vez. Nunca pongas una llamada que pueda fallar (sobre un objeto Nothing, una clave inexistente) en la segunda mitad de un And: anida las condiciones.

¿Puedo escribir If Then Else en una sola línea? Solo para una acción única sin un Else de varias líneas: If x > 0 Then y = 1. Con un Else o una segunda instrucción, la forma de bloque con End If es obligatoria.

¿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.