VBA Sentencia Select Case
In this Article
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
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:
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:
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