formateur informatique

Gérer les conditions et critères en VBA Excel

Accueil  >  Bureautique  >  Excel  >  Excel VBA  >  Gérer les conditions et critères en VBA Excel
Livres à télécharger


Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :


Inscription Newsletter    Abonner à Youtube    Vidéos astuces Instagram
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. Tableau Excel pour calcul IMC

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(),
Code CVA attaché à une feuille Excel

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,
Affichage écran du contenu de la variable avec 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é.
Comment connaître la valeur de retour bouton cliqué

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.
Boîte de dialogue, bouton oui et non et icône question

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,
Branchement if else pour tester action utilisateur

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,
Valeurs utilisateur inputbox mémorisées dans variables VBA

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.
Message erreur incompatibilité de type, variables mal typées

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

Message information généré par test instruction 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,
Conditions If sur variables et renvois Goto pour éviter incompatibilité de type

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/poids2. 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 :
Tester plusieurs critères ensemble grâce au If ElseIf en VBA

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.
Test des critères avec boîte de dialogue MsgBox

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,
Ecrire dans des plages de cellules en VBA Excel

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,
Créer un bouton de macro directement sur la feuille Excel

Au clic, le bouton exécutera désormais notre code. Nous avons réalisé une petite application tout à fait fonctionnelle en quelques clics.
Bouton sur feuille Excel avec code VBA

 
Sur Facebook
Sur Youtube
Les livres
Contact
Mentions légales



Abonnement à la chaîne Youtube
Partager la formation
Partager sur Facebook
Partager sur Twitter
Partager sur LinkedIn