Pb pour transformer une saisie vers le format monétaire dans une textbox

Bonjour,

J'ai une textbox ou l'utilsateur doit entrer un nombre ( tarif )

L'utilisateur peut alors entrer à sa guise ce nombre de 3 façons différentes : un entier, un nombre à virgule ou un nombre avec un point.

J'ai essayé d'ajouter ce genre de code dans une fonction Onchange() de la textbox.

Me.TMontant.Value = Format(Me.TMontant, "# ##0.00 €")

En finalité, cela ne fonctionne pas comme espéré car la saisie est modifiée 'à la volée' donc si l'utilisateur entre un nombre avec 1 seul chiffre, cela fonctionne :

par exemple on entre le chiffre 1 -> la textbox est modifiée : 1,00 €

mais si l'utilisateur entre le chiffre 12 -> la textbox est modifiée comme ceci : 1,00 €2

Comment éviter cela et faire en sorte que le chiffre entrée soit correctement transformé, peut importe le nombre de digits et si il y a présence ou non de point ou virgule ?

Merci beaucoup,

Bonjour,

Une piste avec l'utilisation du séparateur système. Ce dernier ne peut être entré qu'une fois et le TextBox n'accepte que les chiffres. Gérer le code 45 si les nombre peuvent être négatifs. Ici, le formatage est réalisé sur Exit du TextBox :

    
    Select Case KeyAscii

        'inscrit le séparateur système que l'on tape le point ou la virgule
        Case 44, 46
            KeyAscii = Asc(Format(0, "."))
            'si déjà présent, empêche une seconde saisie
            If InStr(TMontant.Text, Format(0, ".")) <> 0 Then KeyAscii = 0

        'ne rien faire, c'est un chiffre donc, autorisé !
        Case 48 To 57

        'interdit tout autre caractère
        Case Else: KeyAscii = 0

    End Select

End Sub

Private Sub TMontant_Exit(ByVal Cancel As MSForms.ReturnBoolean)

    TMontant.Text = Format(TMontant.Text, "# ##0.00 €")

    If Left(TMontant.Text, 1) = " " Then TMontant.Text = Right(TMontant.Text, Len(TMontant.Text) - 1)

End Sub

Bonjour, Salut Theze !

Ton problème vient du fait que tu utilises l'évènement Change, lequel intervient à chaque frappe de caractère, donc en tapant 12, tu tapes d'abord le 1, qui est formaté selon ton instruction en 1,00 €, puis tapant le 2 ce dernier se met à la suite 1,00 €2, ce qui ne forme plus un nombre susceptible d'être formaté...

Il faut donc, si tu laisses libre l'utilisateur de frapper son montant, que tu interviennes lors de la validation de sa saisie.

Private Sub TMontant_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
    If TMontant.Value = "" Then Exit Sub
    If IsNumeric(Replace(TMontant.Value, ".", ",")) Then
        TMontant.Value = Format(TMontant.Value, "# ##0.00 €")
    Else
        MsgBox "Veuillez taper un montant valide !", vbCritical, "Erreur de saisie"
        TMontant.Value = ""
        Cancel = False
    End If
End Sub

Avec ce code tu interviens à la validation, tu vérifies le caractère numérique de la saisie, en remplaçant le point éventuel par la virgule. Si OK, tu formates, sinon tu avertis, tu effaces et l'utilisateur est renvoyé à la saisie du montant. Si la TextBox est vide tu n'interviens pas.

Mais attention à la suite, quand tu sortiras ton montant de la TextBox, ce dernier ainsi formaté, est une valeur de type String non convertible en nombre directement. Il te faudra donc rétablir une valeur numérique, l'affecter à la cellule et (si elle ne l'est pas), doter la cellule du format monétaire.

Pour convertir tu auras le choix entre deux principales solutions :

- Utiliser Val qui ne tient pas compte des espaces et convertira en nombre tout ce qui précède le caractère € qui n'est pas un chiffre, mais qui ne reconnait que le point comme séparateur décimal :

exemple :

    Dim v
    v = TMontant.Value
    v = Val(Replace(v, ",", "."))

et tu peux affecter v à ta cellule...

- Ou bien convertir avec CDec ou CCur (plus approprié sans doute pour un montant...), mais là il te faut supprimer les espaces et le caractère € :

    Dim v
    v = CCur(Replace(Replace(TMontant.Value, " ", ""), "€", ""))

Cordialement.

Merci pour l'explication

Avec le code proposé, j'obtiens un résultat surprenant lorsque je rentre un chiffre ayant un point : " . "

par exemple :

2.00 est transformé en 0,08 €

2.1 est transformé en 0,08 €

2.10 est transformé en 0,09 €

2,1 est transformé en2,10 €

10.5 en transformé en 0,42 €

On dirait que le remplacement du point par la virgule ne s'opère pas correctement.

Pour autant Excel exécute bien cette ligne, j'ai pu le confirmer avec le debuggeur en mettant un point d'arret sur cette ligne .

TMontant.Value = Format(TMontant.Value, "# ##0.00 €")

Au temps pour moi ! avec ma formulation, le point n'était pas modifié...

Je fais de l'élagage et réponds pendant mes pauses, les deux activités doivent mal se combiner !

Private Sub TMontant_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
    Dim v
    If TMontant.Value = "" Then Exit Sub
    v = Replace(TMontant.Value, ".", ",")
    If IsNumeric(v) Then
        TMontant.Value = Format(v, "# ##0.00 €")
    Else
        MsgBox "Veuillez taper un montant valide !", vbCritical, "Erreur de saisie"
        TMontant.Value = ""
        Cancel = False
    End If
End Sub

A vérifier.

Ca fonctionne très bien à présent.

Merci à vous

Bonsoir MFerrand,

tu a écrit :

Je fais de l'élagage et réponds pendant mes pauses

alors t'es maréchal-ferrant ET jardinier ? fais attention d'pas découper Assurancetourix avec ton sécateur, hein ?

mais à défaut d'pouvoir lui couper l'sifflet, si tu lui découpe sa lyre, c'est pas une mauvaise idée !

"photo récente de MFerrand"
screen

tu sais qu'tu fais très peur avec ton nouveau style « massacre à la tronçonneuse » ?

moi pas vouloir finir coupé en p'tits morceaux, pas vouloir être mangé kaï kaï !

dhany

fais attention d'pas découper Assurancetourix avec ton sécateur, hein ?

J'ai fait ça avec un taille-haies et tu ne crois pas si bien dire ! j'ai loupé le premier mais pas mon câble... J'ai donc doublé par des travaux électriques

Rechercher des sujets similaires à "transformer saisie format monetaire textbox"