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