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
 

Hasco

XLDnaute Barbatruc
Repose en paix
bonjour,

ChiffresAfterVirgule = IIf(opt = 1, nb, CLng(cap))

Mettre le paramètre opt en optional avec une valeur par default serait plus sympa.
Lui changé le type (boolean) et le nom également
exemple :
ChiffresAfterVirgule(dnum as double, optional Valeur as boolean = True) as long

Si Valeur = True la valeur des chiffres après la virgule sinon le nombre

Pas besoin de retourner un double (pas de virgule dans les chiffres après la virgule) un long est plus cohérent.

cordialement
 

dysorthographie

XLDnaute Accro
bonjour,
VB:
Function ChiffresAfterVirgule(dNum As Double, Optional Nb As Boolean = False) As Long
Dim SepDec As String, T
SepDec = Application.International(xlDecimalSeparator)
 T = Val(Split(dNum & SepDec, SepDec)(1))
 If Nb = True Then T = Len(T)
 ChiffresAfterVirgule = T
End Function
Sub test()
Debug.Print ChiffresAfterVirgule(125.0000587349), ChiffresAfterVirgule(125.0000587349, True)
End Sub
 

Hasco

XLDnaute Barbatruc
Repose en paix
Re,

Et sans le if NB ... :
Function ChiffresAfterVirgule(dNum As Double, Optional Nb As Boolean = False) As double Dim SepDec As String, T SepDec = Application.International(xlDecimalSeparator) T = Val(Split(dNum & SepDec, SepDec)(1)) ChiffresAfterVirgule = Array(T, Len(T))(-Nb) End Function

Cordialement
 

dysorthographie

XLDnaute Accro
Maintenant comme notre ami veut un retour au format numérique 0,025 donerra 25 ce qui est une erreur !
Et 1 sera vue comme 1,0 et retournerra une longueur de 1 ce qui est également une erreur !

Personnellement j'aurais gardé le code originel mais en centrant la cellule à droite !
 
Dernière édition:

Hasco

XLDnaute Barbatruc
Repose en paix
ChiffresAfterVirgule = Array(T, Len(T))(-Nb)
N'a rien changé à l'affaire. Mais comme il n'intervient pas, j'attends de voir ce qu'il voudrait exactement.
[edit] hello mapomme :) je répondais à dysorthographie :)
 

job75

XLDnaute Barbatruc
VB:
Function ChiffresAfterVirgule(dNum As Double, opt As Byte)
If InStr(dNum, Application.DecimalSeparator) = 0 Then ChiffresAfterVirgule = "": Exit Function
ChiffresAfterVirgule = CDbl(Mid(dNum, InStr(dNum, Application.DecimalSeparator) + 1))
If opt = 1 Then ChiffresAfterVirgule = Len(CStr(ChiffresAfterVirgule))
End Function
 

dysorthographie

XLDnaute Accro
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).
C'est uniquement parce la fonction retourne un variant et pas un numérique {integer, long ou double}

Le vrai problème c'est qu'il faut faire un choix entre 0000x et x!
 

Discussions similaires