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

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.
 

patricktoulon

XLDnaute Barbatruc
heu.... non
là encore tu a des outils
je pense notamment à cstr
ValText =cstr(cdec(Cellule.Value))

tient tape en A5 "999999999999" tu va obtenir "1E+12"
dans un module
VB:
Sub test2()
MsgBox CStr(CDec([A5].Value))
End Sub


après au delà même le taper avec décimales excel arrondi donc la question ne se pose même plus sauf si cellule au format texte
on en revient donc à ce que j'ai dis plus haut avec ce genre de chaîne numérique la seule solution est de travailler en string
 
Dernière édition:

Dudu2

XLDnaute Barbatruc
Bonjour patricktoulon
12,01... oui dans le code j'avais mis 12.01.
Sinon pour A5 = -1,20E+01
J'obtiens la même chose avec CStr(CDec([A5].Value)) et Format([A5].Value, "@") -> -12,0001
(C'est ce qui apparait dans la barre de formule)
CStr(CDec([A2].Value)) semble donner le format qu'on trouve dans la barre de formule.
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
oui sauf que cstr est moins lourd que format
cstr = le texte de la valeur
format = reformate la chaîne en texte (il y a donc reformatage)
c'est pas la même chose

et je le répète si un nombre doit se transformer en scientifique alors travaillez en texte(cellule au format texte)) toute vos jolies formules auront une limite le string plus de 37000 caractères avant ou après la virgule comme tu veux
même cdec a ses limites
 

patricktoulon

XLDnaute Barbatruc
bonjour @Staple1600
Car il y a peut-être une autre façon d'envisager une solution que cette histoire de zéro après la virgule, non ?
difficile de te répondre étant donné que c'est le sujet de la question
si le contexte n'est pas clairement défini il me parait improbable d'envisager une autre façon de voir
sachant que la dernière intervention du demandeur a eu lieu en page 1 du post et que nous en sommes a la page 4
 

Staple1600

XLDnaute Barbatruc
Re

=>patricktoulon
J'aurais du faire une citation plus longue
J'essaie de résoudre un problème et, pour ce faire, j'envisage d'utiliser une fonction (donc VBA)
Si le problème avait été détaillé dès le départ, peut-être que d'autres voies de résolution seraient présentées.
Je faisais simplement par de mon étonnement.
Mais puisque vous amusez avec Excel et les mathématiques, c'est le principal.
PS: Rien n’empêche d'attendre le retour du demandeur avant de continuer un fil...
Mais ce n'est plus dans l'air du temps.
 

job75

XLDnaute Barbatruc
Bonjour le fil, le forum,

Dans ce fichier (2) j'ai réintroduit ma formule avec le format Scientifique amélioré :
Code:
=MAX(DROITE(TEXTE(MOD(ABS(A2);1);10^-8&"E+00");2)-1;)
En ligne 34 les résultats sont arrondis sauf en VBA, c'est normal.

Edit : un détail, 10^-8 pèse 12 octets en mémoire, on peut le remplacer par 1/"1E8" qui pèse 9 octets.

A+
 

Pièces jointes

  • Magic_Doctor(2).xlsm
    20.2 KB · Affichages: 16
Dernière édition:

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour à tous,

on en revient donc à ce que j'ai dis plus haut avec ce genre de chaîne numérique la seule solution est de travailler en string

Selon moi, le problème n'est certes pas de représenter un décimal dans Excel comme une chaine de caractères.
Excel sert à manipuler des nombres (on l'oublie quelque fois) et les remplacer par une chaine de caractères dévoie et rend inutile ou du moins compliqué et non intuitif l'utilisation d'un tableur. Utiliser du texte pour représenter des nombres : il y a des programmes (hors Excel) qui le font très bien (yc avec des très petits ou très grands nombres).

Ceci dit, un microproc utilise des registres finis en son for intérieur. Il ne saurait représenter des nombres décimaux, rationnels, réels de manière juste. Je n'ai pas dit qu'on arrivera pas à construite un jour un micro utilisant l'abstraction pour faire des raisonnements mathématiques ou la manipulation d'entités mathématiques représentant des nombres aussi grands ou petits qu'on puisse imaginer. Pour l’instant, me semble-t-il, cela reste l'apanage du cerveau des mathématiciens humains.

Donc la manipulation exacte de n'importe quel nombre décimal (ou non) risque d'être vaine. Je pense que l'on ne peut s'inscrire que dans un ensemble de conditions rendant une macro ou une formule valide ou non. La mécanique classique n'est valable que dans un domaine particulier de conditions. Dans le domaine infiniment petit (par rapport à nous ), la mécanique classique est hors jeu, on doit passer à la mécanique quantique (qu'on doit remercier, sinon notre monde ne serait pas ce qu'il est ; à commencer par nos PC).

Dans notre cas, on est aussi confronté à la manière même de représenter les nombres par Excel, par VBA (affichage, représentation interne, conversion de type, arrondi, approximation et j'en passe).

Par exemple, la formule de @job75 suffit dans la majorité des cas (les cas sont à définir).

@Staple1600, tapi dans l'ombre, est sorti de son terrier pour poser une excellente question. Il serait bon de savoir quel est le but poursuivi par @Magic_Doctor. Mais ce but, @Magic_Doctor nous le fournit très rarement dès sa première question. Je crois me souvenir que dans un fil du passé, @Magic_Doctor s'intéressait à des concentrations de produits (pour sa fille ?). Dans ce cas, la plage des valeurs est sans doute très bornée et une fonction (VBA ou non) sera sans doute trouvable et suffisante.

Mon thé est prêt. Salut
 
Dernière édition:

Dudu2

XLDnaute Barbatruc
Et ta fonction est celle qui a le plus de "charme"
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
 

Magic_Doctor

XLDnaute Barbatruc
Bonjour à tous,

Je ne m'attendais pas à autant d'enthousiasme !
J'ai opté pour la solution de job (#17).
Pour pouvoir l'utiliser dans une macro, je l'ai un tout petit peu modifiée :
VB:
Function NbZeroDec(c#)
'job75
    NbZeroDec = Evaluate("MAX(RIGHT(TEXT(MOD(ABS(0" & Replace(c, ",", ".") & "),1),""0E+00""),2)-1,)")
End Function
Je ne doute point que cette fonction peut avoir maintes utilités.
Personnellement, j'en avais besoin pour résoudre un problème. Voir PJ, c'est clair.

Bonne fin d'après-midi à tous.
 

Pièces jointes

  • Nb0.xlsm
    21 KB · Affichages: 5

job75

XLDnaute Barbatruc
Bonsoir Magic_Doctor,
J'ai opté pour la solution de job (#17)
Tu n'as pas suivi le fil sinon tu aurais vu que cette solution ne va pas, en particulier avec 0,099.

Utilise plutôt la fonction VBA de mon post #51 :
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
A+
 

Magic_Doctor

XLDnaute Barbatruc
Bonjour job, Staple1600, le forum,

job, tu as en effet raison. Je mettais mon truc au point au moyen de ta fonction qui semblait bien marcher.
Je viens de rectifier. Voilà qui est fait. Merci pour ton aide précieuse.

Staple1600, si je n'avais pas mis de PJ dans mon 1er post, c'est que le fichier était trop volumineux, Je l'ai minimalisé au maximum, ce qui m'a pris un peu de temps.
 

Pièces jointes

  • Nb0Bis2.xlsm
    20.9 KB · Affichages: 2

Discussions similaires

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