Programando decisiones con Select Case en VBA

Instrucción Select Case VBA Excel

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