Ce chapitre est essentiel à la programmation, mais pas difficile. Super non ? Enfin, il est facile à comprendre et présent dans la plupart des langages de programmation. Les conditions, c'est des choix que fait le programme en fonction de critères. Chacun est habitué à la prise de décision. Après tout, vous prenez des décisions tous les jours. Par exemple, quand vous vous réveillez, il vous faut choisir vos habits. Vous prenez cette décision en fonction de différents facteurs comme la météo ou bien votre type d'activité de la journée.
Les programmes doivent également prendre des décisions en fonction de paramètres auxquels le programme a accès. Les programmes informatiques seraient extrêmement monotones s'ils ne prenaient jamais de décision. Par exemple, si un programme tente de charger un classeur et qu'il ne trouve pas ce classeur, il faut prendre une décision pour savoir quelle conduite adopter. Est-ce que le programme doit simplement afficher un message d'erreur et stopper son exécution ou bien doit-il faire preuve de plus d'intelligence et alerter l'utilisateur que le fichier est manquant et offrir une action alternative ?
- Qu'est ce qu'une condition ?
- Créer une condition en VBA
- Simplifier la comparaison multiple
- Commandes conditionnelles multiples
Qu'est ce qu'une condition ?
Nous venons de voir l'utilité de la prise de décision dans un programme pour qu'il puisse se débrouiller seul avec le moins d'interventions possible de l'utilisateur. Elle gère les différents évènements d'un programme et devient de suite une notion très importante.
Pour démarrer, on va expliquer ce qu'est une condition. Une condition commence toujours par un SI (if en anglais). Dans la vie courante, on peut dire : "Si je finis de manger avant 13 h, je vais regarder le journal télévisé". On peut aussi aller plus loin en disant "Sinon, j'achète le journal". Pour VBA, c'est la même chose. On a une commande conditionnelle dans VBA qui nous permet de faire des conditions : If…Then…Else.
Pour faire une condition, il faut un critère de comparaison. Lorsque vous faites un puzzle, vous triez en premier les pièces qui font le tour pour délimiter le puzzle et aussi parce que le critère de comparaison entre les pièces est simple : sur les pièces du tour, il y a un côté plat. Donc lorsque vous prenez une pièce en main, vous comparez les côtés de la pièce à un côté plat et vous la mettez soit dans la boite des pièces du tour soit dans les pièces qui seront retirées par la suite.
Dans VBA, ce critère de comparaison est soit une valeur, une variable ou encore du texte. On compare les données d'une cellule à notre critère de comparaison et VBA renvoie VRAI si la comparaison est juste ou FAUX. VBA exécute enfin ce que vous lui avez dit de faire en fonction de ce que renvoie la comparaison.
Pour comparer des valeurs numériques ou même du texte, on utilise des signes mathématiques. Le plus connu des signes de comparaison est égal à (=). Si les valeurs sont égales, alors fait ceci sinon fait cela. Je vous donne la liste de tous les opérateurs utilisés dans VBA pour les comparaisons :
Opérateur de comparaison |
Signification |
---|---|
= |
Égal à |
Supérieur à |
|
< |
Inférieur à |
|
Supérieur ou égal à |
<= |
Inférieur ou égal à |
<> |
Différent de |
On peut donc avec ces opérateurs de comparaison faire toutes les comparaisons possibles entre deux valeurs. On va alors s'entraîner à faire des comparaisons avec des données :
Comparaison |
---|
age <= 1 |
mot_de_passe <> password |
pointure > 39 |
pseudo = identifiant |
age >= 18 |
parents < 3 |
Alors, vous savez à quoi correspondent toutes ces comparaisons ? La réponse juste en dessous.
Comparaison |
Signification (Si…) |
---|---|
age <= 1 |
La variable age est inférieure ou égale à 1 |
mot_de_passe <> password |
Les variables mot_de_passe et password sont différentes |
pointure > 39 |
La variable pointure est supérieure à 39 |
pseudo = identifiant |
Les variables pseudo et identifiant sont identiques |
age >= 18 |
La variable age est supérieure ou égale à 18 |
parents < 3 |
La variable parents est inférieure à 3 |
Vous voyez que l'on peut faire plein de choses avec ces comparaisons !
Créer une condition en VBA
Pour créer une condition en VBA, on a besoin de plusieurs mots-clés. Le premier c'est If, ce mot clé permet d'ouvrir la condition avec un SI. Ensuite on écrit la condition avec le critère de comparaison. Lorsqu'on a fini, on inscrit le mot-clé Then qui signifie "alors". Cela signifie que l'on va dire ce qu'il faut faire si la condition est respectée. Le mot-clé Else nous permet d'écrire du code si la condition n'est pas respectée. Pour terminer la condition, on écrit le mot clé End If comme pour achever une macro avec End Sub.
Un exemple pour illustrer et bien comprendre :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | Sub test_condition() Dim age As Byte age = 20 ' Si vous avez un age supérieur ou égal à 18 : If age >= 18 Then MsgBox "Vous êtes un adulte" ' Sinon : Else MsgBox "Vous êtes encore mineur" End If End Sub |
Dans un premier temps, on crée une variable à laquelle on applique une valeur (on pourra dans la suite du cours avoir une interaction avec l'utilisateur, pour l'instant changez vous-même la valeur de la variable). Ensuite on compare la variable à l'âge de la majorité et on affiche une phrase en fonction du résultat.
On indente notre code dans une condition et aussi le reste du code pour que ce soit plus lisible. Indenter c'est créer un espace entre le bord gauche et le début de la commande pour bien voir les niveaux de la commande.
Si l'on souhaite faire plusieurs conditions, on n'est pas obligé de créer un groupe de If…Then…Else à chaque fois. On peut comparer notre variable à une première valeur, si c'est vraie alors on exécute le code, sinon on compare à une autre valeur, si cette fois c'est vrai on exécute le code et ainsi de suite tant qu'il y a du code à comparer. Jusqu'à ce que vous n'ayez plus de valeur à comparer.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | Sub test_condition() Dim age As Byte age = 20 If age >= 18 Then MsgBox "Vous êtes un adulte" ElseIf age < 8 Then MsgBox "Vous êtes un surdoué pour être ici à votre âge !" Else MsgBox "Vous êtes encore mineur" End If End Sub |
Vous remarquez qu'on utilise le mot-clé ElseIf pour faire une deuxième comparaison et afficher du texte en conséquence. Cette ligne avec le ElseIf fonctionne comme la ligne du If.
Simplifier la comparaison multiple
Il existe une autre commande disponible ne VBA pour traiter des conditions : Select Case. Cette commande permet de simplifier la succession de ElseIf. Si vous avez une variable et que vous vouliez accomplir différentes actions en fonction de la valeur de cette variable, vous pouvez utiliser Select Case ainsi :
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 | Sub test_note() Dim note As Byte note = 12.4 Select Case (note) Case Is < 8 MsgBox "Vous n'avez pas votre baccalauréat" Case Is < 10 MsgBox "Vous devez aller aux rattrapages" Case Is < 12 MsgBox "Félicitations ! Vous avez votre bac !" Case Is < 14 MsgBox "Vous avez la mention Assez Bien" Case Is < 16 MsgBox "Vous avez la mention Bien" Case Is < 18 MsgBox "Vous avez la mention Très Bien" Case Else MsgBox "Vous avez les félicitations du jury et les miennes par la même occasion" End Select End Sub |
Ce code est beaucoup plus lisible que avec des ElseIf partout et surtout plus rapide. Vous connaissez alors une alternative pour comparer une variable dans un même bloc.
Un autre exemple pour que vous connaissiez les différentes formes de Case.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | Select Case (note) Case 1 MsgBox "La note est de 1" Case 2, 3 MsgBox "La note est de 2 ou 3" Case 4 To 6 MsgBox "La note est de 4, 5 ou 6" Case Is > 6 MsgBox "La note est supérieure à 6" Case Else MsgBox "La note est inférieure à 1" End Select |
Dans cet exemple, il y a des petites nouveautés avec les deux valeurs séparées par une virgule ou les valeurs séparées par To qui signifie "de … à". Le code et ce qui est dans les MsgBox suffit à comprendre la signification de chaque Case.
Commandes conditionnelles multiples
Dans les commandes précédentes, on a utilisé une seule condition de la forme " Si age >= 18 alors … ". Vous pouvez aussi utiliser plusieurs commandes conditionnelles en utilisant un opérateur logique. Un opérateur logique, c'est par exemple un simple AND (qui signifie ET en français). Avec cet opérateur, on peut comparer notre variable age à deux critères dans la même condition.
Présentations des deux opérateurs logiques AND (ET) et OR(OU)
L'opérateur AND exige que toutes les conditions soient vraies pour exécuter la première partie du code. Si une seule des conditions est fausse, alors la procédure exécute le code situé après le Else. L'opérateur OR exige qu'une seule des conditions soit vraie pour exécuter la première partie du code.
Vous avez compris ? Pas trop n'est-ce pas. Et bien on va voir toutes les possibilités dans deux conditions avec l'opérateur AND et deux conditions avec l'opérateur OR. Pour chaque ligne, on donne ce que renvoie la condition 1 et ce que renvoie la condition 2 puis le résultat que renvoie la commande If. Des exemples très simples sont mentionnés pour vous aider à comprendre.
On va pouvoir alors exécuter du code en fonction de deux variables. Dans un premier temps en utilisant l'opérateur AND. Si la note est inférieure à 10 et que le travail est inférieur à 5h, alors, il faut motiver l'élève à travailler plus pour avoir une meilleure note.
Il est très simple d'utiliser ces opérateurs. Il suffit d'écrire ce code :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | ' Pour l'opérateur And c'est comme ceci : If age < 18 And sexe = "Masculin" Then MsgBox "Vous n'êtes encore qu'un garçon..." Else MsgBox "Soit plus de 18 ans, soit vous êtes de sexe féminin" End If ' Pour l'opérateur Or C'est la même chose If pointure < 40 Or taille < 34 ... End If |
Il faut retenir qu'avec And, toutes les conditions doivent être vraies pour exécuter le code qui suit Then. Alors que pour Or, une seule de TOUTES les conditions doit être vraie pour exécuter la première partie du code.
D'autres opérateurs logiques
Il existe d'autres opérateurs logiques pour vos conditions qui permettent d'autres comparaisons.
Not
L'opérateur Not inverse le résultat d'une condition. Si une condition est vraie, elle devient fausse avec le mot-clé Not.
1 2 3 4 5 6 7 | If Not(2 = 3) Then MsgBox "Les valeurs ne sont pas égales" Else MsgBox "Les valeurs sont égales" End If |
Grâce à l'opérateur Not, même si la condition est fausse, on exécute la première partie du code.
Xor
Cet opérateur logique est très semblable à Or. La différence, parce que oui il y en a une, est que pour Xor si deux conditions sont vraies, alors c'est le code de la deuxième partie qui est exécutée. VBA considère que deux conditions vraies donnent faux avec Xor.
C'est tout ce que je peux vous dire sur cet opérateur. C'est avec l'expérience que vous serez amené à l'utiliser. Pour l'instant, vous savez qu'il existe et savez l'utiliser.
Is
L'opérateur Is permet de comparer deux objets VBA.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | Sub test() If Worksheets(1) Is Worksheets(1) Then MsgBox "Les deux feuilles sont identiques" Else MsgBox "Les deux feuilles ne sont pas identiques" End If If Worksheets(1) Is Worksheets(2) Then MsgBox "Les deux feuilles sont identiques" Else MsgBox "Les deux feuilles ne sont pas identiques" End If End Sub |
Le premier code va afficher la première réponse alors que le second va afficher la seconde même si les deux feuilles sont vierges parce qu'elles ont un nom différent.
Like
Cet opérateur permet de comparer deux chaînes de caractères. La correspondance entre deux chaînes peut être seulement les n premiers caractères ou simplement au niveau de la casse (majuscule ou minuscule).
On utilise un mot-clé Option Compare que l'on doit écrire dans la section des déclarations. Ce mot clé peut être suivi de deux valeurs : Binary ou Text. Si vous spécifiez Binary, une lettre en majuscule et la même lettre en minuscule ne sont pas considérées comme identiques. Alors qu'avec Text, la comparaison ne fait pas de différences entre minuscule et majuscule. Si Option Compare est utilisé seul, c'est Binary par défaut qui est utilisé.
Dan cet exemple on utilise le mode Binary :
1 2 3 4 5 6 7 8 9 10 11 12 13 | Option Compare Binary Sub test() If "Site du Zéro" = "site du zéro" Then MsgBox "Les chaînes sont exactement les mêmes" Else MsgBox "Il y a des différences entre les chaînes de caractères" End If End Sub |
Dans ce code, les chaînes ne sont pas identiques puisque des majuscules sont dans la première chaîne et absentes dans la seconde. Si on exécute le même code en spécifiant Text à la place de Binary, c'est le premier message qui sera renvoyé.
Si on veut comparer que quelques caractères, on peut utiliser des caractères joker. Le symbole ? remplace un seul caractère, mais n'importe lequel, le symbole * remplace quant à lui une chaîne de caractère. Je vous présente un tableau avec les caractères de comparaison et leur signification.
Caractères |
Signification |
---|---|
? |
Remplace un seul caractère |
* |
Remplace zéro ou plusieurs caractères |
# |
Remplace un chiffre (de 0 à 9) |
[Liste_de_caractères] |
Remplace un seul caractère de la liste |
[!Liste_de_caractères] |
Un seul caractère absent de la liste. |
Comment utiliser ces caractères ? Pour les trois premiers, c'est assez simple, il suffit de remplacer les caractères à remplacer par ?, * ou #. Faites des tests pour bien comprendre (des exemples sont présentés juste après).
Pour ce qui est des listes de caractères, on peut faire quelques précisions. Par exemple, vous écrivez cette liste : [abcdef]. Cela signifie que le caractère de la première chaîne doit être soit un a, soit un b, soit un c, soit un d, soit un e, soit un f pour que la commande renvoie Vrai. Si le caractère de la première chaîne n'est pas une de ces lettres, alors la commande renvoie Faux.
Si je veux que ce soit toutes les lettres de l'alphabet, on écrit tout l'alphabet ?
Rappel : les programmeurs sont des feignants. Il existe alors une simplification ! Si vous voulez les lettres de a à f comme dans l'exemple précédant, il suffit de mettre un trait d'union (-) entre la première et la dernière lettre : [a-f], ceci correspond à [abcedf]. De la même façon, [a-z] équivaut à [abcdefghijklmnopqrstuvwxyz] et [0-9] correspond à [0123456789].
Nous allons mettre en place une série d'exemples pour bien comprendre et utiliser. Il faut alors initialiser Option Compare à Text.
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 | Option Compare Text Sub test_comparaison() If "site du zéro" Like "site du ?éro" Then ' Cette ligne renvoie True If "site du zéro" Like "site du *" Then ' Cette ligne renvoie True If "Site du zéro" Like "site ?u zero" Then ' Cette ligne renvoie False non pas parce que le "S" est en majuscule puis minuscule ' ni à cause du ?, mais parce que dans la première chaîne, il y a un "é" ' et dans la seconde, il n'y a pas d'accent. If "Site du 0" Like "site du #" Then ' Cette ligne renvoie True car 0 est un chiffre. If "Site du 0" Like "site du [012345]" Then ' Cette ligne renvoie True car le caractère de la première chaîne est présent dans ' la liste entre crochets. If "Site du 0" Like "site du [5-9]" Then ' Cette ligne renvoie False car 0 n'est pas compris entre 5 et 9 compris. If "Site du 0" Like "site du [!5-9]" Then ' Cette ligne renvoie True car 0 n'est pas compris entre 5 et 9 compris. ' C'est l'inverse de l'exemple précédant. If "Site du zéro ?" Like "site du zéro [?]" Then ' Cette ligne renvoie True car le caractère à la fin est bien un point d'interrogation. ' N'oubliez pas les crochets, sinon, n'importe quel caractère peut être à la place ' du point d'interrogation dans la première chaîne. End Sub |
J'espère que ces exemples vous ont été utiles pour comprendre l'opérateur Like. Sinon, n'hésitez pas à relire et faire des tests vous-mêmes.
Après avoir développé un peu d'intelligence artificielle dans notre programme, il est temps de voir de nouvelles notions qui permettront d'engager un "dialogue" plutôt humain entre l'utilisateur et le programme. Nous allons donc attaquer les boucles, qui exécutent un morceau de code plusieurs fois de suite tant qu'une condition est vraie. Comme quoi, tout est lié !