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

XL 2010 Format Textbox dynamique

cathodique

XLDnaute Barbatruc
Bonjour,

Au fil de mes recherches, j'ai trouvé des codes très intéressants de notre ami @patricktoulon ( que je salue pour sa gentillesse en mp).
Ses codes sont à garder précieusement. Mais je n'ai pas toutes les connaissances pour les adapter à mes attentes.
Je voudrais un masque de saisie suivant: Textbox numérique (2 décimales) avec séparateur de milliers en dynamique et possibilité de retour arrière pour correction faute de frappe.
J'espère que mes explications sont claires.
Bon dimanche.
 

Pièces jointes

  • NUM avec Sep Millier dynamique.xlsm
    18.7 KB · Affichages: 2
Solution
voila
et noyeux joel
VB:
Option Explicit

Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
'patricktoulon
'textbox (million millier mille) formaté dynamico aux taper des touches
'la touche (BACK ;retour en arrière) est fonctionnelle  
  Dim v  'j'ai juste ajouté ce dim car le code planté
    With TextBox1
        v = Replace(.Value, " ", "")
        Select Case KeyCode
        Case 96 To 105, 48 To 57
            If KeyCode < 96 Then KeyCode = KeyCode + 48
            If InStr(1, v, ",") > 0 Then
                If Len(Split(v, ",")(1)) = 2 Then KeyCode = 0: Exit Sub
            Else
                'v = v & Chr(KeyCode - 48): KeyCode = 0
                v = Split(Format(v & Chr(KeyCode - 48)...

patricktoulon

XLDnaute Barbatruc
tu a vu que le formatage est dynamique en fonction de la virgule et enter ?
avant la virgule ca va être un vrai defit
si je tape xxxx
le mask devra devenir _ _ _ _
si je tape xxxxx le mask devra devenir _ _ _ _ _

etc...etc...
et une fois la virgule tapé le mask devra devenir le mask actuel & ", - -"
bref c'est causto
a moins que je te fasse un mask fixe
a savoir
"_ _ _ _ _ _ , _ _"
et que tu te deborouille de faire attention a commencer à taper au bon endroit
 

cathodique

XLDnaute Barbatruc
Merci. J'ai remarqué ce que tu décris mais ce n'est pas vraiment le résultat escompté.
Le formatage ne s'effectue qu'après avoir insérer la virgule. or, très souvent je saisis des chiffres ronds donc sans virgule. C'est là où que ça ne va pas, le format ne s'applique pas dynamiquement.

edit: le format s'applique à la sortie de la textbox. Ce n'est pas vraiment dynamique.
Est-il possible d'avoir un code qui réagit à la saisie?
 

patricktoulon

XLDnaute Barbatruc
je vais voir
mais le mask de saisie j'ai fais quelque essais et c'est pas ergonomique du tout
un masque de saisie est fait pour indiquer un format fixe de chaine numerique ou autre
la le format change en fonction de la valeur du nombre decimal ou pas
 

patricktoulon

XLDnaute Barbatruc
voila
et noyeux joel
VB:
Option Explicit

Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
'patricktoulon
'textbox (million millier mille) formaté dynamico aux taper des touches
'la touche (BACK ;retour en arrière) est fonctionnelle  
  Dim v  'j'ai juste ajouté ce dim car le code planté
    With TextBox1
        v = Replace(.Value, " ", "")
        Select Case KeyCode
        Case 96 To 105, 48 To 57
            If KeyCode < 96 Then KeyCode = KeyCode + 48
            If InStr(1, v, ",") > 0 Then
                If Len(Split(v, ",")(1)) = 2 Then KeyCode = 0: Exit Sub
            Else
                'v = v & Chr(KeyCode - 48): KeyCode = 0
                v = Split(Format(v & Chr(KeyCode - 48), "#,##0.00"), ",")(0): KeyCode = 0
            End If
            .Value = v
        Case 110, 188: KeyCode = 188 ' la virgule prime
            If InStr(1, .Value, ",") > 0 Or .Value = "" Then KeyCode = 0
            v = Split(Format(v, "#,##0.00"), ",")(0)
            .Value = v & ",": KeyCode = 0
        Case 8    'gestion de la touche back
            If v = "" Then KeyCode = 0: Exit Sub
            v = Left(v, Len(v) - 1)
            If v = "" Then Exit Sub
            If InStr(1, v, ",") = 0 Then v = Split(Format(v, "#,##0.00"), ",")(0)
            .Value = v: KeyCode = 0
        Case 13, 9
            .Value = Format(.Value, "#,##0.00") 'au cas ou on sort et que ce n'est pas fini
        Case Else: KeyCode = 0    'Toutes les autres touches sont bloquées
        End Select
    End With
End Sub

c'est Magic
 

cathodique

XLDnaute Barbatruc
C'EST FANTASTIIIIIIIIIIIIQUE. C'EST PARFAIT.

Je te remercie infiniment.

JOYEUX NOËL
 

job75

XLDnaute Barbatruc
Bonjour cathodique, Patrick,

Une solution assez simple :
VB:
Private Sub TextBox1_Change()
Dim sep$, pos%
With TextBox1
    If .Text = "" Then Exit Sub
    sep = Application.DecimalSeparator
    If Not IsNumeric(Left(.Text, 1)) Then .Text = "" Else If Not IsNumeric(Right(.Text, 1)) And Right(.Text, 1) <> sep Then .Text = Left(.Text, Len(.Text) - 1)
    pos = InStr(.Text, sep)
    If pos = 0 Then .Text = Format(.Text, "#,##0") Else If Len(Mid(.Text, pos + 1)) > 1 Then .Text = Format(.Text, "#,##0.00")
End With
End Sub
A+
 

job75

XLDnaute Barbatruc
La décimale suivante est bloquée ou arrondit la 2ème décimale.
Moi je ne trouve pas que l'arrondi soit gênant mais si vous n'aimez pas utilisez :
VB:
Private Sub TextBox1_Change()
Dim sep$, pos%
With TextBox1
    If .Text = "" Then Exit Sub
    sep = Application.DecimalSeparator
    If Not IsNumeric(Left(.Text, 1)) Then .Text = "" Else If Not IsNumeric(Right(.Text, 1)) And Right(.Text, 1) <> sep Then .Text = Left(.Text, Len(.Text) - 1)
    pos = InStr(.Text, sep)
    If pos = 0 Then .Text = Format(.Text, "#,##0") Else If Len(Mid(.Text, pos + 1)) > 1 Then .Text = Format(Left(.Text, pos + 2), "#,##0.00")
End With
End Sub
 

cathodique

XLDnaute Barbatruc
Bonjour Job75,

Merci beaucoup. Je suis preneur de toutes solutions.
La tienne fonctionne aussi mais pas pratique de devoir saisir une virgule car j'utilise un pavé numérique (la touche (.) de ce dernier ne fonctionne pas.

Joyeux Noël
 
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…