Attention à iif

Soyez le premier à donner votre avis sur cette source.

Snippet vu 16 802 fois - Téléchargée 29 fois

Contenu du snippet

Ce code n'en est as vraiment un,
il s'agit plus d'une mise en garde...

IIF est pratique, "sexy" et tout ce que vous voudrez... Il permet de condenser, voire clarifier le code.

mais faites attention quand vous l'utilisez :

quel que soit le résultat de la condition, les deux parties succeptibles d'etre renvoyées sont évaluées
rien de bien grave si vous utilisez des valeurs en dur, ou au pire, des variables; mais cela peut devenir franchement génant si vous utilisez des Function ou des propriétés en guise de valeurs de retour.

En effet, coté Perfs, on peux très bien se passer de l'execution de cycles inutiles, juste pour économiser un Else et un End If ....

Pour vous convaincre, ce simple code suffit....

Source / Exemple :


Private Sub Form_Load()
Dim a As Long
    a = IIf(True, RightCase, WrongCase)
End Sub

Public Property Get RightCase() As Long
    '# L'execution évalue la partie 'True', riend d'anormal...
    Stop
End Property

Public Property Get WrongCase() As Long
    '# L'execution ne devrais pas passer ici....
    Stop
End Property

Conclusion :


Favorisez donc ici :

If True Then
a = RightCase
Else
a = WrongCase
End If

A Noter que ce comportement d'évaluation est également présent dans les If :

If True Or WrongCase Then

Favorisez ici

If True Then
If WrongCase Then
...

Bien sur, on ne fait pas If True Then .... True est là pris à titre d'exemple.
Cette mise en garde ne s'applique de plus pas aux constantes, variables, et autres évaluations rapides...

A voir également

Ajouter un commentaire

Commentaires

Messages postés
216
Date d'inscription
jeudi 24 octobre 2002
Statut
Membre
Dernière intervention
7 septembre 2007
1
:)

c'est juste un exemple simple fait pour être clair; remplace mon bit (meme si je m'ysuis habitué) par quelque chose de plus grand (sinon c'est pas la peine) et les affectations 0 & 1 par MaMeuf(oui) & SerialLooser.Name si tu préfères ;)


VBnouille, tirage de nouille
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
62
_bit = iif (_boolean, 1, 0)
s'ecrit
_bit = Abs ( _boolean )
Messages postés
216
Date d'inscription
jeudi 24 octobre 2002
Statut
Membre
Dernière intervention
7 septembre 2007
1
Nz c'est comme coalesce en sql? c'est con j'ai encore réinventé la roue moi ...

moi j'aime bien les iif, c'est parlant dans le code et souvent je le prefere.
entre if _boolean then _bit=1 else _bit=0
et _bit = iif (_boolean, 1, 0) mon choix est vite fait.

le seul probleme que j'ai rencontré, outre les appels de fonctions comme ça a été dit, c'est la gestion des valeurs nulles, ou des casts sujets a plantage.

genre :
= iif (isnumeric (_var), cint(_var), empty)

si la variable _var n'est pas numérique, le cint va lever une exeption et la il faut utiliser le if.


a part ça je trouve l'utilisation du iif tres bien, voire je le préfère pour la lisibilité du code.
Messages postés
1222
Date d'inscription
jeudi 23 août 2001
Statut
Membre
Dernière intervention
9 septembre 2018

> Le probleme avec Excel et Access sont les division par zéro.

Il existe tout une flopée de fonction pour traiter les IsNull, Nz (Non-zéro), IsNumeric, Is... avec leur correspondant en français : EstNum, ...
Certains ne marchent qu'avec Access comme Nz (à ma connaissance) : cf. la doc Access :

La fonction Nz peut souvent remplacer une fonction IIf. Par exemple, dans le code suivant, il faut deux expressions incluant la fonction IIf pour retourner le résultat souhaité. La première expression qui contient la fonction IIf sert à contrôler la valeur d'une variable et à la convertir en zéro si elle est Null.

varTemp = IIf(IsNull(varFreight), 0, varFreight)
varResult = IIf(varTemp > 50, "High", "Low")

Dans l'exemple suivant, la fonction Nz procure la même fonctionnalité que la première expression et le résultat souhaité est atteint en une instruction au lieu de deux.

varResult = IIf(Nz(varFreight) > 50, "High", "Low")
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
35
salut



---------------------------
IF->
SI (condition vrai) ALORS
variable REçOIT "oui"
SINON
variable REçOIT "non"
FIN

---------------------------
IIF->
variable REçOIT SI((condition vrai) ALORS "oui" SINON "non")

---------------------------


et le "débat" porte sur le fait que si le résultat à attribuer nécessite lui-même un calcul trop long, les conséquences peuvent aller de l'erreur jusqu'à ....
(no limit :-p)
PCPT
Afficher les 27 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.