VBA – Instruction Select Case
In this Article
- Exemple d’utilisation de Select Case
- Syntaxe de l’Instruction Case
- Critères de Sélection des cas
- Select Case – Texte et opérateur Like
- Case – Symbole « Deux Points »
- Select Case – Et / Ou – Conditions multiples
- Instructions Select Case Imbriquées
- Déclaration de cas ou déclaration If
- Exemples Pratiques de Select Case en VBA
- VBA Select Case dans Access
En VBA, l’instruction Select Case est une alternative à l’instruction If-Then, elle vous permet de tester si certaines conditions sont remplies, en exécutant un code spécifique pour chaque condition. L’instruction Select est préférable à l’instruction If lorsqu’il y a plusieurs conditions à traiter.
Exemple d’utilisation de Select Case
Cet exemple invite l’utilisateur à utiliser une boîte de message YesNoCancel et teste l’option sélectionnée par l’utilisateur :
Sub Select_Case_Oui_Non_Annuler()
Dim nRéponse As VbMsgBoxResult
nRéponse = MsgBox("...", vbYesNoCancel)
Select Case nRéponse
Case vbYes
MsgBox "Oui"
Case vbNo
MsgBox "Non"
Case vbCancel
MsgBox "Annuler"
End Select
End Sub
Ci-dessous, nous avons rédigé l’équivalent de l’exemple précédent en utilisant plutôt une déclaration If. Vous remarquerez que l’instruction Case Select implique un peu moins de code et est plus facile à lire – cet avantage est amplifié lorsque vous testez plusieurs critères.
Sub If_Oui_Non_Annuler()
Dim nRéponse As VbMsgBoxResult
nRéponse = MsgBox("...", vbYesNoCancel)
If nRéponse = vbYes Then
MsgBox "Oui"
ElseIf nRéponse = vbNo Then
MsgBox "Non"
ElseIf nRéponse = vbCancel Then
MsgBox "Annuler"
End If
End Sub
Syntaxe de l’Instruction Case
La syntaxe de l’instruction Select Case est la suivante :
Select Case [Expression de test]
Case [Condition 1]
[Action si la condition 1 est vraie]
Case [Condition 2]
[Action si la condition 2 est vraie]
Case [Condition n]
[Action si la condition n est vraie]
Case Else
[Action si aucune n'est vraie]
End Select
Où :
[Expression de test] – Valeur à évaluer. Il s’agit généralement d’une variable.
[Action si la condition n est vraie] – Il s’agit simplement du code à exécuter si la condition est remplie (comme avec une instruction If)
[Condition n] – C’est la condition à tester. Il existe de nombreuses manières différentes de tester les conditions. Nous allons les aborder ci-dessous.
La déclaration select case exécutera le code pour la PREMIÈRE condition qui s’avère être VRAIE. Si aucune condition n’est remplie, aucun code ne sera exécuté, sauf si la clause Else est ajoutée.
Critères de Sélection des cas
Les conditions Select Case peuvent être utilisés pour évaluer à la fois des valeurs numériques et du texte. Nous allons d’abord voir comment utiliser les cas de sélection pour évaluer des expressions numériques.
Correspondance Exacte – Nombres
Vous pouvez facilement tester une correspondance exacte à l’aide d’une instruction Case :
Case 10
ou ajouter des virgules pour tester les correspondances exactes avec plusieurs nombres :
Case 20, 30, 40
Sub CorrespondanceExacte_Nombres()
Dim n As Integer
n = CInt(InputBox("..."))
Select Case n
Case 10
' Si "n" est égal à 10, alors...
Case 20, 30, 40
' Si "n" est égal à 20/30/40, alors...
Case Else
' Si "n" n'est pas égal à 10/20/30/40, alors...
End Select
End Sub
Plages
Vous pouvez tester si un nombre est compris dans une plage comme suit :
Case 55 To 74
Cette procédure génère une note sous forme de lettre pour un étudiant en fonction de sa note numérique :
Sub Calc_Note()
Dim NoteNum As Integer
Dim NoteLettre As String
NoteNum = InputBox("Entrer la note numérique de l'étudiant")
Select Case NoteNum
Case 90 To 100
NoteLettre = "A"
Case 80 To 90
NoteLettre = "B"
Case 70 To 80
NoteLettre = "C "
Case 60 To 70
NoteLettre = "D"
Case Else
NoteLettre = "F"
End Select
MsgBox "La note de l'étudiant est : " & NoteLettre
End Sub
Vous pouvez également tester des plages avec la fonction Case Is
Instruction Select Case Is
Case Is < 55
'Ne rien faire
Case <= 74
MsgBox "Dans l'intervalle"
N’oubliez pas que l’instruction Case n’exécutera du code QUE pour la première correspondance. Cette procédure calculera la note d’un étudiant en utilisant le Case Is au lieu du Case To.
Sub Select_Case_Is_Note()
Dim NoteNum As Integer
Dim NoteLettre As String
NoteNum = InputBox("Entrer la note nuérique de l'étudiant")
Select Case NoteNum
Case Is >= 90
NoteLettre = "A"
Case Is >= 80
NoteLettre = "B"
Case Is >= 70
NoteLettre = "C"
Case Is >= 60
NoteLettre = "D"
Case Else
NoteLettre = "F"
End Select
MsgBox "La note de l'étudiant est : " & NoteLettre
End Sub
Case Else
Vous pouvez ajouter « Case Else » à la fin de votre déclaration de cas pour faire quelque chose si aucune condition n’est remplie :
Case Else
Consultez la fin de l’exemple de code précédent pour voir comment Case Else peut être utilisé.
Select Case – Texte et opérateur Like
Jusqu’à présent, nos exemples de Select Case n’ont fonctionné qu’avec des nombres. Vous pouvez également utiliser les instructions Select Case avec du texte.
Correspondance Exacte – Texte
Vous pouvez tester si l’expression correspond à une phrase exacte comme ceci :
Case "Betteraves"
Vous pouvez également utiliser des virgules pour tester si l’expression correspond exactement à plus d’une phrase :
Case "Pomme", "Banane", "Orange"
L’ensemble ressemble à ceci :
Sub CorrespondanceExacte_Aliments()
Select Case Range("a1").Value
Case "Betterave"
MsgBox "Légume"
Case "Pommes", "Bananes", "Oranges"
MsgBox "Fruit"
End Select
End Sub
Majuscules et Minuscules
Par défaut, VBA est sensible à la casse. Cela signifie que VBA considère que « Texte » est différent de « texte ». Pour désactiver la sensibilité à la casse, ajoutez l’option « Compare Text » en haut de votre module :
Option Compare Text
Cet exemple rendra la comparaison des conditions insensible à la casse lorsque vous travaillez avec du texte :
Option Compare Text
Sub CorrespondanceExacte_Aliments()
Select Case Range("a1").Value
Case "Betterave"
MsgBox "Légume"
Case "Pommes", "Bananes", "Oranges"
MsgBox "Fruit"
End Select
End Sub
Select Case – Opérateur Like
L’opérateur Like vous permet d’effectuer des comparaisons inexactes. Si le texte correspond, Like renvoie VRAI, s’il ne correspond pas, il renvoie FAUX. Cela rend l’opérateur Like facile à utiliser avec les instructions If, mais il ne fonctionnera pas aussi facilement avec les instructions Select Case.
Case Like – Un Test Raté
Le code suivant démontre que l’opérateur Like ne fonctionne pas toujours avec l’instruction Select Case :
Sub Select_Case_Like_NonFonctionnel()
Dim mot As String
mot = "COCOA"
Select Case mot
Case mot Like "*C*C*"
MsgBox "Correspondance Trouvée!"
Case Else
MsgBox "Pas de Correspondance"
End Select
End Sub
Case Like – La Bonne Méthode
Cependant, nous pouvons ajouter l’expression TRUE pour que l’instruction Select fonctionne avec l’opérateur Like :
Sub Select_Case_Like_Fonctionnel()
Dim mot As String
mot = "COCOA"
Select Case True
Case mot Like "*C*C*"
MsgBox "Correspondance Trouvée!"
Case Else
MsgBox "Pas de Correspondance"
End Select
End Sub
Case – Symbole « Deux Points »
Lorsque vous utilisez une instruction Case, vous pouvez ajouter autant de lignes de code que vous le souhaitez pour chaque condition. Cependant, si vous n’avez besoin d’exécuter qu’une seule ligne de code. Vous pouvez utiliser un deux-points ( : ) pour tout écrire sur la même ligne.
Voici le même exemple de note d’étudiant que précédemment présenté, sauf qu’un deux-points est utilisé pour raccourcir le code :
Sub Calc_Note_Deux_Points()
Dim NoteNum As Integer
Dim NoteLettre As String
NoteNum = InputBox("Entrer le note numérique de l'étudiant")
Select Case NoteNum
Case 90 To 100: NoteLettre = "A"
Case 80 To 90: NoteLettre = "B"
Case 70 To 80: NoteLettre = "C"
Case 60 To 70: NoteLettre = "D"
Case Else: NoteLettre = "F"
End Select
MsgBox "La note de l'étudiant est : " & NoteLettre
End Sub
Select Case – Et / Ou – Conditions multiples
Vous pouvez utiliser les opérateurs And / Or pour tester des critères supplémentaires en même temps. Dans cet exemple, nous utilisons un Select-Case sur la variable « âge », mais nous voulons également tester le sexe. Nous utilisons donc l’opérateur And pour effectuer la comparaison le plus complexe :
Sub SelectCase_ConditionsMultiples()
Dim sexe As String
Dim age As Integer
sexe = "masculin" ' ou féminin
age = 15
Select Case age
Case Is < 20 And sexe = "masculin"
MsgBox "Homme de moins de 20"
Case Is < 20 And sexe = "féminin"
MsgBox "Femme de moins de 20 ans"
Case Is >= 20 And sexe = "masculin"
MsgBox "Homme de plus de 20 ans"
Case Is >= 20 And sexe = "féminin"
MsgBox "Femme de plus de 20 ans"
End Select
End Sub
Instructions Select Case Imbriquées
Tout comme les instructions If, vous pouvez imbriquer les instructions Select Case les unes dans les autres :
Sub SelectCase_Imbriqué()
Dim sexe As String
Dim age As Integer
sexe = "masculin" ' ou féminin
age = 15
Select Case age
Case Is < 20
Select Case sexe
Case "masculin"
MsgBox "Homme de moins de 20"
Case "féminin"
MsgBox "Femme de moins de 20 ans"
End Select
Case Is >= 20
Select Case sexe
Case "masculin"
MsgBox "Homme de plus de 20 ans"
Case "féminin"
MsgBox "Femme de plus de 20 ans"
End Select
End Select
End Sub
Déclaration de cas ou déclaration If
Plus il y a de conditions à tester, plus l’instruction Select Case est utile par rapport à l’instruction If. Prenons un exemple. Voici le code nécessaire pour tester si le nom d’une feuille de calcul est égal à un ensemble de valeurs à l’aide d’une instruction If :
If Nom = "Budget" Or Nom = "Prévisions" Or Nom = "Trailing12" Or _
Nom = "Flex" Or Nom = "AutresRatios" Or Nom = "Comparaison" Or _
Nom = "Révision" Or Nom = "P&L_Révision" Or Nom = "Autres" Then
'Faire quelque chose
End If
Voici le même code en utilisant plutôt une instruction Select Case :
Select Case Nom
Case "Budget", "Prévisions", "Trailing12", "Flex", "AutresRatios", _
"Comparaison", "Révision", "P&L_Révision", "Autres"
'Faire quelque chose
End Select
Vous pouvez constater qu’il est beaucoup plus facile d’utiliser une instruction Select dans ce scénario. Il y a beaucoup moins de frappe et c’est beaucoup plus facile à lire.
Exemples Pratiques de Select Case en VBA
Ex 1. Déclaration de cas Fonction définie par l’utilisateur (UDF)
Reprenons notre exemple de calcul de note ci-dessus et créons une fonction définie par l’utilisateur (UDF) pour calculer et retourner la note d’un élève :
Function ObtenirNote(Pourcentage As Integer) As String
Select Case Pourcentage
Case 90 To 100
ObtenirNote = "A"
Case 80 To 90
ObtenirNote = "B"
Case 70 To 80
ObtenirNote = "C"
Case 60 To 70
ObtenirNote = "D"
Case Else
ObtenirNote = "F"
End Select
End Function
Nous pouvons maintenant utiliser la fonction ObtenirNote dans notre feuille de calcul Excel pour calculer rapidement les notes des élèves :
Ex 2. Vérification des Noms de Feuilles / Boucle Select Case
Ce code va parcourir en boucle toutes les feuilles de calcul d’un classeur, en déprotégeant les feuilles qui répondent à certains critères :
Sub EnleverProtectionFeuilles()
Dim fc As Worksheet
For Each fc In Worksheets
Select Case fc.Name 'Liste de toutes les feuilles avec les ratios
Case "Budget", "Prévisions", "Trailing12", "Flex", "AutresRatios", _
"Comparaison", "Révision", "P&L_Révision", "Autres"
fc.Unprotect
End Select
Next fc
End Sub
Ex 3 : Select Case – Valeur de Cellule
Cet exemple teste la note d’un étudiant dans une cellule, en affichant la note en lettres directement dans la cellule de droite.
Sub VérificationValeurCellule()
Dim cell As Range
Set cell = Range("C1")
Select Case cell.Value
Case 90 To 100
cell.Offset(0, 1) = "A"
Case 80 To 90
cellule.Offset(0, 1) = "B"
Case 70 To 80
cellule.Offset(0, 1) = "C"
Case 60 To 80
cellule.Offset(0, 1) = "D"
End Select
End Sub
Ex 4. Select Case – Dates
Cet exemple est une fonction qui teste dans quel trimestre se trouve une date.
Sub TestDate()
MsgBox ObtenirTrimestre(CDate("7/20/2019"))
End Sub
Function ObtenirTrimestre(dt As Date) As Integer
Dim fc As Worksheet
Dim Année As Integer
Année = Year(dt)
Select Case dt
Case CDate("01/01/" & Année) To CDate("03/31/" & Année)
ObtenirTrimestre = 1
Case CDate("04/01/" & Année) To CDate("06/30/" & Année)
ObtenirTrimestre = 2
Case CDate("07/01/" & Année) To CDate("09/30/" & Année)
ObtenirTrimestre = 3
Case CDate("10/01/" & Année) To CDate("12/31/" & Année)
ObtenirTrimestre = 4
End Select
End Function
Comme il s’agit d’une fonction, vous pouvez l’utiliser comme une fonction dans Excel :
Ex. 5 Vérifier si un Nombre est Pair ou Impair
Cet exemple teste si un nombre est pair ou impair.
Sub VérifierPairImpair()
Dim n As Integer
n = InputBox("Entrez un nombre")
Select Case n Mod 2
Case 0
MsgBox "Le nombre est pair"
Case 1
MsgBox "Le nombre est impair"
End Select
End Sub
Ex. 6 Tester si une Date est un Jour de Semaine ou un Week-End
Ces exemples testent si une date tombe un jour de semaine ou un week-end.
Sub EstJourDeSemaine()
Dim dt As Date
dt = CDate("1/1/2020")
Select Case Weekday(dt)
Case vbMonday
MsgBox "C'est lundi"
Case vbTuesday
MsgBox "C'est mardi"
Case vbWednesday
MsgBox "C'est mercredi"
Case vbThursday
MsgBox "C'est jeudi"
Case vbFriday
MsgBox "C'est vendredi"
Case vbSaturday
MsgBox "C'est samedi"
Case vbSunday
MsgBox "C'est dimanche"
End Select
End Sub
Sub EstJourDeWeekEnd()
Dim dt As Date
dt = CDate("1/1/2020")
Select Case Weekday(dt)
Case vbSaturday, vbSunday
MsgBox "C'est un week-end"
Case Else
MsgBox "Il ne s'agit pas d'un week-end"
End Select
End Sub
VBA Select Case dans Access
Tous les exemples ci-dessus fonctionnent exactement de la même manière en Access VBA qu’en Excel VBA.
Sub VérificationValeurChamps()
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("Ville")
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