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.