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


Exercice

A l'aide du fichier suivant, réaliser une macro qui affiche en rouge les cellules dont le temps d'arrêt dépasse 10h

Retour au sommaire