XL 2016 format numérique textbox VBA

Lorenzini

XLDnaute Occasionnel
-Bonjour,

Je cherche à forcer le format numérique dans un textbox ("#,##0.00 €"...soit le format monétaire 2 décimales avec séparateur de milliers et devise (€)...).
Je cherchais une solution un peu plus "classe" que :

Private Sub TextBox1_AfterUpdate()
TextBox1 = Format(TextBox1, "# ##0.00 €")
End Sub
...
Après avoir "bidouillé" un bout de code, je reste coincé...
Les soucis :
1) je ne parviens pas à ce que le curseur suive la saisie au fur et à mesure :
lorsque je tape "123456789", tout va bien, le curseur avance normal.
lorsque je tape un zéro, çà foire !?! ...le curseur fait du sur place !
Ensuite, en arrivant aux décimales, dès la saisie de la seconde décimale, le curseur va se placer après la devise "€"... pas très classe tout çà...
Est-ce que quelqu'un pourrait m'aider ?
Voici le code :

VB:
Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)

If KeyCode = 46 Then TextBox1.Tag = ""
If TextBox1.Tag <> "" Then
If KeyCode = 8 Then TextBox1.Tag = Mid(TextBox1.Tag, 1, Len(TextBox1.Tag) - 1)

End If

End Sub
'******************************************************************************************************
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)

If InStr("1234567890,.", Chr(KeyAscii)) = 0 Then KeyAscii = 0
If "0123456789,." Like "*" & Chr(KeyAscii) & "*" Then
If InStr(TextBox1, ",") = 1 Then
If Len(Split(TextBox1.Tag, ",")(1)) = 2 Then KeyAscii = 0
End If
If KeyAscii = 46 Then KeyAscii = 44
 'If KeyCode = 48 Then TextBox1.SelStart = InStr(TextBox1.Value, 0) + 1
TextBox1.Tag = TextBox1.Tag & Chr$(KeyAscii)
KeyAscii = 0
End If
 
End Sub
'******************************************************************************************************
Private Sub TextBox1_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)

    If KeyCode = 48 Then TextBox1.SelStart = InStr(TextBox1.Value, 0) - 1
    If KeyCode < 96 Or KeyCode > 105 Then
    If TextBox1 <> "" Then TextBox1 = Left(TextBox1, Len(TextBox1))
    End If

If TextBox1.Tag <> "" Then TextBox1.Value = Format(CDbl(TextBox1.Tag), "#,##0.00 €")
  
    TextBox1.SelStart = InStr(TextBox1.Value, 0) - 2 ' , Len(TextBox1) + 1)

End Sub

Je vous joint le fichier en annexe ; il s'agit d'un petit programme que j'essaye de développer pour ma fille dans le cadre de ses cours scolaires (rien de confidentiel).
 

Pièces jointes

  • Calcul TAEG Océane.xlsm
    341.8 KB · Affichages: 29

jmfmarques

XLDnaute Accro
Bonjour
1) A quoi cela peut-il vraiment servir d'inclure le sigle de la monnaie dans le formatage d'une textbox ? A rien d'autre qu'à compliquer, alourdir, etc ...
Si tu y tiens tant, à l'affichage de ce sigle, affiche-le à part, dans un label, à droite de ta textbox
2) on ne joue pas (c'est maladroit et "croche-patteux") avec, à la fois, les évènements Keydown, Keypress et Keyup. Choisis ton camp
3) ce genre de mécanisme de formatage en cours de saisie est en règle presque quasi générale plus une source de gêne, y compris pour l'utilisateur, qu'autre chose. Et ce que tu trouves peu "classe" (le formatage in fine) est pourtant ce qui est le plus confortable (et de loin le moins scabreux) pour l'utilisateur.
Ce ne sera dans ces conditions que si (et seulement si après avoir lu et relu ce qui précède) tu insistes sur la mise en place d'un tel mécanisme de saisie, que je te concocterai personnellement cette "chose", sur la base de l'utilisation de l'évènement Change.
 

Lorenzini

XLDnaute Occasionnel
Bonjour,
J'ai finalement suivi votre conseil : j'ai ajouté le sigle "€" dans un label à droite de la textbox.
J'avoue effectivement que je me suis compliqué la tâche comme pas possible en voulant inclure ce formatage...
Depuis 2 jours, je me suis obstiné et ai pensé au "croche-patteux"... il y'avait de quoi s'emmêler en effet !
Merci pour vos conseils qui m'ont permis d'avancer !
:cool:
 

patricktoulon

XLDnaute Barbatruc
Bonjour
et moi je viens foutre le trouble
oui c'est possible
on procède par interception du keycode dans keydown je l'ai déjà montré plusieurs fois
pour l'exemple les tranches sont séparé jusqu'au trilliard
VB:
Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    With TextBox1
        x = Trim(Replace(.Value, " €", ""))
        Select Case KeyCode
        Case 96 To 105
            x = x & Chr(KeyCode + IIf(KeyCode < 96, 32, -48))
        Case 110, 188: If Not x Like "*,*" Then x = x & ","
        Case 8: x = Left(x, Len(x) - IIf(x <> "", 1, 0))
        Case 46: x = Left(x, .SelStart)
        Case Else: KeyCode = 0
        End Select
        x = IIf(Not x Like "*,*", Format(x, Right("### ### ### ### ### ### ### ###", Len(x))), x)
        .Value = x
        If .Value <> "" Then .Value = .Value & " €"
        .SelStart = Len(x)
    End With
    KeyCode = 0
End Sub

purée dur dur le confinement ;) :p
 

Discussions similaires

Réponses
12
Affichages
393