VBA Sentencia Select Case

Written by

Editorial Team

Reviewed by

Steve Rynearson

Translated by

Dennis Madrid

Last updated on febrero 28, 2022

En VBA, la sentencia Select Case es una alternativa a la sentencia If-Then que le permite comprobar si se cumplen las condiciones, ejecutando un código específico para cada condición. La sentencia Select es preferible a la sentencia If cuando hay múltiples condiciones que procesar.

Ejemplo de Caso Select

Este ejemplo pregunta al usuario con un MessageBox SíNoCancelar y comprueba qué opción ha seleccionado el usuario:

Sub Select_Case_Si_No_Cancelar()
    Dim resultado As VbMsgBoxResult
    
    resultado = MsgBox("...", vbYesNoCancel)
    
    Select Case resultado 
        Case vbYes
            MsgBox "Si"
        Case vbNo
            MsgBox "No"
        Case vbCancel
            MsgBox "Cancelar"
    End Select
End Sub

Selec Case

A continuación hemos escrito el equivalente utilizando una sentencia If en su lugar. Notará que la sentencia Case Select implica un poco menos de escritura – este beneficio se amplía cuando se prueban múltiples criterios.

Sub Si_Si_No_Cancelar()
    Dim resultado As VbMsgBoxResult
    
    resultado = MsgBox("...", vbYesNoCancel)
    
    If resultado = vbYes Then
        MsgBox "Si"
    ElseIf resultado = vbNo Then
        MsgBox "No"
    ElseIf resultado = vbCancel Then
        MsgBox "Cancelar"
    End If
End Sub

Sintaxis de la sentencia Case

La sintaxis de la sentencia Select Case es la siguiente:

Select Case [Expresión de prueba]
    Case [Condición 1]
        [Acción si la condición 1 es verdadera]
    Case [Condición 2]
        [Acción si la condición 2 es verdadera]
    Case [Condición n]
        [Acción si la condición n es verdadera]
    Case Else
        [Acción si ninguna es verdadera]
End Select

Donde:

[Expresión de prueba] – Es el valor a evaluar. Normalmente es una variable.

[Acción si la condición n es verdadera ] – Es sólo el código a ejecutar si la condición se cumple (al igual que con una declaración If)

[Condición n ] – Es la condición a probar. Hay muchas maneras diferentes de probar las condiciones. Las discutiremos a continuación.

La sentencia Case ejecutará el código para la PRIMERA condición que se encuentre como TRUE. Si no se cumple ninguna condición entonces no se ejecutará ningún código, a menos que se agregue la cláusula Else.

Select Case – Criterios

Select Case puede ser usado para evaluar tanto valores numéricos como texto. Primero discutiremos cómo usar Select Case para evaluar expresiones numéricas.

Coincidencia Exacta – Números

Puede probar fácilmente una coincidencia exacta con una sentencia Case:

Case 10

o agregar comas para probar coincidencias exactas con múltiples números:

Case 20, 30, 40
Sub CoincidenciaExactaNUmeros()
    Dim n As Integer
    n = CInt(InputBox("..."))
    
    Select Case n
        Case 10
            ' Si n es 10 entonces
        Case 20, 30, 40
            ' Si n es 20/30/40 entonces
        Case Else
            ' Si n NO es 10/20/30/40 entonces
    End Select
    
End Sub

Rangos

Puedes comprobar si un número está dentro de un rango de la siguiente manera

Case 55 To 74

Este procedimiento generará una letra de calificación para un estudiante basado en su calificación numérica:

Sub CalculoDeGradoe()
    Dim puntaje As Integer
    Dim calificacion As String
 
    puntaje = InputBox("Introduzca el puntaje del estudiante")
    
    Select Case puntaje 
        Case 90 To 100
            calificacion = "A"            
        Case 80 To 90
            calificacion = "B"          
        Case 70 To 80
            calificacion = "C"            
        Case 60 To 70
            calificacion = "D"            
        Case Else
            calificacion = "F"
    End Select
    
    MsgBox "La calificación del estudiante es: " & calificacion 
    
End Sub

También puede probar rangos con la función Case Is

Select Case Is

Case is < 55
  'No hacer nada
Case <= 74
 MsgBox "En rangoe"

Recuerde que la sentencia Case sólo ejecutará código para la primera coincidencia.

Este procedimiento calculará la calificación de un estudiante usando el Caso Is en lugar del Case To.

Sub Select_Case_Is_Grade()
    Dim puntaje      As Integer
    Dim calificacion As String
    
    puntaje = InputBox("Introduzca el puntaje del estudiante")
    
    Select Case puntaje
        Case Is >= 90
            calificacion = "A"
        Case Is >= 80
            calificacion = "B"
        Case Is >= 70
            calificacion = "C"
        Case Is >= 60
            calificacion = "D"
        Case Else
            calificacion = "F"
    End Select
    
    MsgBox "La calificación del estudiante es: " & calificacion
    
End Sub

Case Else

Puede agregar «Case Else» al final de su sentencia Case para hacer algo si no se cumple ninguna condición:

Case Else

Mira el final del ejemplo de código anterior para ver cómo se puede usar Case Else.

Select Case – Texto y el Operador Like

Hasta ahora nuestros ejemplos de Select Case han funcionado sólo con números. También puedes usar sentencias Select Case con texto.

Coincidencia Exacta – Texto

Puede probar si la expresión coincide con una frase exacta como esta

Case "Remolacha"

O utilice comas para probar si la expresión coincide exactamente con más de una frase:

Case "Manzana", "Plátano", "Naranja"

La combinación de todo esto es la siguiente

Sub coincidenciaExactaComida()
 
Select Case Range("a1").Value
    Case "Remolacha"
        MsgBox "Vegetales"
    Case "Manzana", "Banana", "Naranja"
        MsgBox "Fruta"
End Select
 
End Sub

Mayúsculas y minúsculas

Por defecto, VBA distingue entre mayúsculas y minúsculas. Esto significa que VBA considera «Texto» diferente a «texto». Para desactivar la sensibilidad a las mayúsculas y minúsculas, agregue la opción Comparar Texto en la parte superior de su módulo:

Option Compare Text

Este ejemplo hará que la Selección de Casos no distinga entre mayúsculas y minúsculas cuando se trabaje con texto:

Option Compare Text
 
Sub BusquedaExactaDeComida()
 
Select Case Range("a1").Value
    Case "Remolacha"
        MsgBox "Vegetales"
    Case "Manzana", "Banana", "Naranja"
        MsgBox "Frutas"
End Select
 
End Sub

Caso Like

El Operador Like permite hacer comparaciones inexactas. Si el texto coincide, Like devuelve TRUE, si no coincide devuelve FALSE. Esto hace que el operador Like sea fácil de usar con las sentencias If, sin embargo no funcionará tan fácilmente con las sentencias Case.

Caso Like – Una prueba fallida

El siguiente código demuestra que el operador Like no funciona con Select Case:

Sub Select_Case_Like_No_Funciona()
    Dim palabra As String
    palabra = "COCOA"
    
    Select Case palabra 
        Case palabra Like "*C*C*"
            MsgBox "Buena"
        Case Else
            MsgBox "Mala"
    End Select
End Sub

Case Like – La forma correcta

Sin embargo, podemos añadir la expresión TRUE para hacer que la sentencia Select funcione con el operador Like:

Sub Select_Case_Like_FormaCorrecta()
    Dim palabra As String
    palabra = "COCOA"
    
    Select Case True
        Case palabra Like "*C*C*"
            MsgBox "Buena"
        Case Else
            MsgBox "Mala"
    End Select
End Sub

Case – :

Cuando se utiliza una sentencia Case puede añadir tantas líneas de código como quiera ejecutar con cada condición. Sin embargo, si sólo necesita ejecutar una línea de código. Puede usar dos puntos ( : ) para escribir todo en la misma línea. Aquí está el mismo ejemplo de la calificación del estudiante que antes, excepto que usando dos puntos para acortar el código:

Sub CalculoCalificacionUsandoDosPuntos()
Dim puntaje As Integer
Dim calificacion As String
 
    puntaje= InputBox("Introduzca el puntaje del estudiante")
    
    Select Case puntaje
        Case 90 To 100: calificacion = "A"
        Case 80 To 90: calificacion = "B"
        Case 70 To 80: calificacion = "C"
        Case 60 To 70: calificacion = "D"
        Case Else: calificacion = "F"
    End Select
    
    MsgBox "La calificación del estudiante es: " & calificacion 
    
End Sub

Case Select – AND / OR – Condiciones Múltiples

Puede utilizar los operadores And / Or  para probar criterios adicionales junto con el Select Case. En este ejemplo estamos usando un Select Case en la variable ‘edad’, pero también queremos probar el sexo. Así que usamos el Operador And para realizar la prueba más compleja:

Sub SelecCaseAnidados()
    Dim sexo As String
    Dim edad As Integer
    
    sexo = "Masculino" ' o Masculino
    edad = 15
    
    Select Case edad
        Case Is < 20 And sexo = "Masculino"
            MsgBox "Masculino menor a 20 años"
        Case Is < 20 And sexo = "Femenino"
            MsgBox "Femenino menor a 20 años"
        Case Is >= 20 And sexo = "Masculino"
            MsgBox "Masculino mayor o igual a 20 años"
        Case Is >= 20 And sexo = "Femenino"
            MsgBox "Femenino mayor o igual a 20 años"
    End Select
End Sub

Sentencias Case anidadas

Al igual que las sentencias If, puedes anidar las sentencias Case unas dentro de otras:

Sub NestedSelectCase()
    Dim sex As String
    Dim age As Integer
    
    sexo = "masculino" ' o femenino
    edad = 15
    
    Select Case edad
        Caso Es < 20
            Select Case sexo
                Case "hombre"
                    MsgBox "Hombre menor de 20 años"
                Case "female"
                    MsgBox "Mujer menor de 20 años"
            End Select
        Case Is >= 20 And sex = "female"
            Select Case sexo
                Case "masculino"
                    MsgBox "Hombre mayor de 20 años"
                Case "female"
                    MsgBox "Mujer mayor de 20 años"
            End Select
    End Select
Fin de Sub

Sentencia Case vs. Sentencia If

Cuantas más condiciones haya que probar, más útil es la sentencia Case en comparación con la sentencia If. Veamos un ejemplo. Aquí está el código requerido para probar si el nombre de una hoja de trabajo es igual a un conjunto de valores utilizando una sentencia If:

Sub SelectCaseVsIf()
    If Nombre = "Pedro" Or Nombre = "Pablo" Or Nombre = "Carlos" Or _
        Nombre = "José" Or Nombre = "Juan" Or Nombre = "Antonio" Or _
        Nombre = "Carlo" Or Nombre = "Tomas" Or Nombre = "Otro" Then
        'hacer algo
    End If
End Sub

Aquí está el mismo código usando una sentencia Select en su lugar:

Sub SelectCaseVsIf2()
    Select Case Nombre
    Case "Pedro", "Pablo", "Carlos", "José", "Juan", _
     "Antonio", "Carlo", "Tomas", "Otro"
        'hacer algo
    End Select
End Sub

Puede ver que es mucho más fácil usar una sentencia Select en este escenario. Es significativamente menos escritura, y es mucho más fácil de leer.

VBA Ejemplos de Select Case

Ej. 1. Función Definida por el Usuario (UDF)

Reproduzcamos nuestro ejemplo de cálculo de notas anterior y creemos una UDF para calcular la puntuación de un estudiante:

Function ObtenerCalificacion(puntaje As Integer) As String
    Select Case puntaje
        Case 90 To 100
            ObtenerCalificacion = "A"
        Case 80 To 90
            ObtenerCalificacion = "B"
        Case 70 To 80
            ObtenerCalificacion = "C"
        Case 60 To 70
            ObtenerCalificacion = "D"
        Case Else
            ObtenerCalificacion = "F"
    End Select
End Function

Ahora podemos utilizar la función GetGrade en nuestra hoja de cálculo de Excel para calcular rápidamente las calificaciones de los estudiantes:

Funcion Obtener Calificacion

Ej. 2. Prueba sobre el Nombre de la Hoja / Sentencia Select Case en Bucle For

Este código hará un bucle a través de todas las hojas de trabajo en un libro de trabajo, desprotegiendo las hojas que cumplan ciertos criterios:

Sub Case_DesprotegerHoja()
    Dim hoja As Worksheet
    
    For Each hoja In Worksheets
        Select Case hoja.Name    'Lista de 3 o 4 hojas
        Case "Datos", "TD", "Procesos", "Totales"
            hoja.Unprotect
        End Select
    Next hoja
End Sub

Ej. 3. Select Case  – Valor de la celda

Este ejemplo probará la puntuación de un estudiante en una celda, mostrando la letra de la calificación directamente en la celda de la derecha.

Sub PruebaValordeCelda()
    Dim celda As Range
    Set celda = Range("C1")
 
    Select Case celda.Value
    Case 90 To 100
        celda.Offset(0, 1) = "A"
    Case 80 To 90
        celda.Offset(0, 1) = "B"
    Case 70 To 80
        celda.Offset(0, 1) = "C"
    Case 60 To 80
        celda.Offset(0, 1) = "D"
    End Select
 
End Sub

Ej. 4. Select Case – Fechas

Este ejemplo de Case Select es una función que prueba en qué trimestre cae una fecha.

Sub pruebaFecha()
    MsgBox obtenerTrimestre(CDate("7/20/2019"))
End Sub
 
Function obtenerTrimestre(dt As Date) As Integer
    Dim hoja As Worksheet
 
    Select Case dt
        Case CDate("01/01/2019") To CDate("31/03/2019")
            obtenerTrimestre = 1
        Case CDate("01/04/2019") To CDate("30/06/2019")
            obtenerTrimestre = 2
        Case CDate("01/07/2019") To CDate("30/09/2019")
            obtenerTrimestre = 3
        Case CDate("01/10/2019") To CDate("31/12/2019")
            obtenerTrimestre = 4
    End Select
End Function

Como es una función, puedes usarla como una función dentro de Excel:

Funcion Obtener Trimestre

Ej. 5 Comprobar si un número es par o impar

Este ejemplo comprueba si un número es par o impar.

Sub ChequearParImpar()
    Dim n As Integer
    n = InputBox("Introduzca un número")
    
    Select Case n Mod 2
        Case 0
            MsgBox "El número es par."
        Case 1
            MsgBox "El número es impar."
    End Select
    
End Sub

Ej. 6 Comprobar si la fecha cae en día de la semana o en fin de semana

Estos ejemplos comprobarán si una fecha cae en un día de la semana o en un fin de semana.

Sub ComprobarDiaDeLaSemana()
    Dim dt As Date
    dt = CDate("1/1/2020")
    
    Select Case Weekday(dt)
        Case vbMonday
            MsgBox "Es lunes"
        Case vbMartes
            MsgBox "Es martes"
        Case vbMiércoles
            MsgBox "Es miércoles"
        Case vbJueves
            MsgBox "Es jueves"
        Case vbFriday
            MsgBox "Es viernes"
        Case vbSábado
            MsgBox "Es sábado"
        Case vbDomingo
            MsgBox "Es domingo"
    End Select
End Sub
Sub ComprobarSiEsFinDeSemana()
    Dim dt As Date
    dt = CDate("1/1/2020")
    
    Select Case Weekday(dt)
        Case vbSábado, vbDomingo
            MsgBox "Es un fin de semana"
        Case Else
            MsgBox "No es un fin de semana"
    End Select

End Sub

VBA Select Case en Access

Todos los ejemplos anteriores funcionan exactamente igual en Access VBA que en Excel VBA.

Sub pruebaValordeCelda()
    Dim dbs As Database
    Dim rst As Recordset
    Set dbs = CurrentDB
    Set rst = dbs.OpenRecordset("tblClients", dbOpenDynaset)
    With rst
       .MoveFirst
       .Edit
       Select Case rst.Fields("City")
       Case "Austin"
           .rst.Fields("TelCode") = "512"
       Case "Chicago"
           .rst.Fields("TelCode") = "312"
       Case "New YorK"
           .rst.Fields("TelCode") = "1212"
       Case "San Fransisco"
           .rst.Fields("TelCode") = "415"
    End Select
    .Update
   End With
End Sub
vba-free-addin

Complemento de Ejemplos de Código de VBA

Acceda fácilmente a todos los ejemplos de código que se encuentran en nuestro sitio.

Simplemente navegue al menú, haga clic y el código se insertará directamente en su módulo. Complemento .xlam.

(¡No se requiere instalación!)

Descarga gratuita

Return to VBA Code Examples