VBA – Instrução Select Case
In this Article
No VBA, a instrução Select Case é uma alternativa à instrução Instrução If-Then permitindo que você teste se as condições são atendidas, executando um código específico para cada condição. A instrução Select é preferível à instrução If quando há várias condições a serem processadas.
Exemplo de Select Case
Este exemplo solicita ao usuário uma MessageBox YesNoCancel e testa qual opção o usuário selecionou:
Sub Select_Case_Sim_Nao_Cancelar()
Dim nResultado As VbMsgBoxResult
nResultado = MsgBox("...", vbYesNoCancel)
Select Case nResultado
Case vbYes
MsgBox "Sim"
Case vbNo
MsgBox "Não"
Case vbCancel
MsgBox "Cancelar"
End Select
End Sub
Abaixo, escrevemos o equivalente usando uma instrução If. Você perceberá que a instrução Case Select envolve um pouco menos de digitação – esse benefício é ampliado ao testar vários critérios.
Sub If_Sim_Nao_Cancelar()
Dim nResultado As VbMsgBoxResult
nResultado = MsgBox("...", vbYesNoCancel)
If nResultado = vbYes Then
MsgBox "Sim"
ElseIf nResultado = vbNo Then
MsgBox "Não"
ElseIf nResultado = vbCancel Then
MsgBox "Cancelar"
End If
End Sub
Sintaxe da Instrução Case
A sintaxe da instrução Select Case é a seguinte:
Select Case [Expressão de Teste]
Case [Condição 1]
[Ação se a condição 1 for verdadeira]
Case [Condição 2]
[Ação se a condição 2 for verdadeira]
Case [Condição n]
[Ação se a condição n for verdadeira]
Case Else
[Ação se nenhuma for verdadeira]
End Select
Where:
[Expressão de teste] – É o valor a ser avaliado. Normalmente, é uma variável.
[Ação se a condição n for verdadeira] – É apenas o código a ser executado se a condição for atendida (como em uma declaração If)
[Condição n] – É a condição a ser testada. Há muitas maneiras diferentes de testar condições. Vamos discuti-las a seguir.
A instrução Case executará o código para a PRIMEIRA condição que for considerada VERDADEIRA. Se nenhuma condição for atendida, nenhum código será executado, a menos que a cláusula Else seja adicionada.
Critérios do Select Case
Os Select Cases podem ser usados para avaliar valores numéricos e texto. Primeiro, discutiremos como usar Select Cases para avaliar expressões numéricas.
Correspondência Exata – Números
Você pode testar facilmente uma correspondência exata com uma instrução Case:
Case 10
ou adicionar vírgulas para testar correspondências exatas com vários números:
Case 20, 30, 40
Sub CorrespondenciaExata_Numeros()
Dim n As Integer
n = CInt(InputBox("..."))
Select Case n
Case 10
' Se n for 10 então
Case 20, 30, 40
' Se n for 20/30/40 então
Case Else
' Se n não for 10/20/30/40 então
End Select
End Sub
Intervalos
Você pode testar se um número está dentro de um intervalo da seguinte forma:
Case 55 To 74
Esse procedimento gerará uma pontuação por letra para um aluno com base em sua pontuação numérica:
Sub Calc_Nota()
Dim Pontos As Integer
Dim LetraNota As String
Pontos = InputBox("Digite a pontuação do aluno")
Select Case Pontos
Case 90 To 100
LetraNota = "A"
Case 80 To 90
LetraNota = "B"
Case 70 To 80
LetraNota = "C"
Case 60 To 70
LetraNota = "D"
Case Else
LetraNota = "E"
End Select
MsgBox "A nota do aluno é: " & LetraNota
End Sub
Você também pode testar os intervalos com a opção Case Is
Select Case Is
Case is < 55
'Não faça nada
Case <= 74
MsgBox "Dentro do intervalo"
Lembre-se de que a instrução Case só executará o código para APENAS a primeira correspondência.
Esse procedimento calculará a nota de um aluno usando o Case Is em vez do Case To.
Sub Select_Case_Is_Nota()
Dim Pontos As Integer
Dim LetraNota As String
Pontos = InputBox("Digite a pontuação do aluno")
Select Case Pontos
Case Is >= 90
LetraNota = "A"
Case Is >= 80
LetraNota = "B"
Case Is >= 70
LetraNota = "C"
Case Is >= 60
LetraNota = "D"
Case Else
LetraNota = "E"
End Select
MsgBox "A nota do aluno é: " & LetraNota
End Sub
Case Else
Você pode adicionar “Case Else” ao final de sua declaração Case para fazer algo se nenhuma condição for atendida:
Case Else
Consulte o final do exemplo de código anterior para ver como o Case Else pode ser usado.
Select Case – Texto e o Operador Like
Até agora, nossos exemplos de Select Case funcionaram apenas com números. Você também pode usar as instruções Select Case com texto.
Correspondência Exata – Texto
Você pode testar se a expressão corresponde a uma frase exata como esta:
Case "Beterraba"
Ou usar vírgulas para testar se a expressão corresponde exatamente a mais de uma frase:
Case "Maçã "Banana", "Laranja"
A junção das duas expressões fica assim:
Sub CorrespondenciaExata_Comida()
Select Case Range("a1").Value
Case "Beterraba"
MsgBox "Legumes"
Case "Maçã", "Banana", "Laranja"
MsgBox "Frutas"
End Select
End Sub
Maiúsculas e Minúsculas
Por padrão, o VBA é sensível a maiúsculas e minúsculas. Isso significa que o VBA considera “Texto” diferente de “texto”. Para desativar a sensibilidade a maiúsculas e minúsculas, adicione Option Compare Text à parte superior do módulo:
Option Compare Text
Esse exemplo tornará o Case Select insensível a maiúsculas e minúsculas ao trabalhar com texto:
Option Compare Text
Sub CorrespondenciaExata_Comida()
Select Case Range("a1").Value
Case "Beterraba"
MsgBox "Legumes"
Case "Maçã", "Banana", "Laranja"
MsgBox "Frutas"
End Select
End Sub
Case Like
O operador Like permite que você faça comparações inexatas. Se o texto corresponder, Like retornará TRUE; se não corresponder, retornará FALSE. Isso torna o operador Like fácil de usar com instruções If, mas não funcionará tão facilmente com instruções Case.
Case Like – Um Teste com Falha
O código a seguir demonstra que o operador Like não funciona com Select Case:
Sub Select_Case_Like_NaoFunciona()
Dim palavra As String
palavra = "CACAU"
Select Case palavra
Case palavra Like "*C*C*"
MsgBox "Certo"
Case Else
MsgBox "Errado"
End Select
End Sub
Case Like – A maneira correta
No entanto, podemos adicionar a expressão TRUE para fazer com que a instrução Select funcione com o operador Like:
Sub Select_Case_Like_FormaCorreta()
Dim palavra As String
palavra = "CACAU"
Select Case True
Case palavra Like "*C*C*"
MsgBox "Certo"
Case Else
MsgBox "Errado"
End Select
End Sub
Case – Dois Pontos
Ao usar uma instrução Case, você pode adicionar quantas linhas de código desejar para executar com cada condição. No entanto, se precisar executar apenas uma linha de código. Você pode usar dois pontos ( : ) para escrever tudo na mesma linha.
Aqui está o mesmo exemplo de nota de aluno de antes, exceto pelo uso de dois pontos para encurtar o código:
Sub Calc_Nota_DoisPontos()
Dim Pontos As Integer
Dim LetraNota As String
Pontos= InputBox("Digite a pontuação do aluno")
Select Case Pontos
Case 90 To 100: LetraNota = "A"
Case 80 To 90: LetraNota = "B"
Case 70 To 80: LetraNota = "C"
Case 60 To 70: LetraNota = "D"
Case Else: LetraNota = "E"
End Select
MsgBox "A nota do aluno é: " & LetraNota
End Sub
Case Select – And / Or – Múltiplas condições
Você pode usar os operadores And / Or para testar critérios adicionais junto com o Select Case.
Neste exemplo, estamos usando um Select Case na variável “idade”, mas também queremos testar o sexo. Portanto, usamos o operador And para realizar o teste mais complexo:
Sub SelectCaseAninhado()
Dim sexo As String
Dim idade As Integer
sexo = "masculino" ' ou feminino
idade = 15
Select Case idade
Case Is < 20 And sexo = "masculino"
Msgbox "Homem com menos de 20 anos"
Case Is < 20 And sexo = "feminino"
Msgbox "Mulher com menos de 20 anos"
Case Is >= 20 And sexo = "masculino"
Msgbox "Homem com mais de 20 anos"
Case Is >= 20 And sexo = "feminino"
Msgbox "Mulher com mais de 20 anos"
End Select
End Sub
Declarações Case Aninhadas
Assim como as instruções If, você pode aninhar instruções Case umas dentro das outras:
Sub NestedSelectCase()
Dim sexo As String
Dim idade As Integer
sexo = "masculino" ' ou feminino
idade = 15
Select Case idade
Case Is < 20
Select Case sexo
Case "masculino"
MsgBox "Homem com menos de 20 anos"
Case "feminino"
MsgBox "Mulher com menos de 20 anos"
End Select
Case Is >= 20 And sexo = "feminino"
Select Case sexo
Case "masculino"
MsgBox "Homem com mais de 20 anos"
Case "feminino"
MsgBox "Mulher com mais de 20 anos"
End Select
End Select
End Sub
Declaração Case vs. Declaração If
Quanto mais condições forem testadas, mais útil será a instrução Case em comparação com uma instrução If. Vamos dar uma olhada em um exemplo.
Aqui está o código necessário para testar se um nome de planilha é igual a um conjunto de valores usando uma instrução If:
If Nome = "Orçamento" Or Nome = "Previsão" Or Nome = "Retrospetiva 12" Or _
Nome = "Flex" Or Nome = "Outros índices" Or Nome = "Comparação" Or _
Nome = "Revisão do orçamento" Or Nome = "Revisão P&L" Or Nome = "Outros" Then
'Faça algo
End If
Aqui está o mesmo código usando uma instrução Select em vez disso:
Select Case Nome
Case "Orçamento", "Previsão", "Retrospetiva 12", "Flex", "Outros índices", _
"Comparação", "Revisão do orçamento", "Revisão P&L", "Outros"
'Faça algo
End Select
Você pode ver que é muito mais fácil usar uma Declação Select nesse cenário. A digitação é significativamente menor e a leitura é muito mais fácil.
Exemplos de VBA Select Case
Ex. 1. Função Definida pelo Usuário (UDF) Declaração Case
Vamos replicar nosso exemplo de cálculo de nota acima e criar uma UDF para calcular a pontuação de um aluno:
Function ObterNota(Pontos As Integer) As String
Select Case Pontos
Case 90 To 100
ObterNota = "A"
Case 80 To 90
ObterNota = "B"
Case 70 To 80
ObterNota = "C"
Case 60 To 70
ObterNota = "D"
Case Else
ObterNota = "E"
End Select
End Function
Agora podemos usar a função GetGrade em nossa planilha do Excel para calcular rapidamente as notas dos alunos:
Ex. 2. Nome da Planilha de Teste / Declaração Case com Loop
Esse código percorrerá todas as planilhas em uma pasta de trabalho, desprotegendo as planilhas que atendem a determinados critérios:
Sub Case_DesprotegerPlanilha()
Dim ws As Worksheet
For Each ws In Worksheets
Select Case ws.Name 'Lista de todas as planilhas com Índices
Case "Orçamento", "Previsão", "Retrospetiva 12", "Flex", "Outros índices", _
"Comparação", "Revisão do orçamento", "Revisão P&L", "Outros"
ws.Unprotect
End Select
Next ws
End Sub
Ex. 3: Select Case – Valor da Célula
Este exemplo testará a pontuação de um aluno em uma célula, gerando a letra da nota diretamente na célula à direita.
Sub TestarValorCelula()
Dim celula As Range
Set celula = Range("C1")
Select Case celula.Value
Case 90 To 100
celula.Offset(0, 1) = "A"
Case 80 To 90
celula.Offset(0, 1) = "B"
Case 70 To 80
celula.Offset(0, 1) = "C"
Case 60 To 80
celula.Offset(0, 1) = "D"
End Select
End Sub
Ex. 4. Select Case – datas
Esse exemplo de Select Case é uma função que testa em qual trimestre uma data se enquadra.
Sub TestarData ()
MsgBox ObterTrimestre(CDate("7/20/2019"))
End Sub
Function ObterTrimestre(dt As Date) As Integer
Dim sht As Worksheet
Select Case dt
Case CDate("01/01/2019") To CDate("03/31/2019")
ObterTrimestre = 1
Case CDate("04/01/2019") To CDate("06/30/2019")
ObterTrimestre = 2
Case CDate("07/01/2019") To CDate("09/30/2019")
ObterTrimestre = 3
Case CDate("10/01/2019") To CDate("12/31/2019")
ObterTrimestre = 4
End Select
End Function
Como se trata de uma função, você pode usá-la como uma função dentro do Excel:
Ex. 5 Verificar se o Número é Par ou Ímpar
Este exemplo testa se um número é par ou ímpar.
Sub VerificaParImpar()
Dim n As Integer
n = InputBox("Digite um número")
Select Case n Mod 2
Case 0
MsgBox "O número é par."
Case 1
MsgBox "O número é ímpar."
End Select
End Sub
Ex. 6 Testar se a Data Cai em um Dia de Semana ou em um Fim de Semana
Esses exemplos testarão se uma data cai em um dia de semana ou em um fim de semana.
Sub VerificarDiaSemana()
Dim dt As Date
dt = CDate("1/1/2020")
Select Case Weekday(dt)
Case vbMonday
MsgBox "É segunda-feira"
Case vbTuesday
MsgBox "É terça-feira"
Case vbWednesday
MsgBox "É quarta-feira"
Case vbThursday
MsgBox "É quinta-feira"
Case vbFriday
MsgBox "É sexta-feira"
Case vbSaturday
MsgBox "É sábado"
Case vbSunday
MsgBox "É domingo"
End Select
End Sub
Sub VerificarFimDeSemana()
Dim dt As Date
dt = CDate("1/1/2020")
Select Case Weekday(dt)
Case vbSaturday, vbSunday
MsgBox "É fim de semana"
Case Else
MsgBox "Não é fim de semana"
End Select
End Sub
VBA Select Case no Access
Todos os exemplos acima funcionam exatamente da mesma forma no Access VBA e no Excel VBA.
Sub TestarValorCelula()
Dim dbs as Database
Dim rst as RecordSet
Set dbs = CurrentDB
Set rst = dbs.OpenRecordset("tblClientes", dbOpenDynaset)
With rst
.MoveFirst
.Edit
Select Case rst.Fields("Cidade")
Case "Austin"
.rst.Fields("CodigoDDD") = "512"
Case "Chicago"
.rst.Fields("CodigoDDD") = "312"
Case "New YorK"
.rst.Fields("CodigoDDD") = "1212"
Case "San Fransisco"
.rst.Fields("CodigoDDD") = "415"
End Select
.Update
End With
End Sus