À la version de base ci-dessus qui ne permet que 2 alternatives, s'ajoutent
les variations suivantes:
If expression Then instructions
Où
Expression |
Une expression VBA qui est
évaluée à Vrai, Faux ou Null. |
Instructions |
Une ou plusieurs instructions VBA
séparées par des : qui seront exécutées si expression vaut
Vrai |
Il est fortement recommandé de ne JAMAIS utiliser cette
forme de IF qui n'ajoute rien et rend le programme plus difficile
à comprendre et plus difficile à modifier. Utilisez plutôt: If expression Then
[instructions]
End If |
If expression Then
[instructions]
[ElseIF
[instructions]]
[ElseIF
[instructions]]
...
[Else
[instructions]]
End If
Où
Expression |
Une expression VBA qui est
évaluée à Vrai ou Faux. Si expression vaut Null, elle est
considéré comme Faux. |
Instructions |
Une ou plusieurs instructions VBA |
Chaque série d'instructions est exécutée si l'expression précédente vaut Vrai, sauf celle qui suit le Else, qui est
exécutée quand aucune des précédentes n'est Vraie. Cette variante du If est recommandée si votre programme
doit tester plus d'une valeur d'une expression. |
Select Case expression
[Case liste/expression
[instructions]] ...
[Case Else
[instructions]]
End Select
Où
-
expression expression VBA
-
liste/expression Liste de valeur(s) possibles(s) pour expression ou expresseion VBA.
-
instructions Une ou plusieurs instructions VBA
Cette instruction VBA joue le même rôle que le IF... ELSEIF ... ENDIF précédent, mais est plus difficile à coder et
à comprendre.
À éviter. |
Autres fonctions de test à ne jamais utiliser:
Dim rRéponse
rRéponse = Switch(expression1,valeur1[, expression2,
valeur2, expression3, valeur3, expression4, valeur4… [, expressionN,
valeurN]])
Qui correspond à:
Dim rRéponse
If expression1 THEN
rRéponse = valeur1
ELSEIF expression3 THEN
rRéponse = valeur2
…
ELSE
rRéponse = Null
ENDIF |
Dim rRéponse
rRéponse = Choose(expression, valeur1[, valeur2, ... [, valeurN]])
Qui correspond à:
Dim rRéponse
If expression=1 THEN
rRéponse = valeur1
ELSEIF expression=2 THEN
rRéponse = valeur2 ...
ELSE
rRéponse = Null
ENDIF |
En VBA, il est convenu de présenter en retrait les instructions à l'intérieur
d'un bloc de test.
VBA hérite des anciennes versions de Basic une instruction de branchement, qui
modifie la séquence d'exécution
en effectuant un branchement vers une
ligne identifiée par une étiquette.
La syntaxe de l'étiquette est:
nom:
Où nom respecte la syntaxe d'une variable VBA, et doit être suivi de :
L'instruction GoTo étiquettepeut être utilisée n'importe où à l'intérieur de la procédure (pas du
module!) pour indiquer que la suite
du traitement se trouve aux lignes suivant
l'étiquette.
L'utilisation de GoTo n'est vraiment acceptable qu'à l'intérieur d'une
instruction On Error.
Dans d'autres circonstances, elle rend la logique du programme difficile à
comprendre, donc à modifier.
VBA offre plusieurs séries de fonctions utiles pour valider la nature des
données et des variables.
IsNumeric(expression) |
Vrai si expression peut être évaluée comme une valeur numérique |
IsDate(expression) |
Vrai si expression peut être évaluée comme une date ou une heure |
|
IsNull(expression) |
Vrai si expression ne contient aucune variable de valeur Null.
Attention:
expression = Null
expression <> Null
sont TOUJOURS faux. Utilisez IsNull(Variable). |
IsNothing(variable) |
Vrai si variableobjet est un objet non initialisé (SET). |
IsEmpty(expression) |
Vrai si expression est de type Variant et n'est pas
initialisée. |
IsMissing(paramètre) |
paramètre doit être le nom d'un paramètre facultatif de la
procédure en cours.
Faux si une valeur a été passée dans paramètre. |
TypeName(variable) |
Retourne le nom du type de variable, exemples:
|
VarType(variable) |
Retourne une entier indiquant le type de variable.
Beaucoup moins intéressant que TypeName(). |
Exemple 1: Tester si une cellule Excel nommée "Nombre"
contient un nombre.
Sub sExempleTest1()
'Auteur: Michel Berthiaume
'Vérifier si la cellule "Nombre" contient un nombre
If IsNumeric(Range("Nombre").Value) Then
MsgBox "La valeur est numérique"
End If
End Sub |
Bien qu'intéressant, ce code n'est pas très fonctionnel.
Il affiche un message lorsque la cellule contient une valeur numérique (ou
nulle),
mais ce qu'on veut probablement, c'est interrompre la suite de la procédure
lorsque la valeur n'est pas numérique.
Sub sExempleTest2()
'Auteur: Michel Berthiaume
'Vérifier si la cellule "Nombre" contient un nombre
If Not IsNumeric(Range("Nombre").Value) Then
MsgBox"La valeur n'est pas
numérique"
Exit Sub
End If
End Sub |
Exemple 2: Programmer une fonction qui retourne le nom d'une province, à partir
d'un sigle.
Function fnNomProvince1(SigleProvince)
'Auteur: Michel Berthiaume
'Retourner le nom d'une province
Dim sSigleProvince As String
'D'abord tester la validité du paramètre
If TypeName(SigleProvince) = "Range" Then
sSigleProvince = UCase(SigleProvince.Value)
Else
If TypeName(SigleProvince) = "String" Then
sSigleProvince = UCase(SigleProvince)
Else
fnNomProvince1 = "sigle inconnu"
Exit Function
End If
End If
'Rendu ici, sSigleProvince contient une version en majuscules
du sigle
If sSigleProvince = "AB" Then
fnNomProvince1 = "Alberta"
Else
If sSigleProvince = "BC" Then
fnNomProvince1 = "Colombie Britannique"
Else
If
sSigleProvince = "PE" Then
fnNomProvince1 = "Île-du-Prince-Édouard"
Else
If sSigleProvince = "NS" Then
fnNomProvince1 = "Nouvelle-Écosse"
Else
If sSigleProvince = "NU" Then
fnNomProvince1 = "Nunavut"
Else
If sSigleProvince = "ON" Then
fnNomProvince1 = "Ontario"
Else
If sSigleProvince = "QC" Then
fnNomProvince1 = "Québec"
Else
If sSigleProvince = "SK" Then
fnNomProvince1 = "Saskatchewan"
Else
If sSigleProvince = "NF" Then
fnNomProvince1 = "Québec"
Else
If sSigleProvince = "NT" Then
fnNomProvince1 = "Territoires du Nord-Ouest"
Else
If sSigleProvince = "YK" Then
fnNomProvince1 = "Yukon"
Else
fnNomProvince1 = "Sigle inconnu"
End If
End If
End If
End If
End If
End If
End If
End If
End If
End If
End If
End Function
|
Bien que fonctionnel, le code ci-dessus est lourd et répétitif.
Voici une version allégée:
Function fnNomProvince2(SigleProvince)
'Auteur: Michel Berthiaume
'Retourner le nom d'une province
Dim sSigleProvince As String
'D'abord tester la validité du paramètre
If TypeName(SigleProvince) = "Range" Then
sSigleProvince = UCase(SigleProvince.Value)
ElseIf TypeName(SigleProvince) = "String" Then
sSigleProvince = UCase(SigleProvince)
Else
fnNomProvince2 = "sigle inconnu"
Exit Function
End If
'Rendu ici, sSigleProvince contient une version en majuscules
du sigle
If sSigleProvince = "AB" Then
fnNomProvince2 = "Alberta"
ElseIf sSigleProvince = "BC" Then
fnNomProvince2 = "Colombie
Britannique"
ElseIf sSigleProvince = "PE" Then
fnNomProvince2 =
"Île-du-Prince-Édouard"
ElseIf sSigleProvince = "NS" Then
fnNomProvince2 = "Nouvelle-Écosse"
ElseIf sSigleProvince = "NU" Then
fnNomProvince2 = "Nunavut"
ElseIf sSigleProvince = "ON" Then
fnNomProvince2 = "Ontario"
ElseIf sSigleProvince = "QC" Then
fnNomProvince2 = "Québec"
ElseIf sSigleProvince = "SK" Then
fnNomProvince2 = "Saskatchewan"
ElseIf sSigleProvince = "NF" Then
fnNomProvince2 = "Québec"
ElseIf sSigleProvince = "NT" Then
fnNomProvince2 = "Territoires du
Nord-Ouest"
ElseIf sSigleProvince = "YK" Then
fnNomProvince2 = "Yukon"
Else
fnNomProvince2 = "Sigle inconnu"
End If
End Function |
Il est aussi possible d'utiliser l'Instruction SELECT, mais elle n'offre pas
d'avantage important sur la version précédente:
Function fnNomProvince3(SigleProvince)
'Auteur: Michel Berthiaume
'Retourner le nom d'une province
Dim sSigleProvince As String
'D'abord tester la validité du paramètre
If TypeName(SigleProvince) = "Range" Then
sSigleProvince = UCase(SigleProvince.Value)
ElseIf TypeName(SigleProvince) = "String" Then
sSigleProvince = UCase(SigleProvince)
Else
fnNomProvince3 = "sigle inconnu"
Exit Function
End If
'Rendu ici, sSigleProvince contient une version en majuscules
du sigle
Select Case sSigleProvince
Case "AB"
fnNomProvince3 = "Alberta"
Case "BC"
fnNomProvince3 = "Colombie Britannique"
Case "PE"
fnNomProvince3 = "Île-du-Prince-Édouard"
Case "NS"
fnNomProvince3 = "Nouvelle-Écosse"
Case "NU"
fnNomProvince3 = "Nunavut"
Case "ON"
fnNomProvince3 = "Ontario"
Case "QC"
fnNomProvince3 = "Québec"
Case "SK"
fnNomProvince3 = "Saskatchewan"
Case "NF"
fnNomProvince3 = "Québec"
Case "NT"
fnNomProvince3 = "Territoires du Nord-Ouest"
Case "YK"
fnNomProvince3 = "Yukon"
Case Else
fnNomProvince3 = "Sigle inconnu"
End Select
End Function |
|