begin process at 2008 07 04 00:51:14
1 204 456 membres
3 nouveaux aujourd'hui
14 114 membres club

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 : 8 900

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

Pub



Appels d'offres

CalendriCode

Juillet 2008
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Téléchargements

Logiciels à télécharger sur le même thème :

Boutique

Boutique de goodies CodeS-SourceS