If et Iif
La fonction VBA
Iif()
est une sorte de «If
express » (d’où son nom de « Immediate If« ) : elle peut gérer une condition Si/Alors/Sinon en une seule ligne, ce qui est souvent pratique. Mais elle ne remplace pas toujours un bon vieil «If
« , la preuve…
Rappel sur la fonction Iif
Pour ceux qui ne connaissent pas, la fonction Iif()
est à peu près l’équivalent de la fonction Si()
d’Excel. Elle a d’ailleurs déjà été traitée dans cet article du blog. Son intérêt est de pouvoir s’utiliser en VBA, mais aussi dans les couches graphiques d’Access, comme les requêtes, les formulaires et les états. Iif()
s’écrit comme ceci, si c’est en VBA :
1 2 |
Dim x As Integer x = Iif(3 + 2 > 1, 100, 200) |
Les trois parties du Iif()
étant :
- La condition (une comparaison, en général).
- La valeur à retenir si la condition est vérifiée (« valeur si vrai »)
- La valeur à retenir si la condition n’est pas vérifiée (« valeur si faux »)
Dans mon bête exemple, x
vaut toujours 100
, puisque la condition est toujours vérifiée !
C’est vrai que c’est plus court que d’écrire :
1 2 3 4 5 |
If 3 + 2 > 1 Then x = 100 Else x = 200 End If |
Petit piège
Le petit truc à savoir, c’est que les 2 expressions du Iif sont évaluées toutes les deux, quel que soit le résultat final (contrairement à d’autres langages). Ce qui peut produire quelques petits bugs, si on n’y fait pas attention. Voici un exemple :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
Sub TestIif1() Dim a As Integer Dim b As Integer Dim c As Double ' 2 valeurs... a = 10 b = 0 ' On calcule c... c = IIf(b <> 0, a / b, b / a) ' On affiche le résultat MsgBox c End Sub |
Pour faire court, on a voulu utiliser Iif()
. On pourrait penser que b
étant égal à 0
, c
va seulement prendre la valeur b / a
, soit 0
aussi. Perdu ! Comme les 2 parties sont évaluées systématiquement, VBA calcule a / b
et b /a
. Et la première échoue, en affichant ce message :
On pourrait aussi se dire que c’est une question d’ordre. Du genre, on remplace le Iif()
par son inverse :
1 |
c = IIf(b = 0, b / a, a / b) |
Oui… mais non : les 2 valeurs sont toujours évaluées. Même message d’erreur !
La bonne version
La bonne approche consiste à revenir à ce bon vieil If
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
Sub TestIif2() Dim a As Integer Dim b As Integer Dim c As Double ' 2 valeurs... a = 10 b = 0 ' On calcule c... If b <> 0 Then c = a / b Else c = b / a End If ' On affiche le résultat MsgBox c End Sub |
If b <> 0 Then c = a / b Else c = b / a
Ça marche effectivement, mais ça ne fait pas du code facile à « maintenir » et à faire évoluer. J’éviterais…