VBA – Instrução Select Case

Written by

Mel Jenkins

Reviewed by

Steve Rynearson

Translated by

Daniel Caramello

Last updated on July 27, 2023

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

 

video botao select case

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:

funcao do usuario

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:

obter trimestre

 

 

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
vba-free-addin

Exemplos de Add-ins de Códigos VBA

Acesse facilmente todos os exemplos de código que se encontram em nosso site.

Simply navigate to the menu, click, and the code will be inserted directly into your module. .xlam add-in.

(Nenhuma instalação necessária!)

Baixe de Graça

Retornar aos Exemplos de Códigos VBA