Select Case : Réaliser plusieurs Test conditionnels en VBA [#14 FORMATION EXCEL VBA COMPLETE]
Au cours des trois derniers chapitres de la formation sur l’apprentissage de VBA, nous avons découvert le fonctionnement de la structure conditionnelle If… Then… Else… Endif qui permet d’orienter le fonctionnement d’une macro VBA en fonction du résultat retourné par un test. Nous avions alors vu qu’il était possible d’utiliser un grand nombre de tests successifs, mais lorsque ce nombre commence à devenir significatif, alors cette structure n’est plus toujours très adaptée. Nous préfèrerons alors utiliser une autre structure conditionnelle : la structure Select Case.
Téléchargement
Vous pouvez télécharger le fichier d'exemple de cet article en cliquant sur le lien suivant :
Tutoriel Vidéo
Vous trouverez très régulièrement de nouvelles vidéos sur la chaîne, alors pensez à vous abonner pour ne manquer aucune astuce et devenir rapidement un pro d’Excel (cliquez-ici) !
1. Présentation
Pour définir le comportement qu’une macro doit adopter, nous pouvons utiliser comme nous venons de le voir dans l’introduction de ce chapitre une structure conditionnelle If… Then… :
Sub testSelectCase()
Dim a As Integer
a = 1
If a = 1 Then Debug.Print "Résultat OK"
End Sub
Ensuite, il est possible de démultiplier les tests afin de retourner un résultat adapté en utilisant les éléments ElseIf et Else :
Sub testSelectCase()
Dim a As Integer
a = -2000
If a <= -3000 Then
Debug.Print "Préhistoire"
ElseIf a <= -476 Then
Debug.Print "Antiquité"
ElseIf a <= 1492 Then
Debug.Print "Moyen Âge"
ElseIf a <= 1789 Then
Debug.Print "Temps Modernes"
Else
Debug.Print "Époque Contemporaine"
End If
End Sub
Ici, nous pourrions également utiliser une nouvelle structure conditionnelle, il s’agit de Select Case. Celle-ci s’utilise de la manière suivante :
Select Case valeur
Case "valeur 1"
' action 1
Case "valeur 2"
' action 2
…
Case Else
' action par défaut si aucun test précédent n’est valide
End Select
2. Select Case sur des valeurs numériques
Cette structure conditionnelle permet en premier lieu de vérifier des égalités avec la valeur d’une variable étudiée :
Sub testSelectCase()
Dim a As Integer
a = 1789
Select Case a
Case -3000
Debug.Print "Fin de la Préhistoire"
Case -476
Debug.Print "Fin de l'Antiquité"
Case 1492
Debug.Print "Fin du Moyen Âge"
Case 1789
Debug.Print "Fin des Temps Modernes"
End Select
End Sub
Ici, nous vérifions que la valeur de la variable a est strictement égale à l’une des années qui marque la fin de l’une des grandes Époques de l’histoire.
En revanche, si nous saisissons une année qui ne correspond pas exactement à une année de fin, alors rien ne va se passer (la macro va effectuer chacun des tests définis, sans rencontrer le moindre succès, jusqu’à finir par sortir du Select).
Pour renvoyer quand même un résultat lorsqu’aucune condition n’est remplie, il est possible d’utiliser l’instruction Case Else qui permet de définir une action par défaut :
Parfois il peut également être utile d’utiliser des opérateurs de comparaisons, comme nous les avons déjà découverts dans le chapitre de la formation dédié à l’utilisation des formules conditionnelles If.
Dans ce cas il convient d’utiliser Case Is et non pas simplement Case, mais pas de panique, en cas d’oubli nous pouvons compter sur la grande bonté de VBE qui se chargera de l’ajouter à notre place :
Sub testSelectCase()
Dim a As Integer
a = 2019
Select Case a
Case Is < -3000
Debug.Print "Préhistoire"
Case Is < -476
Debug.Print "Antiquité"
Case Is < 1492
Debug.Print "Moyen Âge"
Case Is < 1789
Debug.Print "Temps Modernes"
Case Else
Debug.Print "Époque Contemporaine"
End Select
End Sub
Nous pourrions également utiliser des intervalles pour borner les résultats testés en utilisant le terme To :
Sub testSelectCase()
Dim a As Integer
a = 1492
Select Case a
Case Is < -3000
Debug.Print "Préhistoire"
Case -2999 To -476
Debug.Print "Antiquité"
Case -475 To 1492
Debug.Print "Moyen Âge"
Case 1492 To 1789
Debug.Print "Temps Modernes"
Case Else
Debug.Print "Époque Contemporaine"
End Select
End Sub
Comme vous pouvez le voir, les intervalles utilisés ici comprennent les extrémités : nous avons en effet deux intervalles qui utilisent l’année 1492, mais le code s’arrête sur le premier d’entre deux.
3. Select Case sur des chaînes de caractères
Tout comme l’instruction If dont elle récupère grand nombre de propriétés, l’instruction Select permet également d’analyser des chaînes de caractères.
Sub testSelectCaseTextes()
Dim a As String
a = "banane"
Select Case a
Case "banane", "fraise", "pomme"
Debug.Print a & " est un fruit"
Case "carotte", "avocat", "épinard"
Debug.Print a & " est un légume"
Case Else
Debug.Print a & "n'est pas référencé"
End Select
End Sub
Comme vous pouvez le constater sur cet exemple, nous pouvons appliquer une même action sur plusieurs valeurs de test, en les séparant d’une simple virgule.
Les comparaisons et intervalles sont également disponibles pour les chaînes de caractères, les règles de tests sont alors les mêmes que celles que nous avons déjà découvertes dans les chapitre précédents dédiés à la découverte des tests conditionnels IF, notamment pour ce qui est de l’utilisation de l’ « Option Compare Text » pour des analyses alphabétiques.
Par exemple, par défaut le terme « Banane » ne sera pas reconnu comme un équivalent de « banane » en raison de la majuscule présente au début du mot :
En revanche, ajouter « Option Compare Text » au tout début du module permet de modifier ce comportement :
L’analyse se fait maintenant de manière purement alphabétique, sans tenir compte de la casse, ni des accents.
4. Imbriquer des Select dans des… Select
Bien entendu, il est possible d’utiliser des schémas bien plus complexes pour construire nos macros.
Il peut notamment être très pratique d’imbriquer des Select dans d’autres Select :