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
conditions - conditions 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 :
ANDet [condition1] AND [condition2]
Les 2 conditions doivent être vraies
ORou [condition1] OR [condition2]
Au moins 1 des 2 conditions doit être vraie
NOTfaux 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:
nb lignes - conditions 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
notes - conditions

 

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 ajouté le signe =, la liste des types apparaît :
vartype - conditions suite
If VarType(ma_variable) = vbInteger Then 'SI ma_variable est de type Integer ...
La valeur des constantes :
ConstanteValeur
vbEmpty0
vbNull1
vbInteger2
vbLong3
vbSingle4
vbDouble5
vbCurrency6
vbDate7
vbString8
vbObject9
vbError10
If VarType(ma_variable) = vbInteger Then 'SI ma_variable est de type Integer ...
'Identique à :
If VarType(ma_variable) = 2 Then 'SI ma_variable est de type Integer ...

 

Condition en fonction de la comparaison de 2 chaînes de caractères

Jusque-là nous n'avons vu que cela :
ma_variable = "Exemple 12345"

If ma_variable = "Exemple 12345" Then ' => VRAI
Les 2 chaînes de caractères sont identiques ici, rien d'extraordinaire ...
Maintenant, si nous voulons vérifier que la variable contienne bien la valeur "12345" sans tenir compte des autres caractères, nous utiliserons l'opérateur Like ainsi que * devant et derrière la valeur à rechercher.
Le caractère * peut remplacer : aucun, un ou plusieurs caractères :
ma_variable = "Exemple 12345"

If ma_variable Like "*12345*" Then ' => VRAI
Le caractère # peut remplacer un caractère numérique de 0 à 9 :
ma_variable = "Exemple 12345"

If ma_variable Like "Exemple 12###" Then ' => VRAI
Le caractère ? peut remplacer un caractère quelconque :
ma_variable = "Exemple 12345"

If ma_variable Like "?xemple?1234?" Then ' => VRAI
Nous pouvons également remplacer un caractère en fonction d'une plage de caractères ou de caractères précis :
  • [abc] remplace un des caractères suivants : a b c
  • [a-g] remplace un des caractères suivants : a b c d e f g
  • [369] remplace un des caractères suivants : 3 6 9
  • [2-5] remplace un des caractères suivants : 2 3 4 5
  • [?*#] remplace un des caractères suivants : ? * #
ma_variable = "Exemple 12345"

If ma_variable Like "[BIEN]xemple 1234[4-7]" Then ' => VRAI
Pour remplacer un caractère non compris dans les valeurs entre crochets, un ! doit être ajouté après [ :
ma_variable = "Exemple 12345"

If ma_variable Like "[!FAUX]xemple 1234[!6-9]" Then ' => VRAI
Remarque : un caractère en majuscule n'est pas égal à ce même caractère en minuscule. Pour ne pas faire de distinctions entre majuscules-minuscules, placez Option Compare Text en début de module.

Aucun commentaire:

Enregistrer un commentaire