Cours VBA : les conditions Les conditions sont très utiles en programmation, el

Cours VBA : les conditions Les conditions sont très utiles en programmation, elles nous serviront à effectuer des actions en fonction de critères précis (même principe que la fonction SI). La principale fonction est If, voici comment elle fonctionne : If [CONDITION ICI] Then ' => SI condition validée ALORS 'Instructions si vrai Else ' => SINON 'Instructions si faux End If Passons directement à la pratique et reprenons l'exemple développé à la leçon sur les variables. Il avait pour but d'afficher dans une boite de dialogue la ligne du tableau correspondant au numéro indiqué dans la cellule F5. : Fichier source : conditions.xls Si vous entrez une lettre en F5, cela génère un bug. Nous voulons éviter cela. Sub variables() 'Déclaration des variables Dim nom As String, prenom As String, age As Integer, numero_ligne As Integer 'Valeurs des variables numero_ligne = Range("F5") + 1 nom = Cells(numero_ligne, 1) prenom = Cells(numero_ligne, 2) age = Cells(numero_ligne, 3) 'Boîte de dialogue MsgBox nom & " " & prenom & ", " & age & " ans" End Sub Nous allons commencer par ajouter une condition pour vérifier que la valeur de la cellule F5 est numérique avant d'exécuter le code. La fonction IsNumeric sera utilisée dans cette condition : Sub variables() 'SI la valeur entre parenthèses (cellule F5) est numérique (DONC SI CONDITION VRAIE) alors on 'exécute les instructions placées après THEN If IsNumeric(Range("F5")) Then 'Déclaration des variables Dim nom As String, prenom As String, age As Integer, numero_ligne As Integer 'Valeurs des variables numero_ligne = Range("F5") + 1 nom = Cells(numero_ligne, 1) prenom = Cells(numero_ligne, 2) age = Cells(numero_ligne, 3) 'Boîte de dialogue MsgBox nom & " " & prenom & ", " & age & " ans" End If End Sub Ajoutons également des instructions pour le cas où la condition n'est pas remplie : Sub variables() If IsNumeric(Range("F5")) Then 'SI CONDITION VRAIE 'Déclaration des variables Dim nom As String, prenom As String, age As Integer, numero_ligne As Integer 'Valeurs des variables numero_ligne = Range("F5") + 1 nom = Cells(numero_ligne, 1) prenom = Cells(numero_ligne, 2) age = Cells(numero_ligne, 3) 'Boîte de dialogue MsgBox nom & " " & prenom & ", " & age & " ans" Else 'SI CONDITION FAUSSE 'Boîte de dialogue : avertissement MsgBox "L'entrée " & Range("F5") & " n'est pas valide !" 'Suppression du contenu de la cellule F5 Range("F5").ClearContents End If End Sub Les valeurs non numériques ne sont désormais plus un problème. Notre tableau contient 16 lignes de données, nous allons donc vérifier que la variable numero_ligne soit : "plus grande ou égale à 2" et "plus petite ou égale à 17". Mais avant, voici les opérateurs de comparaison : = est égal à <> est différent de < est plus petit que <= est plus petit ou égal à > est plus grand que >= est plus grand ou égal à Ainsi que d'autres opérateurs utiles : AND et [condition1] AND [condition2] Les 2 conditions doivent être vraies OR ou [condition1] OR [condition2] Au moins 1 des 2 conditions doit être vraie NOT faux NOT [condition1] La condition doit être fausse Ajoutons maintenant les conditions indiquées un peu plus haut en utilisant AND ainsi que les opérateurs de comparaison détaillés ci-dessus : Sub variables() If IsNumeric(Range("F5")) Then 'SI NUMERIQUE Dim nom As String, prenom As String, age As Integer, numero_ligne As Integer numero_ligne = Range("F5") + 1 If numero_ligne >= 2 And numero_ligne <= 17 Then 'SI N° CORRECT nom = Cells(numero_ligne, 1) prenom = Cells(numero_ligne, 2) age = Cells(numero_ligne, 3) MsgBox nom & " " & prenom & ", " & age & " ans" Else 'SI N° INCORRECT MsgBox "L'entrée " & Range("F5") & " n'est pas un numéro valide !" Range("F5").ClearContents End If Else 'SI NON NUMERIQUE MsgBox "L'entrée " & Range("F5") & " n'est pas valide !" Range("F5").ClearContents End If End Sub Pour rendre notre macro plus pratique, nous pouvons encore remplacer 17 par une variable contenant le nombre de lignes. Cela permettra d'ajouter/retirer des lignes à notre tableau sans avoir à modifier à chaque fois cette limite. Pour cela, créons une variable nb_lignes et ajoutons cette fonction: WorksheetFunction.CountA ne vous dit probablement rien mais il s'agit en fait de la fonction NBVAL que vous connaissez probablement déjà (sinon, cliquez ici). Nous demandons à cette fonction de comptabiliser le nombre de cellules non vides de la première colonne et nous remplaçons ensuite 17 par nb_lignes : Sub variables() If IsNumeric(Range("F5")) Then 'SI NUMERIQUE Dim nom As String, prenom As String, age As Integer, numero_ligne As Integer Dim nb_lignes As Integer numero_ligne = Range("F5") + 1 nb_lignes = WorksheetFunction.CountA(Range("A:A")) 'Fonction NBVAL If numero_ligne >= 2 And numero_ligne <= nb_lignes Then 'SI N° CORRECT nom = Cells(numero_ligne, 1) prenom = Cells(numero_ligne, 2) age = Cells(numero_ligne, 3) MsgBox nom & " " & prenom & ", " & age & " ans" Else 'SI N° INCORRECT MsgBox "L'entrée " & Range("F5") & " n'est pas un numéro valide !" Range("F5").ClearContents End If Else 'SI NON NUMERIQUE MsgBox "L'entrée " & Range("F5") & " n'est pas valide !" Range("F5").ClearContents End If End Sub ElseIf : ElseIf permet d'ajouter plusieurs conditions à la suite : If [CONDITION 1] Then ' => SI condition 1 validée ALORS 'Instructions 1 ElseIf [CONDITION 2] Then ' => SINON, SI condition 2 validée ALORS 'Instructions 2 Else ' => SINON 'Instructions 3 End If Si la condition 1 est vraie, les instructions 1 sont exécutées puis nous sortons de l'instruction If (qui débute avec If et finit à End If). Si la condition 1 est fausse, nous passons à la condition 2. Si celle-ci est vraie les instructions 2 sont exécutées si ce n'est pas le cas les instructions 3 seront alors exécutées. Voici un exemple, avec en A1 une note de 1 à 6 (sans virgules pour cet exemple) et en B1 un commentaire en fonction de la note : Sub commentaires_notes() 'Variables Dim note As Integer, commentaire As String note = Range("A1") 'Commentaire en fonction de la note If note = 6 Then commentaire = "Excellent résultat !" ElseIf note = 5 Then commentaire = "Bon résultat" ElseIf note = 4 Then commentaire = "Résultat satisfaisant" ElseIf note = 3 Then commentaire = "Résultat insatisfaisant" ElseIf note = 2 Then commentaire = "Mauvais résultat" ElseIf note = 1 Then commentaire = "Résultat exécrable" Else commentaire = "Aucun résultat" End If 'Commentaire en B1 Range("B1") = commentaire End Sub Select : Une alternative aux instructions If contenant beaucoup ElseIf existe : Select, cette instruction étant plus adaptée dans ce genre de situations. Voici la même macro avec Select : Sub commentaires_notes() 'Variables Dim note As Integer, commentaire As String note = Range("A1") 'Commentaire en fonction de la note Select Case note ' <= la valeur à tester (ici, la note) Case Is = 6 ' <= si la valeur = 6 commentaire = "Excellent résultat !" Case Is = 5 ' <= si la valeur = 5 commentaire = "Bon résultat" Case Is = 4 ' <= si la valeur = 4 commentaire = "Résultat satisfaisant" Case Is = 3 ' <= si la valeur = 3 commentaire = "Résultat insatisfaisant" Case Is = 2 ' <= si la valeur = 2 commentaire = "Mauvais résultat" Case Is = 1 ' <= si la valeur = 1 commentaire = "Résultat exécrable" Case Else ' <= si la valeur n'est égale à aucune des valeurs ci-dessus commentaire = "Aucun résultat" End Select 'Commentaire en B1 Range("B1") = commentaire End Sub Notez que nous pouvons également utiliser les autres opérateurs de comparaison, par exemple : Case Is >= 6 'si la valeur >= 6 Exemples avec plusieurs valeurs : Case Is = 6, 7 'si la valeur = 6 ou 7 Case Is <> 6, 7 'si la valeur est différente de 6 ou 7 Case 6 To 10 'si la valeur = de 6 à 10 Condition en fonction d'un type : IsNumeric (fonction vue à la page précédente) renvoie TRUE (vrai) si la valeur est numérique et FALSE (faux) si ce n'est pas le cas : If IsNumeric(Range("A1")) = True Then 'SI LA VALEUR EST NUMERIQUE ... Le code suivant est identique au premier (il n'est pas nécessaire d'indiquer = True puisque que l'on cherche automatiquement à savoir si la condition est vraie) : If IsNumeric(Range("A1")) Then 'SI LA VALEUR EST NUMERIQUE ... Dans le cas où nous voulons vérifier si la valeur n'est pas numérique, nous avons également deux possibilités : If IsNumeric(Range("A1")) = False Then 'SI LA VALEUR N'EST PAS NUMERIQUE ... If Not IsNumeric(Range("A1")) Then 'SI LA VALEUR N'EST PAS NUMERIQUE ... D'autres fonctions proches de IsNumeric : If IsDate(Range("A1")) Then 'SI LA VALEUR EST UNE DATE ... If IsEmpty(Range("A1")) Then 'SI VIDE ... If var_objet Is Nothing Then 'SI OBJET NON INITIALISE ... Condition en fonction du type d'une variable : Pour effectuer des actions en fonction du type d'une variable (Variant), nous aurons besoin de la fonction VarType. Après avoir uploads/Geographie/ ch4-les-conditions-vba.pdf

  • 16
  • 0
  • 0
Afficher les détails des licences
Licence et utilisation
Gratuit pour un usage personnel Attribution requise
Partager