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

Magic_Doctor

XLDnaute Barbatruc
Bonjour à tous,

Je me suis rendu compte que mon disque dur était presque plein, suite à un avertissement "Peu d'espace, bla bla bla...". Je l'ai un peu purgé. Résultat : fini la lenteur.
Enfin, je constate qu'au-delà de 5 décimales après la virgule (rare qu'on aille si loin dans la précision), la fonction HowLong me renvoie toujours 5, alors que la fonction NBDEC proposée par job (très claire au passage) renvoie toujours le bon résultat.
En conséquence, tout semble réglé.
Merci à tous.
 

Magic_Doctor

XLDnaute Barbatruc
Bonsoir,

Je voudrais substituer la fonction "HowLong" :
VB:
Function HowLong(dNum As Double) As Byte
'Renvoie le nombre de décimales après la virgule
Dim SepDec$, tmp, posDec
    SepDec = Application.International(xlDecimalSeparator)
    tmp = CStr(dNum)
    posDec = InStr(tmp, SepDec)
    If posDec = 0 Then
        HowLong = 0
    Else
        HowLong = Len(tmp) - Len(Right(tmp, posDec))
    End If
End Function
par la fonction "NBDEC" :
VB:
Function NBDEC(r As Range) As Byte
'Renvoie le nombre de décimales après la virgule
'job75
    NBDEC = Len(r) - Len(Int(r)) - 1
End Function
dans la fonction "MEFDecApVirg" :
VB:
Function MEFDecApVirg(num As Double, dec As Byte, Optional ExactDec As Boolean, Optional sep As Boolean, Optional suf As String, Optional signe As Boolean = False) As String
'Renvoie la syntaxe de MEF
'Doit être couplé avec la fonction "HowLong"
'Magic_Doctor / mapomme / Hieu
'- num : le chiffre à traiter
'- dec : le nombre maximal de décimales après la virgule
'- ExactDec : uniquement si "True", complète, s'il le faut, par des "0" la fin de la chaîne
'- sep : uniquement si "True", séparateur des milliers
'- suf : un éventuel suffixe (%, mL...)
'- signe : uniquement si "True", précède le nombre saisi d'un "+" s'il est positif, d'un "-" s'il est négatif. En revanche rien s'il est omis
'Exemple : [A6].NumberFormat = MEFDecApVirg([A6], 2,,, " Romina", True) --> si [A6] = 223645,55358 => + 223.645,55 Romina

Dim x As Byte, WF, SepDec$, MEF As String, sm As String

    num = CDbl(Round(num, dec))
    x = HowLong(num)
    'x = Len(num) - Len(Int(num)) - 1   'NE MARCHE PAS
    Set WF = WorksheetFunction
    SepDec = Application.International(xlDecimalSeparator): sm = IIf(sep = True, Chr(35) & SepDec & Chr(35) & Chr(35), "")

    Application.Volatile

    If x > dec Then
        x = dec
    ElseIf x = 0 Then
        MEF = Chr(48)
    Else
        MEF = Chr(48) & IIf(dec = 0, "", Chr(46) & WF.Rept(Chr(48), x))
    End If

    If ExactDec = True Then
        MEF = IIf(dec = 0, Chr(48), Chr(48) & Chr(46) & WF.Rept(Chr(48), dec))
    End If

    If Not IsMissing(suf) Then
        MEF = MEF & Chr(34) & suf & Chr(34)
    End If

    MEF = sm & MEF

    If signe = True Then
        MEF = "[>0]+ " & MEF & ";[<0]- " & MEF
    End If

    MEFDecApVirg = MEF
End Function
J'ai un peu tout essayé (modifications dans la déclaration des variables), rien n'y fait, ça ne marche pas.
Comment s'y prendre ?
 
Dernière édition:

Discussions similaires

Réponses
2
Affichages
232

Membres actuellement en ligne

Aucun membre en ligne actuellement.

Statistiques des forums

Discussions
311 725
Messages
2 081 941
Membres
101 848
dernier inscrit
Djigbenou