Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :
Sujets que vous pourriez aussi aimer :
Conditions en VBA – Instruction If ElseIf
Dans le support précédent, nous avons présenté les
variables et leurs déclarations . Les variables nous permettaient notamment de récupérer les valeurs saisies par l'utilisateur par le biais de boîtes de dialogue InputBox. Mais nous nous étions vite retrouvés limités fautes de moyens techniques. Rien ne nous permettait de contrôler la saisie de l'utilisateur pour éviter l'incompatibilité de type au moment de stocker la valeur en variable. Idem, pour la boîte de dialogue MsgBox, rien ne nous permettait de la personnaliser pour piloter le retour généré selon le bouton cliqué. Tout simplement parce que nous ne savions pas gérer des situations qui selon le cas engendre des actions différentes. Ce sont les
conditions en programmation qui permettent de repousser les limites et offrir plus de puissance. Si la valeur saisie n'est pas compatible, alors nous devons en informer l'utilisateur pour qu'il recommence. Si l'utilisateur clique sur Annuler, nous stoppons le traitement, sinon nous poursuivons. L'
instruction de programmation qui permet de gérer les
critères en
VBA Excel est l'instruction
If : If(Critère) Then Action Else Autre_action End If. Et nous verrons que lorsque le nombre de
conditions devient important, l'
instruction Switch prend le relais du
if pour un
code plus propre et plus efficace.
Gérer des conditions - Instruction If
Pour mettre en application cette nouvelle instruction, nous allons réaliser un cas pratique qui permet de calculer l'Indice de Masse Corporelle d'un individu (IMC). Le code doit donc demander à l'utilisateur, sa taille et son poids. Une fois ces valeurs stockées en mémoire, nous pourrons les calculer pour livrer le résultat.
La feuille IMC du classeur est déjà préparée. Sur une échelle graduée, elle représente la répartition des valeurs selon votre IMC. Elle n'attend plus que les résultats du
code VBA pour placer le petit curseur au-dessus des rectangles de couleur.
Enfoncer les touches ALT et F11 pour basculer dans l'éditeur de code,
Dans le volet Projet sur la gauche, double cliquer sur Feuil2 (IMC) ,
C'est ainsi la page de code de la feuille sur laquelle nous allons travailler qui s'affiche au centre de l'écran. Par le
code , il ne sera donc pas nécessaire d'indiquer sur quelle feuille nous souhaitons agir, puisque nous sommes déjà dessus.
Créer la procédure calcul_imc() ,
Nous n'allons pas entrer dans le vif du sujet tout de suite pour l'IMC. Puisque l'
instruction If nous permet a priori de gérer des cas, nous allons essayer de personnaliser la boîte de dialogue
MsgBox . Nous souhaitons lui associer des boutons d'actions retournant des valeurs à gérer. Si l'utilisateur clique sur Oui, il accepte de poursuivre et l'application se déroule. Dans le cas contraire le traitement du code doit être stoppé. Nous souhaitons donc créer une boîte de dialogue avec deux boutons Oui et Non. Ainsi le MsgBox va retourner une valeur, en l'occurrence numérique. Donc il faut stocker cette valeur. Donc il faut déclarer une variable en tant qu'entier court par exemple.
Déclarer la variable retour en tant que Byte ,
Affecter cette variable à la valeur retournée par le MsgBox qui doit contenir, en premier paramètre votre message, puis les deux boutons oui et non, puis un titre,
Afficher le résultat stocké dans cette variable avec un MsgBox ,
Le message est bien sûr saisi entre guillemets, il s'agit d'un texte. Lorsque que vous tapez ensuite la virgule, vous passez au deuxième argument de la fonction pour les boutons. Une liste déroulante apparaît pour vous aider à choisir. L'argument
vbYesNo est celui des deux boutons que nous recherchons.
Exécuter deux fois l'application pour tester le retour des deux boutons,
Comme vous le constatez, lorsque vous cliquez sur Oui, la variable stocke la valeur 6. Si vous cliquez sur Non, la variable stocke la valeur 7. Donc nous avons notre critère pour poser la
condition . Si la valeur est 6, nous poursuivons l'application, sinon nous la stoppons car l'utilisateur a refusé.
Pour information, la boîte de dialogue
MsgBox peut se personnaliser encore plus en ajoutant une icône avec les boutons, par exemple celle du point d'interrogation. Il s'agit toujours du deuxième paramètre que nous pouvons enrichir. Il faut utiliser le symbole plus (+) pour associer les fonctionnalités :
vbYesNo + vbQuestion . Nous pourrions aussi choisir d'ajouter une icône d'information ou d'exclamation respectivement avec les valeurs :
vbInformation et
vbExclamation .
L'instruction
VBA Excel pour stopper le code est
Exit Sub . Donc si la valeur de retour est 7, nous inscrivons
Exit Sub dans le cas contraire le
code se poursuit. La
condition se pose ainsi en
VBA Excel :
If(valeur=7) Then
Action
Else
Autre action
End If
Un
If doit se terminer par un
End If comme un
With se termine par un
End With . Le
Else est la branche qui permet de traiter le cas contraire, lorsque le critère n'est pas vérifié. Littéralement il s'agit du sinon de la
fonction Si .
Saisir le code permettant de stopper l'exécution si l'utilisateur clique sur Non et d'afficher un message On continue ! si l'utilisateur clique sur Oui,
Supprimer le MsgBox de test de la variable retour,
Tester le code pour les deux cas, oui et non,
Lorsque l'utilisateur clique sur Oui, le message
On continue ! s'affiche prouvant que le
code poursuit son
exécution . Lorsqu'il clique sur non, rien ne se produit, le code s'arrête. La branche
Else servait simplement de test pour nous assurer que le
code se poursuivait au clic sur le bouton Oui. Nous en avons la confirmation, nous pouvons donc l'enlever, car si l'utilisateur clique sur Oui, le
if n'est pas traité et l'
exécution reprend après l'instruction
End If .
Supprimer la branche Else du If ,
Nous devons maintenant nous occuper de récupérer les valeurs du poids et de la taille de l'utilisateur, pour le calcul de l'IMC. La taille doit s'écrire en cm et le poids en Kg. Il s'agit donc de deux
entiers , et même des
entiers courts pour bien dimensionner. Souvenez-vous, un
Byte peut stocker un entier compris en 0 et 255. Personne ne fait plus de 2,55 m et rares sont les personnes pesant plus de 255 Kg.
Déclarer les variables taille et poids en tant que Byte ,
Puis utiliser des InputBox pour enregistrer respectivement la taille et le poids saisis par l'utilisateur dans ces variables,
Remarque : Pour un
code plus propre, il est possible de déclarer les variables sur une même ligne. Il suffit de séparer les
déclarations par le symbole deux points (:). Si vous testez le
code , lorsque vous cliquez sur Oui, l'application vous demande de saisir votre taille puis votre poids. Les valeurs sont ainsi mémorisées dans les variables correspondantes que nous avons déclarées en
Byte . Si vous cliquez sur Non, le
code s'arrête, aucune autre boîte de dialogue ne s'affiche. Jusque-là , tout se passe donc comme nous le souhaitons. Mais à ce stade il y a un cas que nous ne gérons pas, l'
incompatibilité de type . Dès lors que vous interagissez avec un humain, il faut être capable de tout prévoir. Et rien ne l'empêche de saisir un texte à la place d'un nombre ou encore un poids ou une taille supérieure à 255. Dans les deux cas, les types sont incompatibles et le
programme plante.
C'est encore l'instruction
If qui vole à notre secours pour vérifier ces critères. Nous allons tout d'abord déclarer une variable
tampon en tant que
String . Un
String peut tout stocker, textes comme nombres. Nous allons affecter la valeur saisie par l'utilisateur à cette variable. S'il s'avère que cette valeur est bien numérique (fonction
IsNumeric() en
VBA Excel ), alors nous l'enregistrons dans la variable taille sinon nous affichons un message à l'utilisateur pour lui demander de reprendre la saisie. Reprendre la saisie signifie revenir un cran plus haut dans le code. C'est possible avec une instruction
Goto qui permet de revenir sur une
étiquette . Voyons tout cela.
Ajouter la déclaration de la variable tampon en tant que String ,
Remplacer les affectations des variables taille et poids par la variable tampon,
Si vous testez le programme, quoique vous tapiez, il poursuit son exécution sans générer d'erreur. Il faut donc maintenant tester le contenu de la variable tampon. S'il s'agit bien d'un nombre (fonction
IsNumeric() en
VBA Excel ), il faut le réaffecter aux variables numériques, car les opérations ne sont pas possibles sur des textes, sinon il faut en informer l'utilisateur.
Ajouter une étiquette nommée la_taille au-dessus du premier InputBox : la_taille: ,
Ajouter le test numérique suivant sous le InputBox :
If (IsNumeric(tampon)) Then
taille = tampon
Else
MsgBox 'La taille doit être saisie en cm, ex. 1,80 m = 180'
GoTo la_taille:
End If
Le
if teste si la variable tampon est bien un entier :
If (IsNumeric(tampon)) Then . Si c'est le cas, il stocke la valeur de ce nombre dans la variable taille :
taille = tampon . Sinon (
else ), il affiche un message à l'utilisateur pour lui demander de corriger : MsgBox 'La taille doit être saisie en cm, ex. 1,80 m = 180' et le renvoie à sa saisie
GoTo la_taille: . Le
GoTo permet en effet de renvoyer le programme à l'
étiquette la_taille juste au-dessus de l'
InputBox pour déclencher de nouveau la saisie.
Adapter le code pour le poids de la même façon,
Maintenant que les erreurs d'incompatibilités sont gérées, nous allons manipuler ces nombres pour calculer l'
IMC . Il faut diviser le poids par la taille au carré. IMC=taille/poids
2 . Le résultat obtenu sera de l'ordre de grandeur 10
-3 . Donc nous le multiplierons par 10000 afin de l'afficher sur notre échelle IMC de la feuille Excel.
Ajouter les lignes de code suivantes pour le calcul :
imc = poids / taille
imc = imc / taille
imc = imc * 10000
imc = Round(imc, 1)
Nous décomposons la division plutôt que de réaliser directement imc=poids/(taille*taille) pour éviter le dépassement de capacité à cause du potentiellement très grand nombre de décimales. Puis nous multiplions par 10000 comme nous l'avions dit pour le ramener sur notre échelle de valeurs. Enfin nous l'arrondissons à une décimale près, grâce à la fonction
Round() et son deuxième argument spécifiant le nombre de décimales à conserver. Selon l'échelle de valeurs représentées sur la feuille
Excel IMC, nous souhaiterions maintenant indiquer à l'utilisateur si son poids est correct (IMC<=25), s'il est en surpoids(25<IMC<=30) ou en état d'obésité (IMC>30). Vous l'avez compris, c'est encore l'instruction
If qui va nous permettre de résoudre ce problème. Sans elle, nous serions vite limités car nous ne pourrions pas poser de tels raisonnements afin d'envisager ces cas. Ici il y a trois cas. Donc il va falloir ajouter une condition à l'intérieur même de l'instruction
If avec un
ElseIf (Traduisez sinon si).
Ajouter les lignes de code suivantes à la suite :
Comme vous le remarquez le
ElseIf permet d'ajouter un
critère et donc de poursuivre l'instruction. A chaque
ElseIf ajouté, vous traitez un cas supplémentaire. Cette instruction
If est donc très souple et apporte beaucoup de puissance au
code . Le deuxième
critère n'exprime pas le compris entre (25<IMC<=30). En effet, c'est une question de déduction et d'ordre des
critères . Si le
code arrive jusque-là , c'est qu'il n'a pas vérifié le premier
critère . Donc on sait déjà que l'IMC n'est pas inférieure ou égale à 25. S'il vérifie par contre ce second
critère , nous saurons qu'il est <=30 et >25, donc compris entre les deux. Le dernier
Else sous-entend que les deux premiers critères ne sont pas vérifiés et que l'IMC est nécessairement supérieure à 30. Si vous testez le code, vous constatez, qu'il fonctionne parfaitement.
Nous souhaitons maintenant afficher le pointeur sur l'échelle, en fonction de la valeur de l'IMC. Le pointeur est le symbole représenté en cellule Z4. Nous avons donc besoin d'arrondir l'IMC à une valeur entière (
imc = Round(imc, 0) ). Il nous faut ensuite supprimer ce qui a pu être préalablement inscrit sur la ligne 8, si d'autres calculs ont été faits avant. Pour balayer la plage de cellules nous utilisons l'objet
Range (
Range('A8:T8').Value = '' ). Sa propriété
Value désigne son contenu, réinitialisé à vide avec les deux guillemets. Le
support de formation Débuter avec VBA Excel présente cet
objet et ses
propriétés . Puis nous devons inscrire ce symbole sur l'échelle de valeurs en fonction du résultat correspondant. Sauf que notre tableau commence à la colonne 18 au lieu de la colonne 1, donc avec l'objet
Cells , nous enlevons 17 à la valeur de colonne référencée par la valeur de l'IMC :
Cells(8, imc- 17) = Cells(4, 26) . La cellule Cells(4, 26) désigne bien sûr Z4 pour récupérer le symbole de la flèche.
Ajouter les trois lignes de code décrites ci-dessus afin de placer le pointeur sur l'échelle de valeurs en fonction du résultat de l'IMC,
Si vous testez le code avec
F5 , le pointeur se place parfaitement bien au-dessus du graphique. Cependant, dès que le
code s'arrête, l'affichage revient sur l'
éditeur Visual Basic . Pour que le code s'arrête en conservant l'affichage de la feuille, nous allons créer un bouton sur la feuille et lui associer ce
code , c'est-Ã -dire cette
macro par son nom,
calcul_imc .
Afficher la feuille IMC ,
Cliquer sur le bouton Insérer du ruban Développeur ,
Dans la liste des contrôles qui s'affichent, cliquer sur le premier
Cliquer et glisser sur la feuille pour tracer le bouton,
Dans la boîte de dialogue, choisir la macro calcul_imc ,
Au clic, le bouton exécutera désormais notre code. Nous avons réalisé une petite application tout à fait fonctionnelle en quelques clics.