Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

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
1E-300 est un nombre décimal à 300 chiffres après la virgule qu'Excel gère très bien, non ?
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

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…