cs_Benouille
Messages postés215Date d'inscriptionjeudi 24 octobre 2002StatutMembreDerniè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és17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 21 sept. 2005 à 12:42
cs_Benouille
Messages postés215Date d'inscriptionjeudi 24 octobre 2002StatutMembreDerniè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.
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és1221Date d'inscriptionjeudi 23 août 2001StatutMembreDerniè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.
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.
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 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és3Date d'inscriptionsamedi 16 juillet 2005StatutMembreDernière intervention19 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és171Date d'inscriptionjeudi 30 janvier 2003StatutMembreDernière intervention20 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és1221Date d'inscriptionjeudi 23 août 2001StatutMembreDerniè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és17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 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és1488Date d'inscriptionmercredi 5 février 2003StatutMembreDernière intervention 3 décembre 200724 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és4525Date d'inscriptiondimanche 29 septembre 2002StatutModérateurDernière intervention22 avril 20199 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és1411Date d'inscriptionmercredi 6 août 2003StatutMembreDernière intervention 3 mars 20191 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és17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 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és4525Date d'inscriptiondimanche 29 septembre 2002StatutModérateurDernière intervention22 avril 20199 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és117Date d'inscriptionjeudi 17 juin 2004StatutMembreDernière intervention 3 novembre 20071 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 ... !)
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és1411Date d'inscriptionmercredi 6 août 2003StatutMembreDernière intervention 3 mars 20191 15 sept. 2005 à 09:54
Info interressante ! Merci
cs_Patrice99
Messages postés1221Date d'inscriptionjeudi 23 août 2001StatutMembreDerniè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és1642Date d'inscriptionsamedi 6 novembre 2004StatutMembreDernière intervention28 avril 20114 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és214Date d'inscriptionjeudi 10 mars 2005StatutMembreDernière intervention12 avril 2008 14 sept. 2005 à 21:03
merci pour l'info
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 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és17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 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és4525Date d'inscriptiondimanche 29 septembre 2002StatutModérateurDernière intervention22 avril 20199 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:
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és17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 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és13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 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 :
conclusion : c'est comme tout, à utiliser avec modération :-p
PCPT
BasicInstinct
Messages postés1470Date d'inscriptionmardi 5 février 2002StatutMembreDernière intervention20 octobre 201412 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és2167Date d'inscriptionmardi 11 novembre 2003StatutMembreDernière intervention16 juillet 20091 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 ;)
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
21 sept. 2005 à 12:42
s'ecrit
_bit = Abs ( _boolean )
21 sept. 2005 à 10:59
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.
20 sept. 2005 à 08:25
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")
20 sept. 2005 à 00:09
---------------------------
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
19 sept. 2005 à 23:06
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 !!
19 sept. 2005 à 20:37
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.
18 sept. 2005 à 08:52
17 sept. 2005 à 22:19
pour ton exemple de IIF, a voir la version la plus adaptée, avec
Format$(Nombre "00")
17 sept. 2005 à 21:31
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
16 sept. 2005 à 20:11
16 sept. 2005 à 08:54
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.
15 sept. 2005 à 23:25
les fonctions seraient de la même façon évaluées : le problème reste entier
15 sept. 2005 à 22:51
Function IIf2(a,b,c)
If a then
IIf2=b
else
IIf2=c
endif
End Function
C'est bien plus sain plus rapide !
@+
15 sept. 2005 à 19:04
vu comme ça, arrete la programmation :)
15 sept. 2005 à 15:39
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.
15 sept. 2005 à 09:54
15 sept. 2005 à 08:36
14 sept. 2005 à 22:16
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
14 sept. 2005 à 21:03
14 sept. 2005 à 18:30
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
14 sept. 2005 à 18:23
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...
14 sept. 2005 à 18:04
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
14 sept. 2005 à 17:48
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
14 sept. 2005 à 17:43
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
14 sept. 2005 à 15:15
Je comprenais pas pourquoi mon code etait si lent a utiliser...
Je viens d'economiser l'execution d'une requete avec 4 jointures.
14 sept. 2005 à 14:33
T'a bien fait de nous le faire remarque ;)