VBA: Select Case (utilisation avancée) 2


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 et qui s'adresse principalement aux débutants et aux personnes souhaitant découvrir cette structure.

 

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:

 

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 de données importantes ou ceux 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:

 

  1. 250.000 itérations, 2 conditions & Else, conditions numériques: Select Case est de 9,7% plus rapide que If/Then/Else
  2. 250.000 itérations, 4 conditions & Else, conditions numériques: Select Case est de 34% plus rapide que If/Then/Else
  3. 250.000 itérations, 3 conditions & Else, conditions "textuelles": Select Case est de 5% plus rapide que If/Then/Else
  4. 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.

 

Select Case imbriqués

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.

 

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 l'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...

 

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".

Donc, à la place de la structure "habituelle" (mais qui ne fonctionne pas pour Like):

 

Select Case MaValeur
   Case Like "*abc*": MsgBog "correspond"
'ceci ne fonctionnera pas

Le code VBA doit ressembler à ceci:

 

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:

 

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

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 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…

 

27 0




Laissez un commentaire

Votre adresse de messagerie ne sera pas publiée.

2 commentaires sur “VBA: Select Case (utilisation avancée)