VBA: Select Case (utilisation avancée)

Excel / VBA: Select Case avec LIKE

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.

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:

 

 

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:

 

  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.

 

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.

 

 

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:

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:

 

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):

 

 

Le code VBA doit ressembler à ceci:

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:

 

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…

 

Laissez un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

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