Ce tutoriel explique l'utilisation avancée de la structure VBA Select Case
: optimalisation du code VBA, utilisation de l'opérateur Like
, utilisation des Select Case
imbriqués et d'autres informations utiles. Il est donc destiné plutôt aux utilisateurs avancés de VBA.Il s'agit de la suite du tutoriel VBA: Select Case (mode d'emploi) qui explique les bases du Select Case
et qui s'adresse principalement aux débutants et aux personnes souhaitant découvrir cette structure.
Sommaire
- Select Case en mode "concis"
- Select Case est-il plus rapide que If… Then… Else…?
- Plusieurs structures Select Case imbriquées
- Sensitivité à la casse (majuscules / minuscules) dans la comparaison des textes
- Utilisation de "Like" comme opérateur dans la condition
- Conclusion du tutoriel
- Pour aller plus loin en VBA
Select Case en mode "concis"
Si vous êtes un adepte du code VBA aussi concis que possible (comme moi), j'ai une bonne nouvelle pour vous: grâce au signe :
la structure Select Case
se prête à merveille à un encodage de la condition et des actions à exécuter en une seule ligne. La lisibilité n'en est qu'encore meilleure. Jugez par vous-mêmes dans l'exemple suivant:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
Sub StructureSelectCase_concis() ' 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 |
Plus le nombre de conditions augmente, plus le besoin de garder le code facilement lisible devient important.
Select Case est-il plus rapide que If… Then… Else…?
Dans des macros qui traitent des volumes importants de données ou celles dont la vitesse d'exécution est primordiale, le choix de la méthode peut dépendre de sa vitesse plutôt que de son "lisibilité". On peut donc se poser la question: laquelle de ces deux méthodes est la plus rapide? Le seul moyen d'en avoir le cœur net est de faire quelques tests réels avec, de préférence, suffisamment d'itérations pour que la différence soit perceptible.
J'ai donc exécuté quelques tests de vitesse (mesurés à la milliseconde près) et voici les résultats:
- 250.000 itérations, 2 conditions & Else, conditions numériques: Select Case est de 9,7% plus rapide que If/Then/Else
- 250.000 itérations, 4 conditions & Else, conditions numériques: Select Case est de 34% plus rapide que If/Then/Else
- 250.000 itérations, 3 conditions & Else, conditions "textuelles": Select Case est de 5% plus rapide que If/Then/Else
- 350.000 itérations, 5 conditions & Else, conditions "textuelles": Select Case est de 13% plus rapide que If/Then/Else
Ce test n'a pas une prétention scientifique mais comme vous pouvez constater, la méthode Select Case
semble plus rapide – surtout s'il s'agit des conditions numériques. Le choix de la méthode peut être justifié par une préférence personnelle tant que les volumes restent relativement faibles. Mais plus le volume des données augmente, plus la structure Select Case
devient intéressante.
Plusieurs structures Select Case imbriquées
Parfois, on se retrouve devant une situation où on fait face à plusieurs conditions successives. D'après le résultat de la première condition, le code doit gérer la condition suivante qui dépend du résultat de la première. Comme illustrations, prenons l'exemple d'une centrale téléphonique (ou un helpdesk): chaque question/réponse implique une question/réponse suivante jusqu'à ce que l'on obtient la bonne personne à qui parler.
Si on a des conditions simples (par exemple avec deux possibilités de réponse), il est possible d'utiliser la construction des If
imbriqués. Mais à partir d'un certain volume de possibilités, les conditions If
deviennent difficilement lisibles. Et c'est là que Select Case
peut faire l'affaire sans complexifier le code VBA outre mesure.
Dans l'exemple suivant, on cherche l'adresse email appropriée selon la combinaison des variables "PaysOrigine" et "TypeUtilisateur". On fait alors appel à deux Select Case
imbriqués (un dans l'autre). Sachez qu'il est possible d'aller encore en profondeur de l'imbrication si nécessaire.
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 28 29 30 31 32 33 34 35 36 37 38 39 |
Sub SelectCaseImbrique() 'par Excel-Malin.com ( https://excel-malin.com ) 'exemple de l'utilisation de "Select Case" imbriqués Select Case PaysOrigine Case "France", "Allemagne", "Italie" Select Case TypeUtilisateur Case "privé": ContactInfo = "prive@europe.entreprise.fr" Case "professionnel": ContactInfo = "pro@europe.entreprise.fr" Case "institutionnel": ContactInfo = "instit@europe.entreprise.fr" Case "nouveau": ContactInfo = "nouveau@europe.entreprise.fr" Case Else: ContactInfo = "contact@europe.entreprise.fr" End Select Case "USA", "Canada" Select Case TypeUtilisateur Case "privé", "tpe": ContactInfo = "prive@am-nord.entreprise.fr" Case "professionnel", "corporate": ContactInfo = "pro@am-nord.entreprise.fr" Case "nouveau": ContactInfo = "nouveau@am-nord.entreprise.fr" Case Else: ContactInfo = "contact@am-nord.entreprise.fr" End Select Case "Japon" Select Case TypeUtilisateur Case "privé": ContactInfo = "prive@jp.entreprise.fr" Case "potential": ContactInfo = "potential@jp.entreprise.fr" Case "professionnel": ContactInfo = "pro@jp.entreprise.fr" Case "nouveau": ContactInfo = "nouveau@jp.entreprise.fr" Case Else: ContactInfo = "contact@jp.entreprise.fr" End Select Case "Brésil", "Russie", "Inde", "Chine" Select Case TypeUtilisateur Case "potential": ContactInfo = "potential@bric.entreprise.fr" Case "professionnel": ContactInfo = "pro@bric.entreprise.fr" Case "nouveau": ContactInfo = "nouveau@bric.entreprise.fr" Case Else: ContactInfo = "contact@bric.entreprise.fr" End Select Case Else: ContactInfo = "contact@monde.entreprise.fr" End Select End Sub |
Comme vous pouvez constater dans cet exemple, avec deux Select Case
imbriqués, nous avons pu couvrir 49 combinaisons possibles de "PaysOrigine" et "TypeUtilisateur" tout en gardant le code VBA tout à fait lisible et relativement court (35 lignes). Je vous laisse imaginer ce à quoi ressemblerait la même fonction qui utiliserait la structure If... Then... Else...
Sensitivité à la casse (majuscules / minuscules) dans la comparaison des textes
Par défaut, la comparaison en VBA est sensible à la casse. Si vous souhaitez que votre Select Case
soit insensible à la casse, il vous suffit d'ajouter Option Compare Text
au début de votre module.
Exemple:
1 2 3 4 5 6 7 8 9 10 11 12 |
Option Compare Text Sub Exemple_Casse() Select Case Range("A1").Value Case "Courgette" MsgBox "Légume" Case "Pomme", "Citron", "Poire" MsgBox "Fruit" End Select End Sub |
De cette manière, si la cellule contient pomme
, Pomme
ou POMME
, le résultat sera toujours correct…
Si vous ne souhaitez pas faire appel à Option ...
(qui, soit dit au passant, s'applique à tout le code dans le Module), il existe une autre possibilité.
Vous pouvez utiliser la fonction VBA LCase. En passant les valeurs par cette fonction, vous êtes sûr d'avoir toujours les valeurs en minuscule.
L'exemple plus haut rassemblerait alors à ceci:
1 2 3 4 5 6 7 8 |
Sub Exemple_Casse2() Select Case LCase(Range("A1").Value) Case "courgette" MsgBox "Légume" Case "pomme", "citron", "poire" MsgBox "Fruit" End Select End Sub |
Utilisation de "Like" comme opérateur dans la condition
Si vous avez besoin d'utiliser l'opérateur VBA Like
, sachez que la structure Select Case
ne permet pas son utilisation directe. Cependant, avec un peu de créativité, on peut obtenir le même résultat.
Le "truc" consiste à remplacer la variable à tester par la valeur True
et ensuite faire la comparaison entre la valeur testé et le "masque". Regardez l'exemple qui suit, ce sera probablement plus parlant…
Donc, à la place de la structure "habituelle" (mais qui ne fonctionne pas pour Like
):
1 2 3 |
Select Case MaValeur Case Like "*abc*": MsgBog "correspond" 'ceci ne fonctionnera pas |
Le code VBA doit ressembler à ceci:
1 2 3 |
Select Case True Case MaValeur Like "*abc*": MsgBog "correspond" 'ceci va fonctionner correctement |
Le résultat du test avec cette syntaxe sera correct.
Ceci est bien utile, à nouveau en comparaison avec If... Then... Else...
, si on veut utiliser plusieurs "masques" en même temps. Pour cela, il suffit simplement d'énumérer les masques en les séparant par une virgule. Le code VBA pourrait ainsi ressembler par exemple à ceci:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
Sub UtilisationLikeDansSelectCase() 'par Excel-Malin.com ( https://excel-malin.com ) MaValeur = "EU_3256-FR-01" 'exemple: une référence de produit Select Case True Case MaValeur Like "*-01", MaValeur Like "*-02", MaValeur Like "*-05": TypeProduit = "fruit" Case MaValeur Like "*-06": TypeProduit = "légume" Case MaValeur Like "*-07", MaValeur Like "*-08": TypeProduit = "biscuit" Case MaValeur Like "*-09", MaValeur Like "*-00": TypeProduit = "produit laitier" Case Else: TypeProduit = "produit non-repertorié" End Select MsgBox "Le produit n° " & MaValeur & " est un " & TypeProduit End Sub |
De plus, il est assez facile de transformer ce code en une Function
avec le mot à tester comme argument et un Boolean
(VRAI/FAUX – TRUE/FALSE) come résultat. Une fonction semblable pourrait alors être utilisée dans de nombreuses circonstances.
Conclusion du tutoriel
J'espère que ce tutoriel vous a apporté des informations utiles ou des idées supplémentaires pour vos macros en VBA. La structure Select Case
est un très bon exemple que l'on peut aller toujours plus loin en VBA et que le VBA ne sert pas seulement à "automatiser le coloriage des tableaux Excel" comme le pensent certains!
Si vous connaissez une autre astuce ou une autre utilisation intéressante de Select Case
, n'hésitez pas à la partager via les commentaires. Toute contribution est la bienvenue.
Pour aller plus loin en VBA
Je vous propose les articles sur VBA suivants (sur Excel-Malin.com) qui pourraient également vous intéresser…
- Cours VBA gratuit en ligne: "VBA: Droit au but"
- Liste de toutes les fonctions VBA
- Manipulation basique des fichiers en VBA
- VBA: Vérifier la validité d’une adresse e-mail
- VBA: trouver la dernière cellule utilisée
- Gestion des dates et heures en VBA
- Comment utiliser RECHERCHEV en VBA
5 commentaires sur “VBA: Select Case (utilisation avancée)”
bravo, cela m'a beaucoup aidé, très beau tutoriel, claire et parfaitement présenté.
un grand merci
Cela fait plaisir à entendre… Merci. Martin
Merci infiniment pour ce tutoriel si bien structuré, avec des exemples vraiment clairs.
Quel support efficace pour mes progs.
Merci Michel!
"Select Case" est bien pratique. Le code apparaît plus clair.