XL 2010 Comparer le nombre de décimales après la virgule d’une série de chiffres

Magic_Doctor

XLDnaute Barbatruc
Bonjour,

J’ai une série de 4 chiffres décimaux, par exemple :
-55,4927644455
-125
-35,920236
56,01666666

Je veux connaître le nombre de chiffres après la virgule le plus long de cette série de chiffres.

J’ai bricolé ceci, qui ma foi fonctionne :
VB:
Sub NbMaxChiffresAfterVirgule()

Dim c As Range, i As Byte, nb(4) As Byte, tableau

    For Each c In [Zardoz] 'nom de la plage de 4 cellules contenant les 4 valeurs
        i = i + 1
        nb(i) = ChiffresAfterVirgule(c.Value, 1)
    Next

    tableau = Array(nb(1), nb(2), nb(3), nb(4))
    
    [S14] = Application.Max(tableau) 'résultat

End Sub
-----------------------------------------------------------------------
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
 
  ChiffresAfterVirgule = IIf(Opt = 1, IIf(posDec = 0, 0, nb), IIf(posDec = 0, 0, cap))
  
End Function
Le problème, c’est que la plage « Zardoz » est en fait constituée de 4 cellules fusionnées. Sur la feuille : R17:S17 ; R18:S18 ; R19:S19 ; R20:S20. Pour des raisons techniques ces cellules doivent rester fusionnées. Et là ma routine ne marche plus. Comment y remédier ?
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour @patricktoulon :)
ok ton fichier donne 10 ????????
Avec Excel c'est toujours ambigu de parler de nombre décimal. Il y a ce qu'on voit d'affiché, ce que Excel peut afficher avec ses limitations et aussi la représentation interne ( Comme le dit @soan:)).
A priori, les fonctions décrites ci-dessus sont incapables de retourner que le décimal 1E-300 a 300 chiffres après la virgule. Mais bon, c'était juste pour remettre 1€ dans la tire-lire. :)
Je sors. Bonne après-midi à tous.
 

soan

XLDnaute Barbatruc
Inactif
1E-300 est un « format scientifique » ; voir ces 2 liens pour plus d'infos :



soan
 

job75

XLDnaute Barbatruc
Bonjour le fil, le forum,
Juste pour remettre une pièce dans le flipper :p
1E-300 est un nombre décimal à 300 chiffres après la virgule qu'Excel gère très bien, non ? :rolleyes:
Oui on peut aller jusqu'à la 300ème décimale :
VB:
Function NbMaxChiffresAfterVirgule(plage As Range)
Dim ds$, c As Range, s, n
ds = Application.DecimalSeparator
For Each c In plage
    If IsNumeric(CStr(c)) Then
        s = Split(Format(c, "0.###############E" & IIf(Abs(c) < 1, "-", "+") & "000"), "E") 'notation scientifique
        n = Len(Mid(s(0), InStr(s(0), ds) + 1)) - s(1)
        If n > NbMaxChiffresAfterVirgule Then NbMaxChiffresAfterVirgule = n
    End If
Next
End Function
Fichier (3).

A+
 

Pièces jointes

  • NbMaxChiffresAfterVirgule(3).xlsm
    17.8 KB · Affichages: 9

Dranreb

XLDnaute Barbatruc
Bonsoir.
le décimal 1E-300 a 300 chiffres après la virgule.
Mais codé en binaire il en a 1049 en fait parce qu'il vaut en réalité 0,00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000002505909183520875968569614680770370524992534231990046604318405148467630281218195010089496230627027825414891031146499880413081224609160619018271942662793458427551041478278701507022263926060379361392435977509403014386614147912551359088259101734169222292122040491862182202915561954185941852588326204092831631787205015401996986616948980410676557942431921652541808732242554300585073938340203330993157646467433638479065531661724812599598594906293782493759617177861888792970476530542335134710418229637566637950767497147854236589795152044892049176025289756709261767081824924720105632337755616538050643653812583050224659631159300563236507929025398878153811554013986009587978081167432804936359631140419153283449560376539011485874652862548828125
(codé +&H1,56E1FC2F8F359 × 2^-&H3E5 et valant exactement 6032057205060441 / 2^1049)
 
Dernière édition:

Discussions similaires