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
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
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
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
demo.gif
 

cathodique

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
Regarde la pièce jointe 1187104
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
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
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
 

Statistiques des forums

Discussions
314 422
Messages
2 109 447
Membres
110 482
dernier inscrit
ilyxxxh