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] |
OR |
ou |
[condition1] OR [condition2] |
NOT |
faux |
NOT [condition1] |
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 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
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
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