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 :
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
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
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
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 à |
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 |
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 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
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
Case Is >= 6 'si la valeur >= 6
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
Condition en fonction d'un type
IsNumeric (fonction vue à la page précédente) renvoie TRUE (vrai) si la valeur est numérique et FALSE (faux) si ce n'est pas le cas :If IsNumeric(Range("A1")) = True Then 'SI LA VALEUR EST NUMERIQUE ...
If IsNumeric(Range("A1")) Then 'SI LA VALEUR EST NUMERIQUE ...
If IsNumeric(Range("A1")) = False Then 'SI LA VALEUR N'EST PAS NUMERIQUE ...
If Not IsNumeric(Range("A1")) Then 'SI LA VALEUR N'EST PAS NUMERIQUE ...
If IsDate(Range("A1")) Then 'SI LA VALEUR EST UNE DATE ...
If IsEmpty(Range("A1")) Then 'SI VIDE ...
If var_objet Is Nothing Then 'SI OBJET NON INITIALISE ...
Condition en fonction du type d'une variable
Pour effectuer des actions en fonction du type d'une variable (Variant), nous aurons besoin de la fonction VarType.Après avoir ajouté le signe =, la liste des types apparaît :
If VarType(ma_variable) = vbInteger Then 'SI ma_variable est de type Integer ...
Constante | Valeur |
vbEmpty | 0 |
vbNull | 1 |
vbInteger | 2 |
vbLong | 3 |
vbSingle | 4 |
vbDouble | 5 |
vbCurrency | 6 |
vbDate | 7 |
vbString | 8 |
vbObject | 9 |
vbError | 10 |
If VarType(ma_variable) = vbInteger Then 'SI ma_variable est de type Integer ...
'Identique à :
If VarType(ma_variable) = 2 Then 'SI ma_variable est de type Integer ...
Condition en fonction de la comparaison de 2 chaînes de caractères
Jusque-là nous n'avons vu que cela :ma_variable = "Exemple 12345"
If ma_variable = "Exemple 12345" Then ' => VRAI
Maintenant, si nous voulons vérifier que la variable contienne bien la valeur "12345" sans tenir compte des autres caractères, nous utiliserons l'opérateur Like ainsi que * devant et derrière la valeur à rechercher.
Le caractère * peut remplacer : aucun, un ou plusieurs caractères :
ma_variable = "Exemple 12345"
If ma_variable Like "*12345*" Then ' => VRAI
ma_variable = "Exemple 12345"
If ma_variable Like "Exemple 12###" Then ' => VRAI
ma_variable = "Exemple 12345"
If ma_variable Like "?xemple?1234?" Then ' => VRAI
- [abc] remplace un des caractères suivants : a b c
- [a-g] remplace un des caractères suivants : a b c d e f g
- [369] remplace un des caractères suivants : 3 6 9
- [2-5] remplace un des caractères suivants : 2 3 4 5
- [?*#] remplace un des caractères suivants : ? * #
ma_variable = "Exemple 12345"
If ma_variable Like "[BIEN]xemple 1234[4-7]" Then ' => VRAI
ma_variable = "Exemple 12345"
If ma_variable Like "[!FAUX]xemple 1234[!6-9]" Then ' => VRAI
Remarque : un caractère en majuscule n'est
pas égal à ce même caractère en minuscule. Pour ne pas faire de
distinctions entre majuscules-minuscules, placez Option Compare Text en début de module.
Aucun commentaire:
Enregistrer un commentaire