XL 2010 IsMissing or Not IsMissing

Magic_Doctor

XLDnaute Barbatruc
Bonjour,

J'avoue que ce "IsMissing" me déconcerte.
J'ai une fonction de ce type :
VB:
Function VivaLaTiaChola(x As Double, Optional a, Optional b)

     VivaLaTiaChola = IIf(IsMissing(b), "VRAI", "FAUX")

End Function
supposons maintenent que la valeur x se trouve en B15 :
si j'écris dans une cellule VivaLaTiaChola(B15) ou VivaLaTiaChola(B15;;10), j'obtiens toujours "FAUX".
Je me demande bien pourquoi.
 

Dudu2

XLDnaute Barbatruc
Bonjour,
IsMissing() ne fonctionne que pour le type Variant. Dans le cas de la fonction VivaLaTiaChola(), la déclaration des paramètres a et b n'étant pas typée sont par défaut de type Variant et donc IsMissing() peut être utilisé pour détecter la présence des arguments a et b.
 

Magic_Doctor

XLDnaute Barbatruc
Bonjour et merci pour vos réponses,

patricktoulon, j'ai rédigé ça à la va-très-vite, uniquement pour exposer le problème que j'ai avec ce IsMissing. Bien sûr que cette fonction "à l'arrache" n'a strictement aucun intérêt en elle-même.
Je pense avoir trouvé l'origine du problème dans vos réponses. Je suis sur Excel 2007 ! :eek:
J'avais conservé cette version en raison de problèmes avec des APIs qui se trouvent dans certains documents. les codes changent quand on passe aux versions ultérieures.
Je sais, je dois changer de version d'Excel et corriger les APIs !
Mais, vous savez, la flemme australe...
 
Dernière édition:

Magic_Doctor

XLDnaute Barbatruc
Bonjour mapomme,

Ma foi, peut-être il y a-t-il un problème avec ma version uruguayenne d'Excel 2007...
Si ça ne vous dérange pas, faites un test chez vous avec cette fonction (évoquée dans un autre fil) qui me posait souci :
VB:
Function ChiffresAfterVirgule(dNum As Double, Optional Opt As Boolean = True, Optional NbEnt As Long)

'Renvoie le nombre de chiffres après la virgule ou tous les chiffres après la virgule
'- dNum : le chiffre à traiter
'- opt : si opt = True ou omis (opt est True par défaut) --> l'INTÉGRALITÉ des chiffres après la virgule (par ex : 574225 ou 000086574)
'        si opt = False --> le nombre de chiffres après la virgule
'- NbEnt : un nombre entier qui, dans le résultat de la fonction, sera suivi d'une virgule puis des décimaux après la virgule de la variable "dNum"
'Ex : 125,587349 | opt = True (ou omis) --> 587349
'                  opt = False --> 6
'     si dNum = 2045,0657 et NbEnt = 5 --> 5,0657

Dim SepDec$, tmp$, posDec As Long, nb As Long, cap$

  SepDec = Application.International(xlDecimalSeparator)
  tmp = CStr(dNum)
  posDec = InStr(tmp, SepDec)
  nb = IIf(posDec = 0, 0, Len(tmp) - Len(Right(tmp, posDec))) 'nombre de chiffres après la virgule
  cap = Right(dNum, nb) 'chiffres après la virgule
  
'************************************************************   LES 2 FONCTIONNENT, MAIS CHAQUE FOIS AVEC 1 ERREUR   ************************************************************

  cap = IIf(Not IsMissing(NbEnt), NbEnt & "," & cap, cap) 'chiffres après virgule : Pas OK | nb de chiffres après virgule : OK | chiffre composé : OK
  
  'cap = IIf(IsMissing(NbEnt) = False, cap, NbEnt & "," & cap) 'chiffres après virgule : OK | nb de chiffres après virgule : OK | chiffre composé : Pas OK
  
'*********************************************************************************************************************************************************************************
  
'***********************************************   CROYANT BIEN FAIRE, J'AI ÉCRIT ÇA   ***********************************************
  
  'ChiffresAfterVirgule = IIf(IsMissing(NbEnt), IIf(Opt, cap, nb), cap)  'marche mal et pourtant ça a l'air de tenir la route...

  ChiffresAfterVirgule = IIf(Not IsMissing(NbEnt), IIf(Opt, cap, nb), cap)  'marche mieux, mais pourquoi ????

'*************************************************************************************************************************************
  
End Function
 

eriiic

XLDnaute Barbatruc
Pense toujours à consulter l'aide :

Utilisez la fonction IsMissing pour déterminer si des arguments facultatifs de type Variant ont été fournis lors de l’appel d’une procédure. La fonction IsMissing retourne la valeur True si aucune valeur correspondant à l’argument spécifié n’a été passée ; sinon, elle retourne la valeur False.

Si la fonction IsMissing retourne la valeur True pour un argument, l’utilisation de l’argument manquant ailleurs dans le code peut provoquer une erreur définie par l’utilisateur.

Si la fonction IsMissing est utilisée sur un argument ParamArray, elle retourne toujours la valeur False. Pour détecter un argument ParamArray vide, effectuez un test afin de déterminer si la limite maximale du tableau est inférieure à sa limite minimale.

La fonction IsMissing ne fonctionne pas sur les types de données simples (tels que les types Integer ou Double), car, contrairement au type Variant, ces types ne fournissent pas d’indicateur de bit « manquant ». C’est pourquoi la syntaxe des arguments facultatifs caractérisés par un type vous permet d’indiquer une valeur par défaut.

Refait tes tests avec des variants pour voir.
eric
 

Magic_Doctor

XLDnaute Barbatruc
Bonjour Eriiiic,

J'ai bien compris que la fonction IsMissing manquait de souplesse pour traiter des arguments optionnels qui ne soient pas déclarés comme Variant. Ça limite sérieusement les possibilités de cette fonction et du traitement de nombre d'arguments optionnels.
 

eriiic

XLDnaute Barbatruc
Bonjour patrick, pas la 2nde optionnelle ;)

Rien ne t'empêche de tester ensuite ce que tu as reçu.
Ex :
VB:
Sub test()
    Dim a
    a = test2([A1], 5)
End Sub

Function test2(c As Range, Optional b)
    test2 = VarType(b)
End Function
Là tu récupère 2 qui correspond à vbInteger.
Regarder l'aide de VarType pour avoir la liste des constantes renvoyées.
eric
 

Discussions similaires

Réponses
19
Affichages
2 K