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 IfPassons 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 SubNous 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 SubAjoutons é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 SubLes 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 SubPour 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 SubElseIf :
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 IfSi 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 SubNotez 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

