Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Aprende Lógica condicional | Fundamentos de VBA
Excel VBA para Automatización Empresarial

Lógica condicional

Desliza para mostrar el menú

Hasta ahora, todo ha tratado sobre almacenar y comprobar valores. La lógica condicional es donde tu código realmente comienza a tomar decisiones: ejecutando un bloque de instrucciones en lugar de otro, dependiendo del resultado de esas comprobaciones.

If...Then

La forma más simple: ejecutar una acción solo si se cumple una condición.

If currentStock < reorderLevel Then
    MsgBox "Reorder needed!"
End If

Si la condición de If es False, VBA simplemente salta a lo que sigue después de End If: no ocurre nada y no se produce ningún error.

If...ElseIf...Else

Gestiona más de dos posibles resultados encadenando condiciones:

If currentStock = 0 Then
    status = "Out of Stock"
ElseIf currentStock < reorderLevel Then
    status = "Reorder Now"
ElseIf currentStock < reorderLevel * 2 Then
    status = "Watch Closely"
Else
    status = "Healthy"
End If

VBA evalúa estas condiciones de arriba hacia abajo y se detiene en la primera que sea True: nunca comprueba las siguientes, incluso si alguna posterior también sería técnicamente True. Por eso el orden es importante: si currentStock es 0, la primera condición (= 0) la detecta y status se convierte en "Out of Stock" inmediatamente. Observa que 0 también es técnicamente menor que reorderLevel, así que si la línea ElseIf currentStock < reorderLevel se evaluara primero, informaría incorrectamente "Reorder Now" para un artículo que está completamente agotado. Colocar la condición más específica y urgente primero —y solo recurrir a condiciones más generales después— es lo que hace que una cadena como esta funcione correctamente.

Select Case

Cuando se comprueba una sola variable contra varios valores fijos posibles, Select Case expresa lo mismo que una larga cadena de ElseIf, pero se lee de manera más clara:

Select Case category
    Case "Electronics"
        discountRate = 0.05
    Case "Office"
        discountRate = 0.1
    Case Else
        discountRate = 0
End Select

Select Case también maneja rangos de números de forma elegante, lo cual es más difícil de leer como una cadena de comparaciones ElseIf:

Select Case currentStock
    Case 0
        status = "Out of Stock"
    Case 1 To 19
        status = "Low"
    Case 20 To 49
        status = "Adequate"
    Case Is >= 50
        status = "Well Stocked"
End Select

Case 1 To 19 coincide con cualquier valor del 1 al 19 inclusive; Case Is >= 50 utiliza Is para comparar contra la variable que se está evaluando en lugar de un rango fijo.

Tarea

  1. Escribir un Sub con un bloque Select Case (como el anterior) que asigne una cadena de estado basada en un número de stock fijo.
  2. Probarlo tres veces dentro del mismo Sub cambiando el valor de stock: prueba con 0, 15 y 134, imprimiendo el resultado con Debug.Print cada vez.
  3. Añadir una cuarta condición para exactamente 20 (el nivel de reposición del teclado) y confirmar qué Case la detecta.
Pista
expand arrow

1. Escribir el Sub con Select Case

  • Declarar una variable para almacenar el número de existencias y otra para el texto resultante (status).
  • Asignar primero un valor fijo a la variable de existencias (por ejemplo, stockLevel = 0), luego ejecutarla con Select Case stockLevel — copiar la misma estructura de Case del ejemplo de la sección 2.4 (Case 0, Case 1 To 19, Case 20 To 49, Case Is > 50).
  • Cada Case debe asignar un valor de texto diferente a status.

2. Probar tres valores en un solo Sub

  • No es necesario crear tres procedimientos separados; simplemente cambia el valor de la variable, ejecuta el bloque Select Case, imprime el resultado, luego cambia el valor de nuevo y ejecútalo una segunda vez, todo dentro del mismo Sub, uno tras otro.
  • Después de cada asignación, Debug.Print status mostrará el resultado en la ventana Inmediata sin que aparezcan ventanas emergentes que interrumpan las otras dos pruebas.

3. Agregar un caso para exactamente 20

  • Vuelve al ejemplo original de la sección 2.4 y observa cuidadosamente dónde termina Case 1 To 19 y dónde comienza Case 20 To 49 — uno de esos dos ya incluye el 20.
  • Como Select Case se detiene en la primera coincidencia, agregar una línea separada Case 20 solo cambia algo si la colocas antes del caso que de otro modo la capturaría.
  • Ejecútalo con stockLevel = 20 específicamente y verifica qué mensaje se imprime; eso te indica qué Case realmente lo capturó, sin necesidad de agregar nada nuevo.
Solución
expand arrow
Sub ClassifyStockLevels()
    Dim stockLevel As Integer
    Dim status As String

    ' --- Test 1 ---
    stockLevel = 0
    Select Case stockLevel
        Case 0
            status = "Out of Stock"
        Case 20
            status = "Exactly at Reorder Level"
        Case 1 To 19
            status = "Low"
        Case 20 To 49
            status = "Adequate"
        Case Is > 50
            status = "Well Stocked"
    End Select
    Debug.Print stockLevel & " -> " & status

    ' --- Test 2 ---
    stockLevel = 15
    Select Case stockLevel
        Case 0
            status = "Out of Stock"
        Case 20
            status = "Exactly at Reorder Level"
        Case 1 To 19
            status = "Low"
        Case 20 To 49
            status = "Adequate"
        Case Is > 50
            status = "Well Stocked"
    End Select
    Debug.Print stockLevel & " -> " & status

    ' --- Test 3 ---
    stockLevel = 134
    Select Case stockLevel
        Case 0
            status = "Out of Stock"
        Case 20
            status = "Exactly at Reorder Level"
        Case 1 To 19
            status = "Low"
        Case 20 To 49
            status = "Adequate"
        Case Is > 50
            status = "Well Stocked"
    End Select
    Debug.Print stockLevel & " -> " & status

    ' --- Test 4: exactly 20 ---
    stockLevel = 20
    Select Case stockLevel
        Case 0
            status = "Out of Stock"
        Case 20
            status = "Exactly at Reorder Level"
        Case 1 To 19
            status = "Low"
        Case 20 To 49
            status = "Adequate"
        Case Is > 50
            status = "Well Stocked"
    End Select
    Debug.Print stockLevel & " -> " & status
End Sub
¿Todo estuvo claro?

¿Cómo podemos mejorarlo?

¡Gracias por tus comentarios!

Sección 2. Capítulo 4

Pregunte a AI

expand

Pregunte a AI

ChatGPT

Pregunte lo que quiera o pruebe una de las preguntas sugeridas para comenzar nuestra charla

Sección 2. Capítulo 4
some-alt