XL 2010 À la recherche d'une fonction

Magic_Doctor

XLDnaute Barbatruc
Bonjour,

Le titre est un peu nébuleux, mais il aurait été difficile de le résumer en une simple phrase.
J'essaie de résoudre un problème et, pour ce faire, j'envisage d'utiliser une fonction (donc VBA) qui me renvoie, pour un chiffre décimal, le nombre de "0" après la virgule avant le premier chiffre qui ne soit pas nul.
Ex :
- 0,52866320023 (mais ça aurait pu être 258,52866320023) --> 0
- 0,0528066320023 --> 1
- 0,00528066320023 --> 2
- 0,000528066320023 --> 3

Merci d'avance pour toute aide.
 

Dudu2

XLDnaute Barbatruc
Ta solution du post #17 est la plus simple et la plus sûre.
C'est celle que le demandeur Magic_Doctor doit utiliser s'il s'y retrouve dans cette discussion.

Le format ici n'est pas exploité directement. D'ailleurs même si au final le résultat cherché est correct sur le "jeu d'essai" de mapomme, "Standard" et "0E+00" donnent des résultats différents, et je ne sais pas, dans l'absolu, ce qui pourrait générer des erreurs comme le fait par exemple la 1ère colonne sur un -1,20E+01 (ou 12,01).
Il faudrait vérifier avec une calculette scientifique.
1606588976300.png
 

Dudu2

XLDnaute Barbatruc
Quel suspens ! Mieux que Mimi ange gardien ! Et quelle Vista job75 !

Ben si ça marche quand même avec le format "standard" (post #44).
Finalement les petites décimales auraient leur importance. Parfois.
1606597745147.png


C'est surtout que Excel, fait des arrondis sur le format "0E-00" et c'est pour ça que 0,099 devient 1E-01. Sans arrondi ce serait 9E-02 et ça fonctionnerait.
 
Dernière édition:

job75

XLDnaute Barbatruc
Donc par formule c'est Dudu2 qui a trouvé la bonne solution, celle du post #44.

Voyez le fichier joint avec en plus une fonction VBA de mon cru assez simple :
VB:
Function Nzero(c As Range)
If Not IsNumeric(CStr(c)) Then Exit Function
Dim x$, deb%, i%
x = Format(c, "0." & String(999, "0"))
deb = InStr(x, Application.DecimalSeparator) + 1
For i = deb To Len(x)
    If Mid(x, i, 1) <> "0" Then Nzero = i - deb: Exit Function
Next
End Function
Ce fut longuet mais on y est arrivé :)
 

Pièces jointes

  • Magic_Doctor(1).xlsm
    19.4 KB · Affichages: 12

R@chid

XLDnaute Barbatruc
Bonjour @ tous,
Je pense que ma formule également fonctionne bien,
il suffit d'ajouter un ABS() pour gérer les nombres négatifs (chose qui n'était pas prévue à cause des exemples donnés dans la question), et au lieu de 15 mettre 99.

=SIERREUR(EQUIV(0;--STXT(TEXTE(SI(MOD(A2;1)>0;MOD(ABS(A2);1));"0,"&REPT(0;99));3;LIGNE($1:$99)));0)

J'ai ajouté le 0 à la fin à cause de ce smiley ;)
Toujours matricielle



Cordialement
 
Dernière édition:

Dudu2

XLDnaute Barbatruc
Bonjour R@chid,
Je n'avais pas oublié ta formule dans les essais et ça ne marchait pas pour tout donc je n'avais pas poursuivi.
Avec cette nouvelle formule cela améliore les résultats mais il reste des valeurs à vérifier, par exemple:
  • Scientifique -1,20E+01 (-12,001 standard)
  • -1,11E-22
  • 12,01
Je reste prudent car je suis peut-être, comme la 1ère fois, passé à coté de la mise en place.
 
Dernière édition:

Dudu2

XLDnaute Barbatruc
A noter que la formule originale de mapomme, peut fonctionner aussi avec la mise place d'un format qui permet à son magic "& 1" de fonctionner.
=SIERREUR(SI(A2=ENT(A2);0;ENT(-LOG10(MOD(ABS(TEXTE(A2;"#,"&REPT("#";100)) & 1);1))));0)
Je n'en avais pas reparlé car elle est moins "charmante" que celle du post #44.
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
Donc par formule c'est Dudu2 qui a trouvé la bonne solution, celle du post #44.

Voyez le fichier joint avec en plus une fonction VBA de mon cru assez simple :
VB:
Function Nzero(c As Range)
If Not IsNumeric(CStr(c)) Then Exit Function
Dim x$, deb%, i%
x = Format(c, "0." & String(999, "0"))
deb = InStr(x, Application.DecimalSeparator) + 1
For i = deb To Len(x)
    If Mid(x, i, 1) <> "0" Then Nzero = i - deb: Exit Function
Next
End Function
Ce fut longuet mais on y est arrivé :)
bonjour
c'est ni plus ni moins ce que j'ai proposé en 1ere page de ce post
a savoir compter le nombre de zero dans les décimale en soustrayant le len(val(decimale)) au len des décimales

valeur$=258,00001452325
x=split(valeur ,",")
if ubound(x)>0 then nb0&=len(x(1))-len(val(x(1))) else nb0&=0
 

Dudu2

XLDnaute Barbatruc
Aucune des fonctions VBA proposées ne passe l'épreuve.
Même celle qui fait les divisions par 10, ce qui est un comble !
Car quand x = 12,01 -> x - Int(x) n'est pas 0,01 !!! Mais
1606632375360.png
C'est fou !?!
Il faut passer par un Single et pas par un Double pour avoir 0,01.
Il faut revoir les copies.
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
bonjour Dudu2
Aucune des fonctions VBA proposées ne passe l'épreuve.
Même celle qui fait les divisions par 10, ce qui est un comble !
Car quand x = 12,01 -> x - Int(x) n'est pas 0,01 !!! Mais Regarde la pièce jointe 1086632C'est fou !?!
Il faut revoir les copies.
tiens donc ? peut être par ce qu'en vba le seul séparateur décimal valable est le point et non la virgule ;)
et il ne faut pas oublié que les cellules ont une limite de longueur pour les nombre avant de passer en nombre scientifique et de ce fait vba l'interprete comme un texte donc non numérique
d'autant plus que si x est en long on a un effet de bord
et donc quand on travaille des nombres en vba,les déclarer comme attendu (double)
et si tu veux corriger le tir :justement pour palier cet effet de bord il y a des fonctions pour ça
je n'ai aucun problème avec 12.01
VB:
Sub test()
x = 12.01
x = x - Int(x)
MsgBox CDec(x)
End Sub
;)

d'autre part il s'agit de quoi dans ce sujet?
il s'agit de compter le nombre de zero immédiat après le séparateur décimal
pour moi il ne s'agit donc ici que de travail en string (c'est a dire compter un nombre de caractères précis a un endroit précis d'une CHAINE$$$$ numérique
 
Dernière édition:

Dudu2

XLDnaute Barbatruc
Faut-il un truc aussi bourrin que ça pour compter les zéros après la virgule en VBA ?
VB:
Function NbZéros(Cellule As Range) As Integer
    Dim ValText As String
    Dim k As Integer
    Dim i As Integer

    If Not IsNumeric(Cellule.Value) Then Exit Function
    If Cellule.Value = Int(Cellule.Value) Then Exit Function

    ValText = Format(Cellule.Value, "@")

    k = InStr(ValText, "E")
    If k Then
        NbZéros = CInt(Mid(ValText, k + 2)) - 1
    Else
        k = InStr(ValText, Application.DecimalSeparator)
        For i = k + 1 To Len(ValText)
            If Mid(ValText, i, 1) <> "0" Then Exit For
        Next i
        NbZéros = i - k - 1
    End If
End Function

Edit: au final, mieux vaut la solution formule
 
Dernière édition:

Discussions similaires

Réponses
8
Affichages
363

Statistiques des forums

Discussions
311 720
Messages
2 081 909
Membres
101 836
dernier inscrit
karmon