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

Une fonction akinésique

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Magic_Doctor

XLDnaute Barbatruc
Supporter XLD
Bonsoir,

J'ai une fonction personnalisée (UDF), "HowLong", qui renvoie le nombre de chiffres après la virgule.
C'est très curieux de constater à quel point elle est lente dans la PJ.
Si quelqu'un pouvait m'expliquer pourquoi.
Un grand merci d'avance !
 

Pièces jointes

Re

Pourquoi se compliquer la vie 😉
Cette petite fonction fait pareil qu'HowLong, non ?
VB:
Function NBDEC(r As Range)
NBDEC = Len(r - Int(r)) - 2
End Function
Sub test()
[A1] = "1.24589"
MsgBox NBDEC(Range("A1"))
End Sub

EDITION: Désolé, Dranreb, je n'avais pas vu ton message 😉
 
Pas de mal.
En fait, si c'est limité à 5 maxi, il est plus prudent de l'écrire comme ça :
VB:
Function HowLong(ByVal dNum As Double) As Byte
HowLong = Len(Str$(Int(dNum * 100000 + 0.5) / 100000 - Int(dNum))) - 2
End Function
sinon on risque de se récupérer 15 sur des valeurs imparfaitement représentées en binaire.
 
Merci pour vos réponses.

Je viens d'essayer la fonction de Staple qui est aussi lente que HowLong. Et avec 5 décimales après la virgule, elle me renvoie 15 ! Alors que HowLong me renvoie bien 5.
Essayez par curiosité. À moins que chez vous ça ne se passe pas pareil...
C'est curieux tout ça !
 

Pièces jointes

Chez moi tout est instantané.
Dernière écriture de ma fonction :
VB:
Function NbDéc(ByVal dNum As Double) As Byte
NbDéc = Len(Str$(Int((dNum - Int(dNum)) * 100000 + 0.5) / 100000)) - 2
End Function
 
Sinon comme je le disais le résulate de 15 tenait à ce que la valeur à 5 décimales diminuée de sa partie entière valait en réalité 0,256830000000001

…et ta formule, Staple1600, donne 15 aussi !
Il faudrait :
Code:
=NBCAR(ARRONDI(Volume2-ENT(Volume2);5))-2
 
Dernière édition:
Re,

Le problème, c'est que je voudrais répupérer cette donnée dans une macro. Donc, pourquoi ne pas tout faire en VBA ?
La lenteur, je pense, ne dépend pas des fonctions (HowLong, ou celle de Staple) mais de la cellule analysée qui a subit une mise en forme.
 
Bonjour tout le monde,

puisque tu souhaites du VB, et si tu as des événements ou des MFC . . .
peut être comme ceci, avec le code VB de Dranreb

Function NbDéc(ByVal dNum As Double) As Byte
Application.EnableEvents = False: Application.Calculation = xlCalculationManual
NbDéc = Len(Str$(Int((dNum - Int(dNum)) * 100000 + 0.5) / 100000)) - 2
Application.EnableEvents = True: Application.Calculation = xlCalculationAutomatic
End Function
 
Bonjour à tous,
Je viens d'essayer la fonction de Staple qui est aussi lente que HowLong. Et avec 5 décimales après la virgule, elle me renvoie 15 !
Je ne constate pas de lenteur.

Quant au mauvais résultat de la fonction NBDEC de JM il est dû à la fonction Int qui peut dans certains cas renvoyer un résultat erroné, voyez ces 2 liens :

https://www.excel-downloads.com/threads/fonction-int-pour-les-vbaistes.117085/

Résultats inattendus de la fonction Int()

Pour éviter ce phénomène il faut utiliser CDec :
Code:
Function NBDEC(r As Range)
NBDEC = Len(r - Int(CDec(r))) - 2
End Function
Bonne journée.
 
Bonjour.
Ce serait plutôt que la fonction Int peut renvoyer un résultat trop juste, sachant que la valeur exprimée en décimal par 1164.35 ne peut exister en Double, la valeur la plus proche possible y étant légèrement inférieure.
 
Re Bernard,

Comme l'indique le 2ème lien du post #13 le problème vient des calculs en binaire quand il y a des valeurs de type Double dans l'expression à calculer.

Avec ceci pas de problème :
Code:
Function NBDEC(r As Range)
NBDEC = Len(r) - Len(Int(r)) - 1
End Function
A+
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

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