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
- Escribir un
Subcon un bloqueSelect Case(como el anterior) que asigne una cadena de estado basada en un número de stock fijo. - Probarlo tres veces dentro del mismo
Subcambiando el valor de stock: prueba con 0, 15 y 134, imprimiendo el resultado conDebug.Printcada vez. - Añadir una cuarta condición para exactamente 20 (el nivel de reposición del teclado) y confirmar qué Case la detecta.
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 conSelect Case stockLevel— copiar la misma estructura deCasedel ejemplo de la sección 2.4 (Case 0,Case 1 To 19,Case 20 To 49,Case Is > 50). - Cada
Casedebe asignar un valor de texto diferente astatus.
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 mismoSub, uno tras otro. - Después de cada asignación,
Debug.Print statusmostrará 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 19y dónde comienzaCase 20 To 49— uno de esos dos ya incluye el 20. - Como
Select Casese detiene en la primera coincidencia, agregar una línea separadaCase 20solo cambia algo si la colocas antes del caso que de otro modo la capturaría. - Ejecútalo con
stockLevel = 20específicamente y verifica qué mensaje se imprime; eso te indica quéCaserealmente lo capturó, sin necesidad de agregar nada nuevo.
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
¡Gracias por tus comentarios!
Pregunte a AI
Pregunte a AI
Pregunte lo que quiera o pruebe una de las preguntas sugeridas para comenzar nuestra charla