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.
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 |
NOT | NOT [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
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
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