certmundo.
es‑mx

6 min de lectura

¿Cómo controlar el flujo del código con condicionales y bucles en VBA?

Controlar el flujo del código significa decidir qué instrucciones se ejecutan, cuántas veces y bajo qué condiciones.

En VBA tienes tres herramientas principales: If-Then-Else para tomar decisiones, For-Next para repetir un número fijo de veces y Do-While para repetir mientras se cumpla una condición. Dominar estas tres estructuras te permite procesar listas completas de empleados, productos o ventas sin escribir código repetitivo.


Estructura de If-Then-Else

Usa If-Then-Else cuando necesitas ejecutar código diferente según una condición.

Sintaxis básica:

If condición Then
    ' código si la condición es verdadera
Else
    ' código si la condición es falsa
End If

También puedes encadenar varias condiciones con ElseIf:

If condición1 Then
    ' bloque 1
ElseIf condición2 Then
    ' bloque 2
Else
    ' bloque por defecto
End If

Regla clave: cada If debe cerrar con End If. Si omites el cierre, VBA lanza un error de compilación.


Ejemplos con If-Then-Else

Ejemplo 1 — Clasificar el nivel salarial de un empleado de FEMSA

Supón que tienes el salario mensual de un empleado en la celda B2. Quieres mostrar su categoría en C2.

Sub ClasificarSalario()
    Dim salario As Currency
    Dim categoria As String

    salario = Cells(2, 2).Value

    If salario < 12000 Then
        categoria = "Junior"
    ElseIf salario >= 12000 And salario < 22000 Then
        categoria = "Senior"
    Else
        categoria = "Directivo"
    End If

    Cells(2, 3).Value = categoria
End Sub

Si el salario es $9,500, la macro escribe "Junior" en C2. Si es $18,500, escribe "Senior".

Ejemplo 2 — Validar existencias en un catálogo de Liverpool

Sub ValidarExistencia()
    Dim stock As Integer
    stock = Cells(3, 4).Value

    If stock = 0 Then
        Cells(3, 5).Value = "Sin existencia"
    ElseIf stock < 10 Then
        Cells(3, 5).Value = "Stock bajo"
    Else
        Cells(3, 5).Value = "Disponible"
    End If
End Sub

Esta lógica evita que el equipo de ventas ofrezca productos agotados.


Estructura de For-Next

Usa For-Next cuando sabes exactamente cuántas veces debe repetirse el código.

Sintaxis:

For contador = valorInicial To valorFinal [Step incremento]
    ' código que se repite
Next contador

El parámetro Step es opcional. Por defecto el contador sube de uno en uno. Si escribes Step -1, el bucle baja.

Ejemplo 3 — Calcular el bono de productividad para 50 empleados de Bimbo

Tienes una lista de 50 empleados. El salario está en la columna B (filas 2 a 51). Si el empleado cumplió su meta (columna C = "Sí"), el bono es el 10 % de su salario. Escribe el bono en la columna D.

Sub CalcularBonos()
    Dim i As Integer
    Dim salario As Currency
    Dim bono As Currency

    For i = 2 To 51
        salario = Cells(i, 2).Value

        If Cells(i, 3).Value = "Sí" Then
            bono = salario * 0.1
        Else
            bono = 0
        End If

        Cells(i, 4).Value = bono
    Next i
End Sub

Esta macro recorre las 50 filas en menos de un segundo. Hacerlo manualmente tomaría minutos.

Ejemplo 4 — Aplicar descuento escalonado a productos de Mercado Libre

Tienes 100 productos. Los primeros 50 reciben 5 % de descuento y los siguientes 50 reciben 8 %.

Sub AplicarDescuento()
    Dim i As Integer
    Dim precio As Currency
    Dim descuento As Double

    For i = 2 To 101
        precio = Cells(i, 2).Value

        If i <= 51 Then
            descuento = 0.05
        Else
            descuento = 0.08
        End If

        Cells(i, 3).Value = precio * (1 - descuento)
    Next i
End Sub

Combinar For-Next con If-Then-Else dentro del bucle es una técnica muy común en procesamiento de datos.


Estructura de Do-While

Usa Do-While cuando no sabes exactamente cuántas filas tiene tu lista. El bucle continúa mientras la condición sea verdadera.

Sintaxis:

Do While condición
    ' código que se repite
Loop

También existe la variante Do-Until, que repite mientras la condición sea falsa. Ambas son intercambiables según cómo redactes la condición.

Ejemplo 5 — Procesar una lista de longitud desconocida en FEMSA

Tienes un reporte de ventas diarias. No sabes cuántas filas hay porque el archivo llega con datos variables. La columna A tiene el nombre del producto y la columna B el monto vendido. Quieres sumar el total mientras haya datos.

Sub SumarVentas()
    Dim fila As Integer
    Dim totalVentas As Currency

    fila = 2
    totalVentas = 0

    Do While Cells(fila, 1).Value <> ""
        totalVentas = totalVentas + Cells(fila, 2).Value
        fila = fila + 1
    Loop

    MsgBox "Total de ventas: $" & Format(totalVentas, "#,##0")
End Sub

El bucle se detiene automáticamente al encontrar una celda vacía en la columna A. El mensaje mostraría, por ejemplo: Total de ventas: $1,248,500.

Ejemplo 6 — Actualizar precios hasta que el precio supere un límite

Sub ActualizarPrecio()
    Dim precio As Currency
    precio = 500

    Do While precio < 1000
        precio = precio * 1.1
        Debug.Print "Precio actualizado: $" & Format(precio, "#,##0")
    Loop
End Sub

Este bucle aplica un incremento del 10 % repetidamente hasta que el precio supere $1,000. En la ventana Inmediato verías:

Precio actualizado: $550
Precio actualizado: $605
Precio actualizado: $666
Precio actualizado: $732
Precio actualizado: $805
Precio actualizado: $886
Precio actualizado: $974
Precio actualizado: $1,072

Errores comunes

1. Bucle infinito en Do-While Si la condición nunca se vuelve falsa, el código corre para siempre y Excel se congela. Siempre verifica que la variable que controla el bucle cambie dentro del Loop.

' ❌ Bucle infinito — fila nunca cambia
Do While Cells(fila, 1).Value <> ""
    totalVentas = totalVentas + Cells(fila, 2).Value
Loop

' ✅ Correcto — fila incrementa en cada iteración
Do While Cells(fila, 1).Value <> ""
    totalVentas = totalVentas + Cells(fila, 2).Value
    fila = fila + 1
Loop

2. Olvidar End If Cada bloque If necesita su End If. Si lo omites, VBA no compila el módulo. Usa la sangría (indentación) para identificar fácilmente dónde abre y cierra cada bloque.

3. Usar Integer para contadores de filas grandes El tipo Integer solo soporta hasta 32,767. Si tu lista tiene más filas, usa Long.

' ❌ Error potencial con listas grandes
Dim i As Integer

' ✅ Correcto para listas de cualquier tamaño
Dim i As Long

4. Comparar texto sin considerar mayúsculas VBA distingue entre "sí" y "Sí" por defecto. Usa UCase() o LCase() para normalizar antes de comparar.

If UCase(Cells(i, 3).Value) = "SÍ" Then

Tabla de referencia: estructuras de control en VBA

Estructura Cuándo usarla Condición de salida
If-Then-Else Decisión puntual Se ejecuta una vez
For-Next Número fijo de repeticiones Contador alcanza el valor final
Do-While Número variable de repeticiones La condición se vuelve falsa
Do-Until Igual que Do-While, lógica invertida La condición se vuelve verdadera
For Each Recorrer colecciones o rangos Se agotan los elementos

Puntos clave

  • Usa If-Then-Else para tomar decisiones basadas en condiciones; cierra siempre con End If.
  • Usa For-Next cuando conoces el número exacto de filas o elementos a procesar.
  • Usa Do-While cuando la longitud de la lista es variable; asegúrate de modificar la variable de control dentro del bucle para evitar bucles infinitos.
  • Declara contadores de filas como Long, no como Integer, para evitar errores de desbordamiento en listas grandes.
  • Puedes combinar For-Next con If-Then-Else dentro del mismo bucle para aplicar lógica condicional a cada elemento de una lista.

Puntos clave

  • Usa `If-Then-Else` para ejecutar código diferente según una condición; cierra siempre el bloque con `End If` o VBA no compilará el módulo.
  • Usa `For-Next` cuando sabes exactamente cuántas filas o elementos debes procesar; declara el contador como `Long` si la lista puede superar 32,767 registros.
  • Usa `Do-While` cuando la longitud de la lista es desconocida; siempre modifica la variable de control dentro del bucle para evitar que Excel se congele en un bucle infinito.
  • Combinar `For-Next` con `If-Then-Else` dentro del mismo bucle es la técnica estándar para procesar listas de empleados o productos con lógica condicional.
  • Al comparar texto en condiciones (por ejemplo, "Sí" o "No"), normaliza con `UCase()` o `LCase()` para evitar errores silenciosos por diferencias en mayúsculas.

Comparte esta lección:

¿Cómo controlar el flujo del código con condicionales y bucles en VBA? | Macros y VBA en Excel: Curso Avanzado | Certmundo