Programando decisiones con Select Case en VBA
VBA no solo cuenta con la estructura If-Then para analizar varias condiciones y ejecutar códigos en función de ellas. En caso de que la condición a evaluar tenga tres o más posibilidades te recomiendo usar la estructura Select Case
en su lugar, pues es más fácil seguir el código.
Otra ventaja que tiene usar Select Case
es que se pueden agrupar varias de esas posibilidades para ejecutar un solo código.
Un ejemplo muy claro que de muestra que es mejor usar Select Case
en lugar de If-Then
es a la hora de calificar los exámenes de los alumnos según la puntuación obtenida: <5: Suspenso, entre 5 y 6 aprobado, entre 6 y 7 bien, entre 7 y 9 notable y 9 y 10 sobresaliente (como ves hay cinco posibilidades). Este ejemplo lo veremos más adelante.
Sintaxis de Select Case
La sintaxis de Select Case
es sencilla:
Select Case mi_condición
Case condición_1
'código para condición_1
Case condición_2
'código para condición_2
'
'
'
Case condición_n
'código para condición_n
Case Else
'código para cuando no hay coincidencias
End Select
En el pseudocódigo anterior:
Mi_condición
es la expresión cuyo valor se va a analizar. Lo entenderás mejor con los ejemplos siguientes.Condición_1
,condición_2
, …,condición_n
son las condiciones en las que se comprueba la expresión anterior. Si la condición se cumple, se ejecuta el bloque de código de dicha condición.- En caso de que ninguna de las condiciones anteriores se cumpla, se ejecutará el bloque de código asociado a
Case Else
. - Con
End Select
se indica dónde finaliza la estructura.
IMPORTANTE: En el momento en el que se cumple una condición y se ejecuta el bloque de código asociado, VBA sale de la estructura Select Case
. Esto significa que si tienes cinco condiciones y la segunda condición se cumple, VBA saldrá de la estructura y el resto de las condiciones no se evaluarán.
Ejemplos de Select Case
Veamos algunos ejemplos. Te recomiendo probar los códigos en un módulo estándar (ni en el objeto ThisWorkbook ni en las hojas). Muchos de ellos no tienen aplicación práctica pero me ha parecido la mejor forma de mostrarte su uso.
Cómo comprobar números
Sub CompruebaNumero()
Dim Numero As Integer
Numero = InputBox("Introduce un número del 1 al 5")
Select Case Numero
Case 1
MsgBox "Has introducido el número 1"
Case 2
MsgBox "Has introducido el número 2"
Case 3
MsgBox "Has introducido el número 3"
Case 4
MsgBox "Has introducido el número 4"
Case 5
MsgBox "Has introducido el número 5"
End Select
End Sub
En el ejemplo se solicita un número del uno al cinco cuyo valor se almacena en la variable Numero
. En la línea Select Case
Numero
se muestra la expresión a evaluar. En las líneas Case 1
, Case 2
, …, Case 5
se compara el valor de la expresión con el del primer Case
. Si coincide, se muestra el cuadro de mensaje ‘Has introducido el número 1’. En caso contrario pasa al siguiente. Si en la función InputBox
has introducido por ejemplo un 3, cuando se evalúa la instrucción Case
3 entra en el código asociado y, tras ejecutarlo, sale de la estructura Select Case
.
En caso de introducir un 6, la estructura Select Case
no hace nada, pues la expresión (6) no coincide con ninguna de las condiciones.
Uso de Select Case con la claúsula Is
Las condiciones anteriores devuelven verdadero cuando la expresión es igual que el valor suministrado en la condición. Además de la condición de igualdad puedes establecer otras comparaciones gracias a la cláusula Is
. Por ejemplo, el siguiente procedimiento comprueba si el número introducido es mayor de 100 o no.
Sub CompruebaNumero()
Dim Dato As Integer
Dato = InputBox("Introduce un número")
Select Case Dato
Case Is < 100
MsgBox "El número introducido es menor de 100"
Case Is >= 100
MsgBox "El número introducido es igual o mayor de 100"
End Select
End Sub
Con un rango de números
Mediante la cláusula Is
podrías establecer dos condiciones para validar que solo se puedan introducir números mayores de cierto valor y menores de cierto valor (que se encuentren entre dos números).
La cláusula To
simplifica esa tarea pudiendo comprobar en una sola línea si el número introducido se encuentra en un rango de números. Observa el siguiente procedimiento:
Sub CompruebaNumero()
Dim Dato As Integer
Dato = InputBox("Introduce un número del 1 al 100")
Select Case Dato
Case 1 To 30
MsgBox "El número introducido se encuentra entre 1 y 30"
Case 31 To 60
MsgBox "El número introducido se encuentra entre 31 y 60"
Case 61 To 100
MsgBox "El número introducido se encuentra entre 61 y 100"
End Select
End Sub
Según el número introducido se muestra uno u otro mensaje.
Uso de Case Else
En el ejemplo anterior se solicita un número del 1 al 100. En caso de que el usuario introduzca un valor que no se encuentre entre las tres condiciones establecidas puedes usar la instrucción Case Else
para recoger cualquier otro valor no contemplado en ellas. Observa el procedimiento:
Sub CompruebaNumero()
Dim Dato As Integer
Dato = InputBox("Introduce un número del 1 al 100")
Select Case Dato
Case 1 To 30
MsgBox "El número introducido se encuentra entre 1 y 30"
Case 31 To 60
MsgBox "El número introducido se encuentra entre 31 y 60"
Case 61 To 100
MsgBox "El número introducido se encuentra entre 61 y 100"
Case Else
MsgBox "El número introducido no se encuentra entre 1 y 100"
End Select
End Sub
Hasta aquí los ejemplos básicos de uso. A continuación veremos algunos ejemplos más prácticos.
Calificaciones según la puntuación obtenida
El siguiente procedimiento muestra la calificación de un examen en función de la nota obtenida.
Sub Calificacion()
Dim NotaExamen As Double
Dim NotaFinal As String
NotaExamen = InputBox("Introduce la nota")
Select Case NotaExamen
Case Is < 5
NotaFinal = "Insuficiente"
Case 5 To 5.99
NotaFinal = "Suficiente"
Case 6 To 6.99
NotaFinal = "Bien"
Case 7 To 8.99
NotaFinal = "Notable"
Case 9 To 10
NotaFinal = "Sobresaliente"
End Select
MsgBox "La calificación es de " & NotaFinal
End Sub
Una función personalizada con Select Case
El ejemplo anterior solicita la nota del examen mediante la función InputBox.
También puedes crear una función personalizada (una UDF o User Defined Function) para devolver la calificación del examen según la nota introducida en una celda. La función personalizada se podrá usar como cualquier función de hoja de Excel.
Este es el código:
Function Calificacion(notaexamen As Double)
Dim NotaFinal As String
Select Case notaexamen
Case Is < 5
NotaFinal = "Insuficiente"
Case 5 To 5.99
NotaFinal = "Suficiente"
Case 6 To 6.99
NotaFinal = "Bien"
Case 7 To 8.99
NotaFinal = "Notable"
Case 9 To 10
NotaFinal = "Sobresaliente"
End Select
Calificacion = NotaFinal
End Function
Ahora ya puedes escribir lo siguiente en una celda de Excel:
Comprobar si un número es par o impar
El siguiente código comprueba si el número introducido en la celda A1 es par o impar.
ATENCIÓN: No he contemplado otras validaciones como que la celda se encuentre vacía o contenga un texto:
Sub ParImpar()
ValorCelda = Range("A1").Value
Select Case (ValorCelda Mod 2) = 0
Case True
MsgBox "El número es par"
Case False
MsgBox "El número es impar"
End Select
End Sub
El código anterior divide entre dos el valor de la celda A1. Si el residuo (el resto) es igual a cero la expresión devuelve el valor True
, pues se trata de un número par. A continuación se evalúa el resultado mostrando el cuadro de mensaje adecuado a la respuesta.
Comprobar si es fin de semana
Como comenté anteriormente, puedes comprobar varios valores en el mismo Case
.
Por ejemplo, el siguiente código utiliza la fecha de hoy para mostrar si se trata de un día laborable o es fin de semana (el 1 corresponde al domingo y el 7 al sábado):
Sub DiaSemana()
Select Case Weekday(Now)
Case 1, 7
MsgBox "Hoy es fin de semana"
Case Else
MsgBox "Hoy es día laborable"
End Select
End Sub
La función Weekday
evalúa el día de la semana del día de hoy (Now
). Si es 1 o 7 (domingo o sábado) devuelve un mensaje y si es cualquier otro día devuelve otro.
Comprobar cadenas de texto con Select Case
Todos los ejemplos anteriores han evaluado expresiones y condiciones relacionadas con números. Sin embargo no se queda ahí. También puedes comprobar cadenas de texto usando Select Case
.
En el siguiente código se pide al usuario que introduzca el nombre de su departamento, mostrando la persona con la que debe contactar.
Sub Contacto()
Dim Departamento As String
Departamento = InputBox("Introduce el nombre del departamento")
Select Case Departamento
Case "Marketing"
MsgBox "Contactar con Ramón Rincón"
Case "Financiero"
MsgBox "Contactar con María Martín"
Case "Personal"
MsgBox "Contactar con Juan Jiménez"
Case "Administrativo"
MsgBox "Contactar con Margarita Mora"
Case Else
MsgBox "Contactar con Manuel Mendoza"
End Select
End Sub
Resumen
La estructura Select Case
es una de las más usadas en VBA y permite evaluar una expresión y ejecutar diferentes bloques de código en función de la coincidencia encontrada. Se recomienda su uso en lugar de If-Then Else
cuando los valores que podría tomar la expresión son más de 3 ó 4, pues la legibilidad es mucho mejor y el tiempo de ejecución es menor