¿Alguna vez te has encontrado repitiendo la misma serie de decisiones en Excel una y otra vez? Revisar una columna, y si el valor es mayor que X, ponerlo en verde; si es menor, en rojo. O quizás categorizar cientos de productos basándote en un código. Estas tareas, aunque sencillas, consumen un tiempo valioso y son propensas a errores humanos. Aquí es donde la verdadera magia de Excel entra en juego: las macros con flujos de control.
Las macros son fantásticas para grabar y reproducir tareas. Sin embargo, su verdadero poder se desata cuando les enseñamos a «pensar» y a tomar decisiones por sí mismas. En lugar de seguir ciegamente una secuencia de pasos, una macro inteligente puede analizar los datos y actuar de manera diferente según las condiciones que encuentre. Esto es posible gracias a los flujos de control, las estructuras del lenguaje de programación VBA (Visual Basic para Aplicaciones) que dirigen el flujo de ejecución de nuestro código. En este artículo, vamos a sumergirnos en cómo puedes utilizar estas estructuras para automatizar decisiones y transformar tus hojas de cálculo en herramientas dinámicas e inteligentes.
¿Qué son los Flujos de Control?
Imagina que estás siguiendo una receta de cocina. La receta no es siempre una lista de pasos del 1 al 10. A menudo, encontrarás instrucciones como: «Si no tienes azúcar moreno, usa azúcar blanco» o «Hornea durante 30 minutos, o hasta que esté dorado». Estas son decisiones, condiciones que alteran el curso de la acción.
En programación, los flujos de control son exactamente eso: son las «recetas» que le damos a nuestra macro para que sepa qué camino tomar. Permiten que el código no se ejecute siempre de forma lineal, de arriba abajo, sino que pueda bifurcarse, tomar desvíos o repetir secciones en función de ciertas condiciones lógicas. Las dos estructuras de decisión más importantes en VBA son If...Then...Else y Select Case.
La Estructura If…Then…Else: El Pilar de la Decisión
La declaración If...Then...Else es la herramienta de toma de decisiones más fundamental y versátil en VBA. Su lógica es muy intuitiva y se traduce directamente del lenguaje humano: «Si se cumple esta condición, entonces haz esto; de lo contrario, haz esto otro».
Sintaxis Básica: If…Then
La forma más simple evalúa una única condición. Si es verdadera, se ejecuta un bloque de código. Si es falsa, no pasa nada y el programa continúa.
If [condición] Then
' Bloque de código a ejecutar si la condición es verdadera
End If
Ejemplo práctico: Imagina que queremos resaltar automáticamente cualquier factura en una lista cuyo importe (en la columna B) supere los 1000 €. Si el valor de la celda activa es mayor que 1000, la pondremos en negrita y color rojo.
Sub ResaltarImportesAltos()
' Comprueba si el valor de la celda activa es mayor que 1000
If ActiveCell.Value > 1000 Then
' Si es verdadero, aplica el formato
With ActiveCell.Font
.Bold = True
.Color = vbRed
End With
End If
End Sub
Añadiendo un Plan B: If…Then…Else
¿Qué pasa si queremos hacer algo también cuando la condición no se cumple? Aquí es donde entra en juego Else.
If [condición] Then
' Bloque de código si la condición es VERDADERA
Else
' Bloque de código si la condición es FALSA
End If
Ejemplo práctico: Vamos a crear una macro que revise las notas de un examen en la columna A. Si la nota es 5 o superior, escribirá «Aprobado» en la columna B; de lo contrario, escribirá «Suspenso».
| Alumno | Nota (Col A) | Estado (Col B) – Resultado |
|---|---|---|
| Ana | 8 | Aprobado |
| Juan | 4 | Suspenso |
| María | 9 | Aprobado |
Sub EvaluarNotas()
' Declaramos una variable para recorrer las filas
Dim i As Long
' Bucle para recorrer desde la fila 2 hasta la última con datos en la columna A
For i = 2 To Range("A" & Rows.Count).End(xlUp).Row
' Evaluamos la nota en la columna A de la fila actual
If Cells(i, 1).Value >= 5 Then
' Si es mayor o igual a 5, escribimos "Aprobado"
Cells(i, 2).Value = "Aprobado"
Else
' Si no, escribimos "Suspenso"
Cells(i, 2).Value = "Suspenso"
End If
Next i
End Sub
Fíjate cómo hemos combinado el flujo de control If con un bucle For para aplicar la lógica a toda una columna, ¡automatización en estado puro!
Múltiples Condiciones: If…Then…ElseIf
Para escenarios más complejos con varias condiciones, podemos anidar varias comprobaciones con ElseIf.
If [condición1] Then
' Código si la condición1 es verdadera
ElseIf [condición2] Then
' Código si la condición2 es verdadera
Else
' Código si ninguna de las anteriores es verdadera
End If
Ejemplo práctico: Mejoremos la macro de notas para asignar una calificación más detallada: «Sobresaliente» (>=9), «Notable» (>=7), «Aprobado» (>=5) y «Suspenso» (<5).
Sub AsignarCalificacion()
Dim i As Long
For i = 2 To Range("A" & Rows.Count).End(xlUp).Row
If Cells(i, 1).Value >= 9 Then
Cells(i, 2).Value = "Sobresaliente"
ElseIf Cells(i, 1).Value >= 7 Then
Cells(i, 2).Value = "Notable"
ElseIf Cells(i, 1).Value >= 5 Then
Cells(i, 2).Value = "Aprobado"
Else
Cells(i, 2).Value = "Suspenso"
End If
Next i
End Sub
Para más detalles sobre esta estructura, puedes consultar la documentación oficial de Microsoft.
La Estructura Select Case: Ideal para Múltiples Opciones
Cuando necesitas evaluar una única variable o expresión frente a una lista de posibles valores, una larga cadena de If...ElseIf puede volverse difícil de leer. Para estos casos, VBA nos ofrece una alternativa más elegante y ordenada: Select Case.
Esta estructura compara una variable con diferentes «casos» y ejecuta el bloque de código correspondiente al primer caso que coincida.
Select Case [variable_a_evaluar]
Case [valor1]
' Código a ejecutar si la variable es igual a valor1
Case [valor2]
' Código a ejecutar si la variable es igual a valor2
Case Is > [valor3]
' Código a ejecutar si la variable es mayor que valor3
Case Else
' Código a ejecutar si no coincide con ningún caso anterior
End Select
Ejemplo práctico: Tenemos una lista de productos con un código de departamento en la columna A («ELE», «HOG», «ALI»). Queremos que una macro escriba el nombre completo del departamento en la columna B.
| Código (Col A) | Departamento (Col B) – Resultado |
|---|---|
| ELE | Electrónica y Tecnología |
| HOG | Hogar y Decoración |
| JUG | Juguetes |
| XYZ | Categoría Desconocida |
Sub CategorizarProductos()
Dim i As Long
For i = 2 To Range("A" & Rows.Count).End(xlUp).Row
' Evaluamos el valor de la celda en la columna A
Select Case UCase(Cells(i, 1).Value) 'UCase para ignorar mayúsculas/minúsculas
Case "ELE"
Cells(i, 2).Value = "Electrónica y Tecnología"
Case "HOG"
Cells(i, 2).Value = "Hogar y Decoración"
Case "ALI"
Cells(i, 2).Value = "Alimentación"
Case "JUG"
Cells(i, 2).Value = "Juguetes"
Case Else
Cells(i, 2).Value = "Categoría Desconocida"
End Select
Next i
End Sub
Como puedes ver, el resultado es mucho más limpio y fácil de mantener que usar cuatro o cinco If...ElseIf anidados. Es la herramienta perfecta cuando la decisión se basa en el valor específico de una sola celda o variable. Puedes aprender más en la página oficial de Microsoft sobre Select Case.
Conclusión: Tus Macros, Más Inteligentes que Nunca
Dominar los flujos de control como If...Then...Else y Select Case es dar un salto cualitativo en la creación de macros. Pasas de ser un simple «grabador» de acciones a un «programador» que puede infundir lógica y capacidad de decisión en sus automatizaciones. Estas estructuras son los cimientos que te permitirán construir soluciones robustas y flexibles, capaces de adaptarse a diferentes escenarios y datos sin necesidad de intervención manual.
Te animo a que abras el editor de VBA (Alt + F11) y empieces a experimentar. Toma una de tus tareas repetitivas y piensa: ¿Qué decisiones tomo mientras la realizo? Luego, intenta traducir esa lógica a una estructura If o Select Case. Verás cómo tus hojas de cálculo empiezan a trabajar para ti de una forma mucho más inteligente. ¡El límite lo pone tu imaginación!
