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.
 

job75

XLDnaute Barbatruc
Bonjour Magic_Doctor, le fil,

En utilisant le format Scientifique c'est assez simple :

- par formule Excel en B2 =MAX(DROITE(TEXTE(MOD(ABS(A2);1);"0E+00");2)-1;)
[sans le smiley :]
Code:
=MAX(DROITE(TEXTE(MOD(ABS(A2);1);"0E+00");2)-1;)
- par fonction VBA en C2 =NZeroDec(A2)
VB:
Function NZeroDec(c As Range)
NZeroDec = Evaluate("MAX(RIGHT(TEXT(MOD(ABS(0" & Replace(c.Value2, ",", ".") & "),1),""0E+00""),2)-1,)")
End Function
A+
 

Pièces jointes

  • NZeroDec(1).xlsm
    16.3 KB · Affichages: 19
Dernière édition:

Dudu2

XLDnaute Barbatruc
@patricktoulon, Je crois que tu as la réponse à ta question.
job75 écrase le concurrence !
1606494378599.gif

Avec un petit ajout cosmétique pour généraliser:
=SI(SIERREUR(MOD(A2;1);0);MAX(DROITE(TEXTE(MOD(ABS(A2);1);"0E+00");2)-1);0)
 
Dernière édition:

job75

XLDnaute Barbatruc
Avec un petit ajout cosmétique pour généraliser:
=SI(SIERREUR(MOD(A2;1);0);MAX(DROITE(TEXTE(MOD(ABS(A2);1);"0E+00");2)-1);0)
Je n'ai pas utilisé SIERREUR pour bien montrer que par formule et en VBA on a le même résultat.

Ce n'est pas forcément évident, testez le fichier en enlevant le zéro du ABS(0 dans la fonction VBA :
VB:
Function NZeroDec(c As Range)
NZeroDec = Evaluate("MAX(RIGHT(TEXT(MOD(ABS(" & Replace(c.Value2, ",", ".") & "),1),""0E+00""),2)-1,)")
End Function
 

R@chid

XLDnaute Barbatruc
Re,
@patricktoulon, Je crois que tu as la réponse à ta question.
job75 écrase le concurrence ! Regarde la pièce jointe 1086515
Avec un petit ajout cosmétique pour généraliser:
=SI(SIERREUR(MOD(A2;1);0);MAX(DROITE(TEXTE(MOD(ABS(A2);1);"0E+00");2)-1);0)
Je ne vois pas l'utilité de l'ajout de SIERREUR() sauf si la cellule contient du Texte, à part ça l'ajout d'un autre argument dans MAX() fera l'affaire.
=MAX(DROITE(TEXTE(MOD(ABS(A2);1);"0E+00");2)-1;0)
Comme ça on ne va pas voir -1 comme réponse.
S'il y a du Texte dans la cellule on peut l'écrire comme ça pour renvoyer 0
=SIERREUR(MAX(DROITE(TEXTE(MOD(ABS(A1);1);"0E+00");2)-1;0);)
 

job75

XLDnaute Barbatruc
Bonsoir mapomme,

Mais oui avec le logarithme décimal c'est encore plus simple :)
Je ne vois pas l'utilité de l'ajout de SIERREUR() sauf si la cellule contient du Texte, à part ça l'ajout d'un autre argument dans MAX() fera l'affaire.
=MAX(DROITE(TEXTE(MOD(ABS(A2);1);"0E+00");2)-1;0)
Dans mon post #17 cet argument existe mais il est inutile d'inscrire le zéro MAX(xxx;)

Le smiley a pris la place du ; et )

A+
 
Dernière édition:

Discussions similaires

Réponses
8
Affichages
440

Statistiques des forums

Discussions
312 211
Messages
2 086 299
Membres
103 172
dernier inscrit
Aurelyan