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.
 

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:

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
Supporter XLD
Re,
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

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