Simuler une "MaskedTextbox" / Identifier backspace keypress [Résolu]

Signaler
Messages postés
24
Date d'inscription
lundi 19 décembre 2005
Statut
Membre
Dernière intervention
28 décembre 2008
-
Messages postés
24
Date d'inscription
lundi 19 décembre 2005
Statut
Membre
Dernière intervention
28 décembre 2008
-
Bonjour tout le monde.  Joyeux noël à tous!  Étant pris au travail, je passe le temps en apprenant...  Ce qui m'amène à vous poser une question car je ne trouves pas.

Language : VBA
Application : Word 2002 (impossible de changer pour une version plus récente : employeur sans $).

Je désires que lorsque l'utilisateur écrit hul dans la textbox (TbxNoDossier) devienne : HUL-  J'usque la ca va pour le faire.  La ou j'ai un problème, c'est quand l'utilisateur s'est trompé et qu'il doit effacer une lettre... C'est à dire qu'il presse la touche BackSpace (Ascii = 8).  Le trait d'union ne s'efface pas!  En fait il s'efface mais mon code le rajoute aussitot.  L'utilisateur doit prendre sa souris, tout sélectionner le texte, le supprimer et reprendre du début.  J'ai tenté plusieurs approches : KeyUp(), KeyDown(), KeyPress(), Change(). sans résultat. 

Au final, l'utilisateur doit écrire : hul12345678 qui deviendra à mesure qu'il écrit : HUL-123456-78 Les lettres et les chiffres sont variables à chaque utilisation du formulaire.

Question 1 : Comment faire pour savoir si l'utilisateur a pressé sur la touche backSpace et garder uniquement les 2 premier caractères ?

Question 2 : Comment faire pour savoir si l'utilisateur a pressé sur la touche - (moins/tiret) et l'enlever de la string puisque le code l'ajoute automatiquement ?

Voici mon code :

Private Sub TbxNoDossier_Change()


    ' Déclaration des variables.
    Dim Donne As String
    Dim Longueur As Integer


    '  Assignation des valeurs aux variables.
    Donne = TbxNoDossier.Text
    Longueur = Len(Donne)


        Select Case Longueur
            Case 1
                '  Ca change le text en majuscule.
                Donne = UCase(Donne)
                TbxNoDossier.Text = Donne
            Case 2
                '  Ca change le text en majuscule.
                Donne = UCase(Donne)
                TbxNoDossier.Text = Donne
            Case 3
                '  Ca change le text en majuscule et ca ajoute le trait d'union
                Donne = UCase(Donne)
                TbxNoDossier.Text = Donne & "-"
            Case 10
                '  Ca change le text en majuscule et ca ajoute le trait d'union
                TbxNoDossier.Text = Donne & "-"
            Case 13
                '  Ca donne le focus au bouton qui va vérifier la présence du fichier .txt contenant les infos du client.
                BtnVerifier.SetFocus
        End Select



End Sub




Bonne soirée tout le monde!

4 réponses

Messages postés
24
Date d'inscription
lundi 19 décembre 2005
Statut
Membre
Dernière intervention
28 décembre 2008

Alors après 10000 tentatives, j'ai réussi.  C'est pas très beau comme code...  mais ca fonctionne.  Y'a plein de variables et de charabia, mais tout fonctionne!!!  Je sais pas pourquoi (incompatibilité de version word???) mais les If KeyAscii n'étaient tout simplement pas "catché" par VBA.

Voila :

1 forme avec une textbox (TbxNoDossier) et deux label invisible (LblEfface, LblLongueurChaine) et un bouton (BtnVerifier).  Pourquoi les 2 labels = évite les erreurs de variables entre les sub.  C'est pas beau je le sais.

' Le tout donne le résultat suivant : HUL-123456-78 quand l'utilisateur écrit : hul12345678 . Les lettres et les chiffres sont variables à chaque utilisation de la forme.  Le pourquoi de l'uniformité : recherche de dossier du client par la suite...  Ca évite de créer des doublons si le dossier existe et qu'il n'est pas trouvé en premier lieu.


<hr />


Private Sub TbxNoDossier_Change()    ' Déclaration des variables.
    Dim Donne As String
    Dim Longueur As Integer

    ' Assignation des valeurs aux variables.
    Donne = TbxNoDossier.Text
    Longueur = Len(Donne)

    Select Case Longueur
        Case 1
            Donne = UCase(Donne)
            TbxNoDossier.Text = Donne
            BtnVerifier.Enabled = False
        Case 2
            Donne = UCase(Donne)
            TbxNoDossier.Text = Donne
            LblEfface.Caption = "0"
            BtnVerifier.Enabled = False
        Case 3
            Donne = UCase(Donne)
            If LblEfface.Caption = "0" Then
                TbxNoDossier.Text = Donne & "-"
                LblLongueurChaine.Caption = "4"
            Else
            End If
            BtnVerifier.Enabled = False
        Case 9
            LblEfface.Caption = "0"
            BtnVerifier.Enabled = False
        Case 10
            If LblEfface.Caption = "0" Then
                TbxNoDossier.Text = Donne & "-"
                LblLongueurChaine.Caption = "11"
            Else
            End If
            BtnVerifier.Enabled = False
        Case 13
            BtnVerifier.Enabled = True
            BtnVerifier.SetFocus
        Case Else
            BtnVerifier.Enabled = False
    End Select

End Sub

<hr />
Private Sub TbxNoDossier_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)    ' Désactivation de la touche ''Tiret / moins''.
    If KeyAscii = 45 Then
        KeyAscii = 0
    Else
    End If

End Sub

<hr />Private Sub TbxNoDossier_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)

    ' Déclaration des variables.
    Dim Donne As String
    Dim Longueur As Integer

    ' Assignation des valeurs aux variables.
    Donne = TbxNoDossier.Text
    Longueur = Len(Donne)

    Select Case Longueur
        Case 1
            LblLongueurChaine.Caption = "1"
        Case 2
            LblLongueurChaine.Caption = "2"
        Case 3
            LblLongueurChaine.Caption = "3"
            If LblLongueurChaine.Caption = "4" Then
                Donne = Left(TbxNoDossier.Text, 3)
                LblEfface.Caption = "1"
                TbxNoDossier.Text = Donne
                LblLongueurChaine.Caption = "4"
            Else
                Donne = Left(TbxNoDossier.Text, 2)
                LblEfface.Caption = "1"
                TbxNoDossier.Text = Donne
                LblLongueurChaine.Caption = "2"
            End If
        Case 4
            If KeyCode = 8 Then
                If LblLongueurChaine.Caption = "5" Then
                    Donne = Left(TbxNoDossier.Text, 4)
                    LblEfface.Caption = "1"
                    TbxNoDossier.Text = Donne
                    LblLongueurChaine.Caption = "4"
                Else
                    Donne = Left(TbxNoDossier.Text, 2)
                    LblEfface.Caption = "1"
                    TbxNoDossier.Text = Donne
                    LblLongueurChaine.Caption = "2"
                End If
            Else
            End If
        Case 5
            LblLongueurChaine.Caption = "5"
        Case 6
            LblLongueurChaine.Caption = "6"
        Case 7
            LblLongueurChaine.Caption = "7"
        Case 8
            LblLongueurChaine.Caption = "8"
        Case 9
            LblLongueurChaine.Caption = "9"
        Case 10
            LblLongueurChaine.Caption = "10"
            If LblLongueurChaine.Caption = "11" Then
                Donne = Left(TbxNoDossier.Text, 10)
                LblEfface.Caption = "1"
                TbxNoDossier.Text = Donne
                LblLongueurChaine.Caption = "11"
            Else
                Donne = Left(TbxNoDossier.Text, 9)
                LblEfface.Caption = "1"
                TbxNoDossier.Text = Donne
                LblLongueurChaine.Caption = "9"
            End If
        Case 11
            If KeyCode = 8 Then
                If LblLongueurChaine.Caption = "12" Then
                    Donne = Left(TbxNoDossier.Text, 11)
                    LblEfface.Caption = "1"
                    TbxNoDossier.Text = Donne
                    LblLongueurChaine.Caption = "11"
                Else
                    Donne = Left(TbxNoDossier.Text, 10)
                    LblEfface.Caption = "1"
                    TbxNoDossier.Text = Donne
                    LblLongueurChaine.Caption = "10"
                End If
            Else
            End If
        Case 12
            LblLongueurChaine.Caption = "12"
        Case 13

    End Select
   
End Sub
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
43
salut,

c'est ton choix d'évènement qui n'est pas bon.
si tu travailles au _Change c'est déjà trop tard.
_KeyPress est mieux

en VB6 (mais çà sera pareil) :






Private Sub 
Text1_KeyPress(KeyAscii 
As Integer
)

    With Text1
        If KeyAscii = 108 Or KeyAscii = 76 Then 'l ou L
'           bien "HU" ?
            If UCase$(.Text) = "HU" Then
'               on modifie et
annule ta touche
                .Text = "HUL-"
                KeyAscii = 0
'               on replace le
caret
                .SelStart = Len(.Text)
            End If
        ElseIf KeyAscii = vbKeyBack Then 'effacer
'           annule et garde
la gauche
            KeyAscii = 0
            .Text = Left$(.Text, 2)
            .SelStart = 2
        ElseIf KeyAscii = 45 Then '"-", on annule
            KeyAscii = 0
        End If
    End With
End Sub





<small>
[../code.aspx?ID=39466 Coloration VB6, VBA,
VBS]
</small>






dans ton _change tu peux mettre juste le ucase dans tous les cas, et passer le focus si len = 13
++

<hr size="2" width="100%" />
Prenez un instant pour répondre à [sujet-SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp 
Messages postés
24
Date d'inscription
lundi 19 décembre 2005
Statut
Membre
Dernière intervention
28 décembre 2008

Fonctionne pas, le vbKeyBack n'est pas détecté.  :(
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
43
mets juste "8" si t'aimes pas la lisibilité (à adapter pour VBA)   :)