ATTENTION À IIF

MadM@tt Messages postés 2167 Date d'inscription mardi 11 novembre 2003 Statut Membre Dernière intervention 16 juillet 2009 - 14 sept. 2005 à 14:33
cs_Benouille Messages postés 215 Date d'inscription jeudi 24 octobre 2002 Statut Membre Dernière intervention 7 septembre 2007 - 21 sept. 2005 à 13:03
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/33789-attention-a-iif

cs_Benouille Messages postés 215 Date d'inscription jeudi 24 octobre 2002 Statut Membre Dernière intervention 7 septembre 2007
21 sept. 2005 à 13:03
:)

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
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
21 sept. 2005 à 12:42
_bit = iif (_boolean, 1, 0)
s'ecrit
_bit = Abs ( _boolean )
cs_Benouille Messages postés 215 Date d'inscription jeudi 24 octobre 2002 Statut Membre Dernière intervention 7 septembre 2007
21 sept. 2005 à 10:59
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.
cs_Patrice99 Messages postés 1221 Date d'inscription jeudi 23 août 2001 Statut Membre Dernière intervention 9 septembre 2018
20 sept. 2005 à 08:25
> 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")
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
20 sept. 2005 à 00:09
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
cs_tibzthebo Messages postés 3 Date d'inscription samedi 16 juillet 2005 Statut Membre Dernière intervention 19 septembre 2005
19 sept. 2005 à 23:06
Bonjour c'est mon premier message sur ce site!!
Comme ça fait 1semaine que j'essaye d'apprendre ce visual basic
tout ce que vous dites pour moi c'est du CHINOIS.
Et mon MSDN ne marche pas !!Que je galère !
Pour mon petit programme, j'ai beaucoup utilisé ces IF et déjà vue IIF mais jamais comprit alors un tout petit message TRES claire pour GROS débutant pour expliqué a quoi servent ces IIF,pourquoi,comment...
Et je vous remercie !!
JoePatent Messages postés 171 Date d'inscription jeudi 30 janvier 2003 Statut Membre Dernière intervention 20 juillet 2008
19 sept. 2005 à 20:37
Le probleme avec Excel et Access sont les division par zéro.

Comme tu ne connais pas a l'avance la valeur a traiter, si un zero se présente dans une division (les deux valeurs du IF seront évaluées) tu es cuit.

Il faut être prudent. Tous les logiciels que j'ai testés depuis quelques années spécialisés en optimisations de code pour le VB6 proscrivent l'usage de la commande IIF et genere des alerts.
cs_Patrice99 Messages postés 1221 Date d'inscription jeudi 23 août 2001 Statut Membre Dernière intervention 9 septembre 2018
18 sept. 2005 à 08:52
Il reste une dernière chose à dire au sujet de IIF : en programmation Access ou Excel, un IIF placé dans les champs calculés des contrôles ou des requêtes permet d'éviter d'écrire du code VBA proprement dit, car cette instruction n'occupe qu'une seule ligne de code, ce qui est tout de même assez pratique.
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
17 sept. 2005 à 22:19
Certes, sur la forme, un tuto serait plus adapté...

pour ton exemple de IIF, a voir la version la plus adaptée, avec
Format$(Nombre "00")
ScSami Messages postés 1488 Date d'inscription mercredi 5 février 2003 Statut Membre Dernière intervention 3 décembre 2007 24
17 sept. 2005 à 21:31
Ok Renfield, c'est bien de l'avoir prciser pour les newbies seulement voilà, la MSDN (l'aide du VB pour les précités ;-) le dit clairement!!! D'ailleurs, il n'y a pas que IIF mais également les fonctions Switch et Choose! Alors, pourquoi une source plutôt qu'un tuto sur les utilisations et précautions de ces fonctions si vitales ???
Ca nous aurait évité certaines remarques un peu lourdes comme celle de VBNul - entre autre. Je tiens d'ailleurs à préciser à VBNul que, comme le dit si bien une fable de part chez nous, les tortues arrivent souvent avant les lièvres... A méditer... Sinon je soutient "Zemetafyzik" dans sa judicieuse réponse.

Pour les "nuls", voici juste un petit exemple d'utilisation bien pratique que nous permet les IIF :
Rajout d'1 "0" devant les chiffres :
Nombre = 9
Me.? "J'ai " & IIF(Nombre<10,"0","") & CStr(Nombre)
>> "09"

Bref, ça permet de peaufiner les programmes bien trop souvent baclés! D'ailleurs, je tiens à préciser ici que la différence entre un dessin beau et un beau dessin ne tiens qu'à des détails (parole d'infographiste).

Bref, on veut un tuto ;D
cs_EBArtSoft Messages postés 4525 Date d'inscription dimanche 29 septembre 2002 Statut Modérateur Dernière intervention 22 avril 2019 9
16 sept. 2005 à 20:11
Ouaaaaaaaaai je sais j'ai realisé ma connerie quelque minutes apres mais on mettra ça sur le compte de la fatigue ;)
bouv Messages postés 1411 Date d'inscription mercredi 6 août 2003 Statut Membre Dernière intervention 3 mars 2019 1
16 sept. 2005 à 08:54
Renfield à malheuresement raison.
Si je fais
Toto = IIf2(True, MaFonction1, MaFonction2)
En mode Débogage on s'apperçoit que le code passe d'abord par
MaFonction1 et MaFonction2 avant d'entrer dans IIf2.
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
15 sept. 2005 à 23:25
je conteste EB, et ca doit bien être la première fois !

les fonctions seraient de la même façon évaluées : le problème reste entier
cs_EBArtSoft Messages postés 4525 Date d'inscription dimanche 29 septembre 2002 Statut Modérateur Dernière intervention 22 avril 2019 9
15 sept. 2005 à 22:51
Pour couper court au debat et pour satisfaire ceux qui utilise malgres tout la fonction suffit de la reprogrammer ainsi :

Function IIf2(a,b,c)
If a then
IIf2=b
else
IIf2=c
endif
End Function

C'est bien plus sain plus rapide !
@+
zemetafyzik Messages postés 117 Date d'inscription jeudi 17 juin 2004 Statut Membre Dernière intervention 3 novembre 2007 1
15 sept. 2005 à 19:04
attend, tu va me dire que "parceque tu connais le mot "eau" et le mot "etendu" que tu ne va pas apprendre le mot "lac" ?? (ben oui sa sert a rien on peut dire etendu d'eau ... !)

vu comme ça, arrete la programmation :)
Utilisateur anonyme
15 sept. 2005 à 15:39
Parler de rapidité pour du VB sur des if c'est parler de célérité pour une tortue :-p
Les IIF c'est encore un truc de plus à apprendre au niveau du language, alors qu'on s'en sort très bien avec les if.
bouv Messages postés 1411 Date d'inscription mercredi 6 août 2003 Statut Membre Dernière intervention 3 mars 2019 1
15 sept. 2005 à 09:54
Info interressante ! Merci
cs_Patrice99 Messages postés 1221 Date d'inscription jeudi 23 août 2001 Statut Membre Dernière intervention 9 septembre 2018
15 sept. 2005 à 08:36
En VB.Net AndAlso et OrAlso permettent justement de ne pas évaluer les prémisses inutiles.
cs_Nurgle Messages postés 1642 Date d'inscription samedi 6 novembre 2004 Statut Membre Dernière intervention 28 avril 2011 4
14 sept. 2005 à 22:16
merci aussi pour l'info.
mais il faut pas s'inquiéter, on ne va pas dénigrer IIF pour autant (comment dénigrer quelquechose qu'on utilise jamais :p ?)

Et de toute façon, on peut toujours remplacer IIF par un If normal (enfin presque, je crois que je ne connais qu'un seul exemple où le IIF est obligatoire), ça prend juste plus de place dans le code. Donc c'est au choix du programmeur...

en tout cas, voilà très bonne source...

Nurgle
BZY1 Messages postés 214 Date d'inscription jeudi 10 mars 2005 Statut Membre Dernière intervention 12 avril 2008
14 sept. 2005 à 21:03
merci pour l'info
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
14 sept. 2005 à 18:30
en effet, c'est "utile" ;)
mais les novices vont peut-être dénigrer le IIF qui peut parfois être très pratique (comme tu le dis, pour les "évaluations rapides")

d'où le fait d'avertir sans apeurer :-p
bonne initiative.

PCPT
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
14 sept. 2005 à 18:23
pour un exemple parlant !

J'ai écris cette "source" suite a un conseil lu dans une réponse sur le Forum, et qui conseillait l'utilisation de IIF, je suis pas franchement pour utiliser IIF, alors
plutot que de localiser ma réponse, j'ai preferé en faire profiter un maximum de personnes...
cs_EBArtSoft Messages postés 4525 Date d'inscription dimanche 29 septembre 2002 Statut Modérateur Dernière intervention 22 avril 2019 9
14 sept. 2005 à 18:04
Ouai enfin la ou c'est dangereu c'est s'il on donne en parametre des fonctions a risque ex:

IIF(a>b,killfile("c:\monfichier1"),killfile("c:\monfichier2"))

la... vous etes bon pour une suppression simple des deux fichiers
quelque soit les valeurs de a ou de b !!

Alors un conseil n'utilisé jamais IIF
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
14 sept. 2005 à 17:48
pour les valeurs en dur, je l'ai mentionné, cela ne aucun problème

je prefere 1 000 fois ce qui est fait là, comparé à ce que l'on vois souvent :
"14 ligne(s)" ces parenthèses me fichent la rage


A Noter que ce comportement, que l'on remarque avec IIF et Or est propre à VB...
la plupart des autres langages n'évaluent que le nécessaires, dans de tels cas
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
14 sept. 2005 à 17:43
salut,
désolé pour les adeptes des 35000 IF, mais le IIF a tout de même des avantages...

ok pour des requêtes, ou pour des retours de fonctions (presque évident, "Source Utile" tout de même), qui allongent énormément le temps de réponse pour rien!!
voici une ligne de code ou le IIF me semble largement convenir :

LBL_Tm.Caption = NbLignesM & " ligne" & IIf(NbLignesM > 1, "s", "")

conclusion : c'est comme tout, à utiliser avec modération :-p
PCPT
BasicInstinct Messages postés 1470 Date d'inscription mardi 5 février 2002 Statut Membre Dernière intervention 20 octobre 2014 12
14 sept. 2005 à 15:15
merci, 1000 fois merci.
Je comprenais pas pourquoi mon code etait si lent a utiliser...
Je viens d'economiser l'execution d'une requete avec 4 jointures.
MadM@tt Messages postés 2167 Date d'inscription mardi 11 novembre 2003 Statut Membre Dernière intervention 16 juillet 2009 1
14 sept. 2005 à 14:33
J'ai jamais utilisé les IIF, il parait qu'il sont plus lents, mais alors la ça donne encore moins envie de les utiliser...
T'a bien fait de nous le faire remarque ;)