Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

ATTENTION À IIF


Information sur la source

Catégorie :Optimisation du code Classé sous : attention, iif, évaluer Niveau : Débutant Date de création : 14/09/2005 Vu : 10 338

Note :
8,67 / 10 - par 3 personnes
8,67 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (27)
Ajouter un commentaire et/ou une note


Description

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

  • 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
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...

 

Commentaires et avis

signaler à un administrateur
Commentaire de MadM@tt le 14/09/2005 14:33:58

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 ;)

signaler à un administrateur
Commentaire de BasicInstinct le 14/09/2005 15:15:36

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.

signaler à un administrateur
Commentaire de PCPT le 14/09/2005 17:43:30 administrateur CS

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

signaler à un administrateur
Commentaire de Renfield le 14/09/2005 17:48:37 administrateur CS

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

signaler à un administrateur
Commentaire de EBArtSoft le 14/09/2005 18:04:55 administrateur CS

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

signaler à un administrateur
Commentaire de Renfield le 14/09/2005 18:23:37 administrateur CS

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...

signaler à un administrateur
Commentaire de PCPT le 14/09/2005 18:30:50 administrateur CS

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

signaler à un administrateur
Commentaire de BZY1 le 14/09/2005 21:03:57

merci pour l'info

signaler à un administrateur
Commentaire de Nurgle le 14/09/2005 22:16:51 administrateur CS

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

signaler à un administrateur
Commentaire de Patrice99 le 15/09/2005 08:36:08

En VB.Net AndAlso et OrAlso permettent justement de ne pas évaluer les prémisses inutiles.

signaler à un administrateur
Commentaire de bouv le 15/09/2005 09:54:49

Info interressante ! Merci

signaler à un administrateur
Commentaire de vbnul le 15/09/2005 15:39:20

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.

signaler à un administrateur
Commentaire de zemetafyzik le 15/09/2005 19:04:36

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 :)

signaler à un administrateur
Commentaire de EBArtSoft le 15/09/2005 22:51:23 administrateur CS

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 !
@+

signaler à un administrateur
Commentaire de Renfield le 15/09/2005 23:25:21 administrateur CS

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

signaler à un administrateur
Commentaire de bouv le 16/09/2005 08:54:43

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.

signaler à un administrateur
Commentaire de EBArtSoft le 16/09/2005 20:11:00 administrateur CS

Ouaaaaaaaaai je sais j'ai realisé ma connerie quelque minutes apres mais on mettra ça sur le compte de la fatigue ;)

signaler à un administrateur
Commentaire de ScSami le 17/09/2005 21:31:13

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

signaler à un administrateur
Commentaire de Renfield le 17/09/2005 22:19:11 administrateur CS

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")

signaler à un administrateur
Commentaire de Patrice99 le 18/09/2005 08:52:40

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.

signaler à un administrateur
Commentaire de JoePatent le 19/09/2005 20:37:18

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.

signaler à un administrateur
Commentaire de tibzthebo le 19/09/2005 23:06:22

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 !!

signaler à un administrateur
Commentaire de PCPT le 20/09/2005 00:09:21 administrateur CS

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

signaler à un administrateur
Commentaire de Patrice99 le 20/09/2005 08:25:38

> 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")

signaler à un administrateur
Commentaire de Benouille le 21/09/2005 10:59:39

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.

signaler à un administrateur
Commentaire de Renfield le 21/09/2005 12:42:43 administrateur CS

_bit = iif (_boolean, 1, 0)
s'ecrit
_bit = Abs ( _boolean )

signaler à un administrateur
Commentaire de Benouille le 21/09/2005 13:03:42

:)

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

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

formules dans vb6 [ par AIYAR ] Dans mon programme vb6, je veux lire des formules à partir d'une base de données et les évaluer.Par exemple :dim a, b as integer;a = 2b = 5si je lis u évaluer une variable globale d'un xla [ par florantanplan ] Je cherche à remonter, depuis un projet vba, la valeur d'une variable globale d'un autre projet vba ouvert simultanément. En fait je voudrais un équiv [vb.net] aide svp... fonction IIF [ par pleymo21 ] bonjour jai cette ligne de commande qui affiche dans un datagrid : Code: <T Code laid [ par XGuarden ] Voici le code d'une propriété , je suis bien curieu de savoir s'il exite des "truc" pour faire mieu.#Region "Propriété infodroits()          "    ' Ap Gérer le runtime error 339 [ par zen69 ] Bonjour à tous.Voilà comme beaucoup de gens, je reçoit un runtime error 339 lors de l'éxécution de mon appli sur certain poste. Je sais qu'il y a déjà Access Erreur 3075 "wrong number of argument in query" iif, sum [ par creess ] Bonjour,J'ai un probleme avec cette ligne passe en field dans une query Access lorsque je run la query:<span style="FONT-SIZE: 12pt; FONT-FAMILY: 'Tim Vente de mon code souce comment évaluer ça valeur? [ par robpic ] J'ai une application pour la gestion de charpente (Toiture, murs, poutrelles)-Soumission-Commande-Cédule de production-Gestion à l'usine-Gestion de li


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Comparez les prix Nouvelle version


LG KP501

Entre 9€ et 159€


Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,484 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.