Une fonction akinésique

Magic_Doctor

XLDnaute Barbatruc
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

  • Fonction akinésique.xlsm
    33.8 KB · Affichages: 32

Staple1600

XLDnaute Barbatruc
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 ;)
 

Dranreb

XLDnaute Barbatruc
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.
 

Magic_Doctor

XLDnaute Barbatruc
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

  • Fonction akinésique.xlsm
    31.5 KB · Affichages: 33

Dranreb

XLDnaute Barbatruc
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:

Magic_Doctor

XLDnaute Barbatruc
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.
 

Roland_M

XLDnaute Barbatruc
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
 

job75

XLDnaute Barbatruc
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.
 

job75

XLDnaute Barbatruc
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+
 

Discussions similaires

Réponses
2
Affichages
249

Statistiques des forums

Discussions
312 195
Messages
2 086 078
Membres
103 111
dernier inscrit
Eric68350