XL 2010 Problème dans le paramétrage d'une fonction à partir d'un formulaire

Magic_Doctor

XLDnaute Barbatruc
Bonsoir,

J’ai une fonction personnalisée qui permet de transformer un nombre en chaîne de caractères.
J’ai un formulaire à partir duquel je peux paramétrer cette fonction. La fonction ne se paramètre pas correctement et je n’arrive pas à comprendre pourquoi.
Tout est bien expliqué dans le fichier joint.

Merci d’avance pour m’aider à résoudre cette énigme.
 

Pièces jointes

  • MEF_Nb.xlsm
    129.5 KB · Affichages: 14
Solution
Dans ce fichier (2) j'ai laissé un seul Evaluate dans la macro Test.

Mais j'ai remplacé dans le code de l'UserForm :
VB:
ActiveWorkbook.Names.Add Name:="Remember_TypeSepMil", RefersTo:=Controls("OptionButton" & i).Caption, Visible:=False  'mémorisation du type de séparateur de milliers choisi
par :
VB:
ActiveWorkbook.Names.Add Name:="Remember_TypeSepMil", RefersTo:="=" & Controls("OptionButton" & i).Caption, Visible:=True  'mémorisation du type de séparateur de milliers choisi
On concatène "=".

Le nom "Remember_TypeSepMil", est affiché pour qu'on puisse voir la formule.

fanch55

XLDnaute Barbatruc
Bonjour,
En prenant en compte le séparateur décimal, la fonction semble le faire correctement :
VB:
Option Explicit

Function NombreEnTxt2$(num As Variant, x As Byte, TypeSep$, Optional mas As Boolean = False)
'************************************************************************************************************************************
'Retranscrit un nombre en chaîne.
'Complète s'il le faut, avec des 0, un nombre décimal, de telle sorte qu'il y ait un nombre déterminé de chiffres après la virgule.
'Place éventuellement des séparateurs de milliers
'job75 / Magic_Doctor
'************************************************************************************************************************************
'- num     : un nombre
'- x       : le nombre de chiffres voulu après la virgule
'- TypeSep : si ""  --> pas de séparateurs de milliers (25145785 --> 25145785)
'            si " " --> espace (25145785 --> 25 145 785)
'            si "." --> point  (25145785 --> 25.145.785)
'- mas     : si True : si le nombre est positif, alors il sera précédé du signe "+"
'Exemple   : si x = 2 & sep = True ou omis => num = 2               --> 2,00
'                                             num = 125752,22       --> 125.752,22
'                                             num = -202454524565,5 --> -202.454.524.565,50
'            si x = 5 | sep = True | TypeSep = " " | mas = True => num = 125365875,25 --> +125 365 875,25000

    Dim signe$, Txt$, i%, t$, n$, nb$, pos As Byte, gauche$, droite$, millier$, dp$
    dp = Application.DecimalSeparator
    
    On Error Resume Next 'pour que n'apparaisse pas #¡VALOR! si num = ""
    If num = "" Then Exit Function
    
    signe = IIf(num = Abs(num), IIf(mas, "+", ""), "-")
    
    num = FormatNumber(num, 15) 'pour éviter que ne s'impose la notation scientifique
    Txt = CStr(Abs(num))
    For i = 1 To Len(Txt)
        t = Mid(Txt, i, 1)
        If Not IsNumeric(t) And t <> "," And t <> "." Then Exit For
    Next
    t = Replace(Left(Txt, i - 1), ",", ".")
    n = IIf(i = 1, "", Format(Val(t), "0." & String(x, "0")))
    If x = 0 Then n = Replace(n, ",", "") 'pas de décimale après la virgule donc pas de virgule
    
    nb = n & Mid(Txt, i)
    pos = InStr(1, nb, dp)
    gauche = Left(nb, pos - 1)
    droite = Mid(nb, pos + 1)
    
    If TypeSep = "" Then  'pas de séparateurs de milliers
        NombreEnTxt2 = signe & n
    Else  'séparateurs de milliers (" " ou ".")
        If x = 0 Then  'nombre entier
            millier = IIf(TypeSep = " ", Replace(Format(Int(Abs(num)), "#,##0"), ".", Chr(160)), Replace(Format(Int(Abs(num)), "#,##0"), Chr(160), "."))
            NombreEnTxt2 = signe & millier
        Else  'nombre décimal
            millier = IIf(TypeSep = " ", Replace(Format(CDec(gauche), "#,##0"), ".", Chr(160)), Replace(Format(CDec(gauche), "#,##0"), Chr(160), "."))
            If InStr(gauche, Application.DecimalSeparator) Then millier = millier & Mid(gauche, InStr(gauche, Application.DecimalSeparator))
            NombreEnTxt2 = signe & millier & "," & droite
        End If
    End If
End Function
 

job75

XLDnaute Barbatruc
Bonjour Magic_Doctor, le forum,

Le problème vient des guillemets des Captions des OptionButtons "" et " " et ".".

Il faut les supprimer et pour cela évaluer une 2ème fois :
VB:
Sub Test()
    [F4] = NombreEnTxt([B4], 2, " ")  'ça marche bien quand on paramètre manuellement
    [F5] = NombreEnTxt([B4], Evaluate("Remember_DAV"), Evaluate(Evaluate("Remember_TypeSepMil")))  'MARCHE
  
    'Pour vérifier si les valeurs procédant du formulaire ont bien été mémorisées
    [F8] = Evaluate("Remember_DAV")
    [F10] = Evaluate("Remember_TypeSepMil")
End Sub
Tu comprendras mieux si tu ne masques pas le nom "Remember_TypeSepMil".

Edit : salut fanch55.

A+
 

Pièces jointes

  • MEF_Nb(1).xlsm
    45 KB · Affichages: 5
Dernière édition:

job75

XLDnaute Barbatruc
Dans ce fichier (2) j'ai laissé un seul Evaluate dans la macro Test.

Mais j'ai remplacé dans le code de l'UserForm :
VB:
ActiveWorkbook.Names.Add Name:="Remember_TypeSepMil", RefersTo:=Controls("OptionButton" & i).Caption, Visible:=False  'mémorisation du type de séparateur de milliers choisi
par :
VB:
ActiveWorkbook.Names.Add Name:="Remember_TypeSepMil", RefersTo:="=" & Controls("OptionButton" & i).Caption, Visible:=True  'mémorisation du type de séparateur de milliers choisi
On concatène "=".

Le nom "Remember_TypeSepMil", est affiché pour qu'on puisse voir la formule.
 

Pièces jointes

  • MEF_Nb(2).xlsm
    45 KB · Affichages: 1

Discussions similaires

Statistiques des forums

Discussions
312 673
Messages
2 090 783
Membres
104 664
dernier inscrit
jth