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 :

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 :

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 :

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 :

CAPT

On pourrait aussi se dire que c’est une question d’ordre. Du genre, on remplace le Iif() par son inverse :

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 :

Remarque
Certains écriraient même, sur une seule ligne :
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…

Vous aimerez aussi...

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *