XL 2010 Convertir une variable dans une fonction

Magic_Doctor

XLDnaute Barbatruc
Bonjour,

J'ai bricolé une fonction toute simple qui marche bien. Elle me renvoie soit le nombre de décimales après la virgule du chiffre traité, soit l'ensemble des chiffres après la virgule.
Si je rentre dans la fonction, par exemple, 25,000587, j'obtiens bien 000587 sous forme de chaîne (qui apparaîtra, bien évidemment, à gauche de la cellule du résultat.
Maintenant, si je rentre dans la fonction 125,298, j'obtiens bien 298, mais toujours sous forme de chaîne, et je voudrais, à ce moment là, que ce soit un chiffre (qui devrait apparaître à droite de la cellule du résultat).
J'ai essayé, sans succès, par différents moyens de régler ce problème.
VB:
Function ChiffresAfterVirgule(dNum As Double, opt As Byte)
'Renvoie le nombre de chiffres après la virgule ou tous les chiffres après la virgule
'- dNum : le chiffre à traiter
'- opt : si opt = 1 --> le nombre de chiffres après la virgule
'        si opt <> 1 --> tous les chiffres après la virgule
'Ex : 125,587349 | opt = 1 --> 6
'                  opt <> 1 --> 587349

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

  SepDec = Application.International(xlDecimalSeparator)
  tmp = CStr(dNum)
  posDec = InStr(tmp, SepDec)
  nb = Len(tmp) - Len(Right(tmp, posDec)) 'nombre de chiffres après la virgule
  cap = Right(dNum, nb) 'chiffres après la virgule
 
'*******************************************************************************************************************
  'If Left(cap, 1) <> "0" Then cap = CDbl(cap)                'ne fait strictement rien
  'If Left(cap, 1) <> "0" Then TypeName(cap) = "Double"       'ne marche pas
'*******************************************************************************************************************
 
  ChiffresAfterVirgule = IIf(opt = 1, IIf(posDec = 0, 0, nb), IIf(posDec = 0, 0, cap))
  
End Function
 

Dranreb

XLDnaute Barbatruc
Elles sont limpides au contraire pour moi. Pour transmettre un argument, la procédure appelante doit le déposer dans une région de mémoire appelée la pile ou le tas, en anglais (heap).
Pour une variable, avec ByRef il y en dépose l'adresse, avec ByVal il y en dépose la valeur.
Dans ce dernier cas, pour la procédure appelée, la zone ainsi renseignée a exactement le même statut qu'une variable locale.
Pour une expression telle qu'une constante, avec ByRef, n'ayant pas le droit d'en transmettre l'adresse, ce qui l'exposerait ainsi à une possible modification par la procédure appelée, il doit de toute façon déposer une copie de sa valeur dans une zone de travail et transmettre l'adresse de cette zone. Ce qui est idiot: quitte à devoir déposer sa valeur quelque part autant la déposer directement dans la pile. Son accès sera d'ailleurs plus simple pour la procédure appelée.
Pour un objet c'est encore plus idiot de le transmettre ByRef. Mais, à moins que vous ne me le demandiez, je ne vais pas détailler ça maintenant.
Mais la plus grande valeur de l'attribut ByVal est une valeur documentaire: j'affirme ainsi que c'est seulement une donnée d'entrée, qui n'a pas vocation d'être modifiée à l'intention de la procédure appelante. Pour un objet, ce qui consiste à le modifier c'est de l'initialiser, non d'accéder à ses propriétés et méthodes. Cest derniers ne sont pas impactés par son mode de transmission.
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
315 098
Messages
2 116 190
Membres
112 679
dernier inscrit
Yupanki