TOP

VBA-Leçon 7.1. Conditions (Conditions)

Les conditions sont très utiles en programmation car elles permettent d'effectuer des actions en fonction de critères fixés (le même principe est utilisé que dans la fonction IF Excel).

L'instruction VBA If...Then...Else exécute un ensemble d'instructions selon que la condition spécifiée est vraie ou non. Si la condition (test logique) est remplie, un ensemble d'actions est exécuté. Cependant, si la condition est fausse, un autre ensemble d’actions est effectué.

Cependant, pour des raisons de lisibilité, vous pouvez utiliser l'instruction Select Case au lieu de plusieurs niveaux d'instructions If...Then...Else imbriquées.


Si... Alors... Sinon

Ainsi, la fonction la plus importante qui définit la condition est IF et nous allons maintenant voir comment elle fonctionne :

If [TERME ICI] Then '=> SI la condition est vraie ALORS
   'Instructions si "vrai"
Else '=> AUTREMENT
   'Instructions si "mentir"
End If

Soyons pratiques et revenons à l'exemple que nous avons utilisé dans la leçon sur les variables. Le but de cette procédure était d'afficher une boîte de dialogue qui afficherait la valeur de la chaîne spécifiée dans la cellule F5 :

Si vous tapez une lettre dans la cellule F5, cela provoquera une erreur. Nous voulons empêcher cela.

Sub variables()
   'Déclaration de variables
   Dim last_name As String, first_name As String, age As Integer, row_number As Integer
       
   'Attribuer des valeurs aux variables
   row_number = Range("F5") + 1
   
   last_name  = Cells(row_number, 1)
   first_name = Cells(row_number, 2)
   age        = Cells(row_number, 3)
   
   'Boite de dialogue
   MsgBox last_name & " " & first_name & ", " & age & "années"
End Sub

Ajoutons une condition qui vérifiera si la valeur saisie dans la cellule F5 est un nombre avant l'exécution du code.

Nous utiliserons la fonction IsNumeric pour tester la condition :

Sub variables()
  'Si la valeur entre parenthèses (cellule F5) est numérique (d'où la CONDITION IF EST VRAIE) alors
  'exécuter les instructions qui suivent ALORS
   If IsNumeric(Range("F5")) Then
   
       'Déclaration de variables
       Dim last_name As String, first_name As String, age As Integer, row_number As Integer
       
       'Attribuer des valeurs aux variables
       row_number = Range("F5") + 1
       
       last_name  = Cells(row_number, 1)
       first_name = Cells(row_number, 2)
       age        = Cells(row_number, 3)
       
       'Boite de dialogue
       MsgBox last_name & " " & first_name & ", " & age & "années"
    End If
End Sub

Nous devons également rédiger des instructions si la condition que nous avons fixée n'est pas remplie :

Sub variables()
    If IsNumeric(Range("F5")) Then 'Si la condition est remplie
   
       'Déclaration de variables
       Dim last_name As String, first_name As String, age As Integer, row_number As Integer
       
       'Attribuer des valeurs aux variables
       row_number = Range("F5") + 1
       
       last_name  = Cells(row_number, 1)
       first_name = Cells(row_number, 2)
       age        = Cells(row_number, 3)
       
       'Boite de dialogue
       MsgBox last_name & " " & first_name & ", " & age & "années"
       
    Else 'Si la condition n'est pas remplie
   
       'Boîte de dialogue : avertissement
       MsgBox "Valeur saisie" & Range("F5") & "ce n'est pas vrai!"
       
       'Supprimer le contenu de la cellule F5
       Range("F5").ClearContents
    End If
End Sub

Désormais, une valeur non numérique ne posera aucun problème.

En travaillant avec notre tableau qui contient 16 lignes de données, notre prochaine étape sera de vérifier si la variable row_number est : "supérieure ou égale à 2" et "inférieure ou égale à 17".

Mais d’abord, regardons les opérateurs de comparaison :

= exactement
<> pas exactement
< moins que
<= inférieur ou égal à
> plus que
>= Plus grand ou égal à

et ces opérateurs utiles :

AND [condition1] AND [condition2] Deux conditions doivent être remplies
OR[condition1] OR [condition2] Qu'au moins 1 des 2 conditions doivent être remplies
NOTNOT [condition1] La condition ne doit pas être remplie

Ajoutons maintenant l'une des conditions AND ci-dessus entre les opérateurs de comparaison :

Sub variables()
    If IsNumeric(Range("F5")) Then 'Si une valeur numérique
    
        Dim last_name As String, first_name As String, age As Integer, row_number As Integer
        
        row_number = Range("F5") + 1

        If row_number >= 2 And row_number <= 17 Then 'Si le bon numéro
        
            last_name  = Cells(row_number, 1)
            first_name = Cells(row_number, 2)
            age        = Cells(row_number, 3)
            
            MsgBox last_name & " " & first_name & ", " & age & "années"
            
        Else 'Si le numéro n'est pas correct
            MsgBox "Numéro saisi" & Range("F5") & "n'est pas correcte!"
            Range("F5").ClearContents
        End If
       
    Else 'Si ce n'est pas une valeur numérique
        MsgBox "Valeur saisie" & Range("F5") & "ce n'est pas vrai!"
        Range("F5").ClearContents
    End If
End Sub

Si nous voulons rendre notre macro plus pratique, nous pouvons remplacer 17 par une variable qui contiendrait le nombre de lignes. Cela nous permettrait d'ajouter et de supprimer des lignes du tableau sans avoir à modifier cette limite à chaque fois.

Pour ce faire, nous devons créer une variable nb_rows et ajouter cette fonction.

Dans ce cas, nous utiliserons la fonction WorksheetFunction.CountA, qui est analogue à la fonction COUNTA dans Excel lui-même.

Nous voulons que cette fonction compte le nombre de cellules non vides dans la première colonne et écrive la valeur résultante dans la variable nb_rows :

Sub variables()
    If IsNumeric(Range("F5")) Then 'SI NOMBRE
    
        Dim last_name As String, first_name As String, age As Integer, row_number As Integer
        Dim nb_rows As Integer
       
        row_number = Range("F5") + 1
        nb_rows    = WorksheetFunction.CountA(Range("A:A")) 'La fonction de compter le nombre de lignes
       
        If row_number >= 2 And row_number <= nb_rows Then 'SI NUMÉRO VALABLE
        
            last_name  = Cells(row_number, 1)
            first_name = Cells(row_number, 2)
            age        = Cells(row_number, 3)
            
            MsgBox last_name & " " & first_name & ", " & age & "années"
            
        Else 'SI LE NUMÉRO EST INCORRECT
            MsgBox "Numéro saisi" & Range("F5") & "n'est pas correcte!"
            Range("F5").ClearContents
        End If

    Else 'SI PAS LE NUMÉRO
        MsgBox "Valeur saisie" & Range("F5") & "ce n'est pas vrai!"
        Range("F5").ClearContents
    End If
End Sub

SinonSi

ElseIf permet d'ajouter des conditions supplémentaires après la commande IF :

If [ÉTAT 1] Then '=> SI la condition 1 est vraie ALORS
   'Consignes 1
ElseIf [ÉTAT 2] Then '=> SI la condition 1 est fausse mais la condition 2 est vraie ALORS
   'Consignes 2
Else '=> AUTREMENT
   'Consignes 3
End If

Si la CONDITION 1 est vraie, l'instruction 1 exécutera et quittera l'instruction IF (qui commence par IF et se termine par End If). Si la CONDITION 2 renvoie faux, alors l'instruction 2 sera exécutée, et si elle renvoie faux, alors l'instruction 3 (sous Else) sera exécutée.

Voici un exemple avec les notes 1 à 6 dans la cellule A1 et un commentaire sur ces notes dans la cellule B1 :

Sub scores_comment()
    'Variables
    Dim note As Integer, score_comment As String
    
    note = Range("A1")
   
    'Commentaires basés sur la note reçue
    If note = 6 Then
        score_comment = "Super score !"
    ElseIf note = 5 Then
        score_comment = "Bon point"
    ElseIf note = 4 Then
        score_comment = "Note satisfaisante"
    ElseIf note = 3 Then
        score_comment = "Note insatisfaisante"
    ElseIf note = 2 Then
        score_comment = "Mauvais score"
    ElseIf note = 1 Then
        score_comment = "Un bilan épouvantable"
    Else
        score_comment = "Pointage zéro"
    End If
   
    'Commentaire dans la cellule B1
    Range("B1") = score_comment
End Sub

Cas Select

Il existe une alternative à l'utilisation de If avec de nombreuses instructions ElseIf, à savoir la commande Select Case, qui est plus adaptée à ce type de situation.

Prenons un exemple de macro avec l'opérateur Select Case :

Sub scores_comment()
    'Variables
    Dim note As Integer, score_comment As String
    
    note = Range("A1")
   
    'Commentaires basés sur la note reçue
    Select Case note    '=> résultat du test (points)
        Case Is = 6         '=> si valeur = 6
           score_comment = "Super score !"
        Case Is = 5         '=> si valeur = 5
           score_comment = "Bon point"
        Case Is = 4         '=> si valeur = 4
           score_comment = "Note satisfaisante"
        Case Is = 3         '=> si valeur = 3
           score_comment = "Note insatisfaisante"
        Case Is = 2         '=> si valeur = 2
           score_comment = "Mauvais score"
        Case Is = 1         '=> si valeur = 1
           score_comment = "Un bilan épouvantable"
        Case Else           '=> si la valeur n'est égale à aucune des valeurs ci-dessus
           score_comment = "Pointage zéro"
    End Select
   
    'Commentaire dans la cellule B1
    Range("B1") = score_comment
End Sub

Il est à noter que nous pourrions également utiliser d’autres opérateurs de comparaison :

Case Is >= 6         'si valeur >= 6

Exemples avec des significations différentes :

Case Is = 6, 7       'si valeur = 6 ou 7
Case Is <> 6, 7      'si la valeur n'est pas égale à 6 ou 7
Case 6 To 10         'si valeur = n'importe quel nombre de 6 à 10