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

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

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.
 

Dranreb

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

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
266
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…