La logique conditionnelle (par exemple, si X, alors Y, sinon Z…) est une fonctionnalité essentielle dans tout processus de programmation ou d'automatisation. En VBA, la structure Select Case est l'un des outils disponibles pour gérer les conditions. Bien qu'elle soit moins connue que la traditionnelle instruction If...Then...Else
, Select Case offre des avantages significatifs en termes d'efficacité et de lisibilité du code.
Ce tutoriel vous expliquera pourquoi, quand et comment utiliser la structure Select Case en VBA, notamment dans les situations où elle peut grandement simplifier une logique de prise de décision complexe. Que vous gériez un grand nombre de conditions, que vous deviez traiter plusieurs résultats possibles, ou que vous souhaitiez améliorer la maintenabilité de votre code VBA, Select Case pourrait être la solution idéale.
Sommaire
- La structure Select Case en VBA – c'est quoi?
- Quand utiliser Select Case dans le code VBA?
- Select Case en pratique: utilisation avec des conditions numériques
- Select Case en pratique: utilisation avec des conditions textuelles
- Astuces pratiques pour l'utilisation optimale de Select Case
- Les erreurs courantes à éviter avec Select Case
- Conclusion de ce tutoriel
- Pour aller plus loin en VBA
La structure Select Case en VBA – c'est quoi?
Il s'agit d'une structure de code VAB qui vous permet d'effectuer une action (calcul, formatage, lancement d'une macro etc.) selon si une condition est remplie ou pas. La syntaxe de base est la suivante:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Select Case ValeurAVerifier Case "condition 1" 'Code si la "condition 1" est remplie Case "condition 2" 'Code si la "condition 2" est remplie Case "condition 3", "condition 4" 'Code si la "condition 3" ou la "condition 4" est remplie '... Case Else 'code si aucune des conditions précédentes n'est remplie End Select |
Si la structure vous semble un peu abstraite, les exemples d'utilisation qui suivront rendront la chose plus claire.
Quand utiliser Select Case dans le code VBA?
Même si la structure If... Then... Else...
est plus connue et (probablement) plus simple à comprendre, il peut devenir difficile à gérer lorsque le nombre de conditions est plus important, lorsque vous voulez utiliser des "paliers" pour des conditions numériques (par ex. "si valeur se trouve entre 10 et 20") ou lorsque plusieurs conditions textuelles mènent au même résultat (par ex. "si la valeur est 'a' ou 'b' ou 'd' ou 'w', alors le résultat est 10").
Dans ces cas-là, l'utilisation de Select Case rendra votre code VBA beaucoup plus lisible et beaucoup plus court que si l'on utilise If... Else
avec de nombreux ElseIf
.
Select Case en pratique: utilisation avec des conditions numériques
La condition peut être exprimée par une expression numérique (ex. Si x > 60, alors y = "excellent"). Dans ce cas, il est possible d'utilise comme condition une valeur spécifique (si x = 1), plusieurs valeurs spécifiques (si x = 1 ou 6), une plage de numéros (si x est entre 10 et 25) ou par un opérateur de comparaison (si x > 50)
La syntaxe aura alors les formes suivantes:
- si x = 1 >>
Case 1
- si x = 1 ou 6 >>
Case 1, 6
- si x = est entre 10 et 25 >>
Case 10 To 25
- si x > 50 >>
Case Is > 50
(attention, avec les opérateurs numériques tes que <, > ou <> il faut utiliser l'expressionCase Is
et non seulementCase
!)
Select Case: Exemple d'utilisation avec des conditions numériques
Voici un exemple d'utilisation pratique. Imaginons que la cellule "A1" contient le résultat d'un test. On veut afficher un message qui évalue le score du test. Les conditions sont "numériques" (comme le résultat du test est un chiffre) ce qui implique qu'il est possible d'utiliser les opérateurs comme cela vient d'être expliqué plus haut…
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
Sub Exemple_Select_Case_conditions_numeriques() ' par Excel-Malin.com (https://excel-malin.com) 'Structure Select Case: valeurs numériques (paliers) x = Range(A1).Value ' = score du test 'évaluation du score Select Case x Case Is < 0 MsgBox "Votre score est insuffisant!" Case 0 To 30 MsgBox "Votre score est faible." Case 31 To 70 MsgBox "Votre score est dans la moyenne." Case 71 To 100 MsgBox "Votre score est au-dessus de la moyenne." Case Is > 100 MsgBox "Votre score est exceptionnel!" Case Else MsgBox "Il y a un problème avec votre score..." End Select End Sub |
Remarque: attention au choix des extrémités des paliers que vous utilisez. L'exemple précédent fonctionnera pour les numéros entiers mais si vous l'essayez avec "30,5", le résultat sera "Il y a un problème avec votre score…" car le chiffre 30,5 ne remplit ni la condition "0 To 30", ni "31 To 70"!
Il faut veiller à ce qu'il n'y ait pas des "trous" entre vos paliers. Sinon, vous risquez d'obtenir des résultats erronés. Il est donc important de couvrir les valeurs qui se situent à l'extrémité de chaque palier avec les opérateurs >=
ou <=
plutôt qu'uniquement >
et <
.
Select Case en pratique: utilisation avec des conditions textuelles
Voici maintenant des explications concernant les conditions "textuelles". Tout comme l'habituel If x = "test" Then ...
, avec Select Case
, on peut également utiliser le texte comme condition. L'avantage par rapport à If... Then... Else...
si situe dans le fait que l'on peut utiliser plusieurs expressions textuelles dans une seule condition sans que le code devient difficile à lire.
Select Case: Exemple avec conditions textuelles
Et encore une fois, un exemple concret pour illustrer ce à quoi ressemble le code VBA:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
Sub Exemple_Select_Case_conditions_textuelles() ' par Excel-Malin.com (https://excel-malin.com) 'imaginons une question d'un quiz avec les réponses possibles "a", "b", "c", "d" et "je ne sais pas" 'd'après la réponse, on veut attribuer des points ainsi ' a = 3 points, b = 2 points, c = -5 points, d = -1 point, "je ne sais pas" = 0 points 'si la réponse se trouve dans la cellule A1, le code VBA utilisant la structure "Select Case" peut se présenter comme suit: Reponse = Range("A1").Value Select Case Reponse Case "a" Resultat = 3 Case "b" Resultat = 2 Case "c" Resultat = -5 Case "d" Resultat = -1 Case "je ne sais pas" Resultat = 0 Case Else Resultat = "" End Select End Sub |
Le code VBA suivant montre l'utilisation de plusieurs expressions textuelles dans une condition:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
Sub StructureSelectCase3() ' par Excel-Malin.com (https://excel-malin.com) 'Structure Select Case: plusieurs valeurs dans la même condition MonAnimal = Range("A1").Value 'détermine la couleur de l'animal Select Case MonAnimal Case "chat", "corbeau" Couleur = "noir" Case "dauphin", "éléphant", "taupe", "loup" Couleur = "gris" Case "renard" Couleur = "orange" Case "chien", "kangourou", "hérisson" Couleur = "brun" Case Else Couleur = "inconnue" End Select End Sub |
Remarque:
- il est également possible d'utiliser une "plage de chaînes de caractères" comme condition. Dans ce cas-là, le syntaxe à utiliser sera:
Case "anaconda" To "buffle"
. Cette condition seraVRAI
pour toute expression qui se situe, dans l'ordre alphabétique, entre le mot "anaconda" et le mot "buffle". Par exemple "baleine" tombera donc dans cette catégorie. - Et pour pousser les possibilités encore plus loin, les opérateurs de comparaisons sont disponibles également pour le texte! Ainsi
Case Is < "c"
seraVRAI
pour tout expression qui se situe avant la lettre "c" dans l'alphabet…
Astuces pratiques pour l'utilisation optimale de Select Case
Maintenant que l'on voit l'utilité de Select Case, voici encore quelques conseils pour son utilisation optimale.
Ordre des conditions
De manière générale, l'ordre de conditions n'a pas d'importance – votre code VBA fonctionnera. Si vous n'avez pas besoin de traiter des volumes importants de données et si vous ne tenez pas à une efficacité maximale de votre code VBA, je vous conseillerais de privilégier la lisibilité de votre code. Écrivez-le comme c'est le plus confortable pour vous. Le VBA est assez flexible pour cela.
De l'autre côté, si vous voulez obtenir "la vitesse maximale" de vos macros, il y a une logique à respecter. Cette logique consiste à classer les conditions selon la probabilité de leurs réalisation. Si vous avez une variable MaCouleur qui peut être égale soit à "blanc" ( Case MaCouleur = "blanc"
) soit à "noir" ( Case MaCouleur = "noir"
) il est préférable de placer en premier celle qui a plus de chances d'être vrai. Ceci est valable, bien sûr, dans le cas où vous avez une idée de la répartition des résultats. Si vous pouvez distinguer des réponses probable des réponses exceptionnelles, c'est déjà bien – commencez alors par les probables et gardez les exceptionnelles pour la fin du Select Case
.
En structurant votre code ainsi, vous gagnerez en vitesse (une fois que le code trouve la condition qui est VRAI
, il exécute les instructions et ne se préoccupe pas des autres résultats possibles. Vu que la réponse VRAI
a déjà été trouvée, les autres ne peuvent qu'être FAUX
– alors le code ne les teste même pas).
Dans notre exemple, si on doit tester 100 valeurs ("blanc" ou "noir") et si le résultat "blanc" est probable à 70% alors:
- en plaçant
Case MaCouleur = "blanc"
en premier, le code VBA exécutera 130 vérifications - en plaçant
Case MaCouleur = "noir"
(qui est probable à 30%) en premier et seulement ensuite leCase MaCouleur = "blanc"
, le code VBA devra exécuter 170 vérifications
130 vérifications à la place de 170 pour obtenir le même résultat – et cela uniquement pour 100 valeurs et 2 réponses possibles. Imaginez la différence de temps d'exécution pour par ex. 150.000 valeurs avec 7 possibilités!
Donc, rien qu'en changeant l'ordre des conditions, on peut grandement influencer la vitesse du code.
Utilité de Case Else
On pourrait être tentés de "laisser tomber" la ligne Case Else
dans le code VBA en se disant qu'elle ne sert à rien. Grande erreur! Cette instruction permet de gérer les cas des valeurs que l'on aurait omis d'énumérer. Même si l'on a l'impression d'avoir couvert toutes les possibilités, il suffit que les données d'entrée soit mal encodées (ex. dans l'exemple avec les animaux plus haut, la valeur à tester serait "taup" à la place de "taupe" et vous avez un problème!).
Il est donc judicieux d'ajouter la ligne Case Else
de toute façon et d'y attribuer une valeur (par exemple "erreur" ou encore "NA") ou une autre instruction qui permet d'éviter des problèmes. Vous pouvez utiliser par exemple:
Case Else: Stop
– suspend l'exécution du code en cas de valeur inattendueCase Else: MsgBox "Attention - Valeur inattendue"
– ouvre une fenêtre avec un messageCase Else: LaReponse = "erreur"
– le résultat de la fonction sera la mot "erreur"
Les erreurs courantes à éviter avec Select Case
Même si Select Case est une structure puissante et souvent plus claire que If…Then…Else, il est important de connaître les erreurs les plus fréquentes afin de les éviter. Voici quelques-unes des erreurs les plus courantes rencontrées lors de l'utilisation de Select Case en VBA…
En évitant ces erreurs courantes, vous rendrez votre code VBA plus robuste, plus lisible, et moins sujet aux bugs.Ces erreurs sont fréquentes, même chez les programmeurs expérimentés, mais les éviter vous permettra de gagner en qualité et en efficacité. En tenant compte de ces pièges potentiels, vous pourrez utiliser Select Case de manière optimale, tout en minimisant les risques d'erreurs.
Conclusion de ce tutoriel
Vous voici donc familiarisés avec la structure Select Case. J'espère que ce tutoriel a pu vous aider à rendre votre travail plus efficace et votre code VBA plus lisible.
Suite de ce tutoriel >>> VBA: Select Case (utilisation avancée)
La suite de ce tutoriel aborde les sujets suivants:
Select Case
imbriqués- utilisation de l'opérateur
Like
- comparaison de vitesse avec
If... Then... Else
Select Case
en mode concis- …
Pour aller plus loin en VBA
Vous pouvez consulter la page Microsoft dédiée à "Select Case". Et voici d'autres articles de Excel-Malin.com qui pourraient également vous intéresser…
- La liste des opérateurs dans VBA
- Toutes les fonctions disponibles en VBA
- VBA: Comment protéger le code VBA par un mot de passe
- Gestion de fichiers en VBA
- Cours VBA en ligne: "VBA: Droit au but" – gratuit, pragmatique & efficace!
- Comment résoudre le problème avec les fichiers avec macros bloqués
4 commentaires sur “VBA: Select Case (mode d’emploi pratique)”
Bonjour,
Je souhaite coloriser des cellules en fonction de leur contenu, néanmoins en utilisant votre code ci-dessus , rien ne fonctionne.
J'ai tenté d'utiliser votre code sans le retoucher pour essayer de reproduire vos exemple mais rien se produit.
Vous êtes sûr de vos macros ? Il ne manque pas des bouts de code ?
Quand je met un nom d'animal en A1 (par exemple chat) et que je lance votre macro
"
MonAnimal = Range("A1").Value
'détermine la couleur de l'animal
Select Case MonAnimal
Case "chat", "corbeau"
Couleur = "noir"
….
"
Rien ne se passe
Bonjour,
oui, je suis sûr de mes macros…
Dans l'exemple que vous citez, le code ne colorie pas la cellule. Il attribue une valeur à la variable
Couleur
selon le contenu de la cellule.Si vous voulez colorier la cellule, vous avez 2 possibilités:
1) utiliser VBA, dans ce cas, il faut remplacer
Couleur = "noir"
par:Range("A1").Interior.Color = xlBlack
etc.2) Pour facilement colorier les cellules selon leur valeur, vous pouvez utiliser la fonction "mise en forme conditionnelle" d'Excel… Cela évite le recours au VBA. Vous trouverez comment le faire sur le site de Microsoft: https://support.office.com/fr-fr/article/Entrer-et-mettre-en-forme-des-donn%c3%a9es-fef13169-0a84-4b92-a5ab-d856b0d7c1f7?ui=fr-FR&rs=fr-FR&ad=FR#ID0EAABAAA=Conditional_formatting
J'espère que cela répond à votre question…
Bien à vous, Martin
Merci pour l'exemple, néanmoins dans vos exemples je ne vois qu'un critère à chaque fois : la note, ou l'animal et ensuite vous déroulez les Case is …
Par contre je n'ai pas vu d'exemple avec par exemple 2 critères, par exemple on vérifie en critère 1 l'année puis si l'année est 2020 en critère 2 on vérifie si la valeur est comprise entre 20 et 30, si l'année est 2019 on vérifie si la valeur est comprise entre 15 et 20, etc …
En gros des critères cumulatifs…
Je ne vois pas comment les traiter avec Select Case, alors qu'avec if il suffit d'ajouter "and".
Bonjour Padawan,
dans
Select Case
, il suffit aussi d'ajouterAnd
… 🙂Voici un exemple:
Mais vous avez raison, cela peut être bien utile de le savoir. Je vais l'ajouter dans mon tutoriel.
Cordialement, Martin