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 comoInteger, 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.