Masque de saisie

apt

XLDnaute Impliqué
Bonsoir à tous,

J’aimerais appliquer des masques de saisie sur des Textbox.

- "___ __ __ __" pour un numéro de téléphone 0xx xx xx xx.

- "T___-_" pour une entrée du genre Txxx-y

- "L3-_____" pour L3-xxxxx

Pour le moment je travaille sur celui du numéro de téléphone pour avoir le principe et ensuite l’appliquer sur les autres masques.

Je devrais saisir 012320082 pour qu’il apparaisse dans la TextBox sous la forme 012 32 00 82.

(Les chiffres remplacent les _).

Après le code fournis par Jean-Pierre ici :

[XL-2007] Masque de saisie - Forum des professionnels en informatique

Code:
Option Explicit
Dim LeTexte As String
Dim chargement As Boolean
Private Sub TextBox1_Change()
Dim Val As String
Dim Ind As Byte
 
    Ind = TextBox1.SelStart
    Val = Left(TextBox1.Value, TextBox1.SelStart)
 
    If Len(Val) > 12 Then
        TextBox1.Value = Left(Val, 12)
        Exit Sub
    End If
 
    If Len(Val) = 3 Or Len(Val) = 6 Or Len(Val) = 9 Then
        Val = Val & " "
        Ind = Len(Val)
    End If
 
    Val = Val & Right(LeTexte, Len(LeTexte) - Ind)
    TextBox1.Value = Val
    TextBox1.SelStart = Ind
End Sub

Private Sub UserForm_Initialize()
    LeTexte = "___ __ __ __"
    TextBox1.Value = LeTexte
    TextBox1.SelStart = 0
End Sub

Je viens de créer un nouveau UserForm avec un TextBox au lieu d'intégrer le code dans mon projet comme je l'avais fait et ça ne marchait plus (Je ne sais pour quelle raison).

Maintenant Le masque s’affiche et les chiffres s'écrivent normalement.

Mais reste que j'aimerais reproduire les touches "Back Space" et "Suppr" sur le texte du Textbox parce que l'effacement pour le "Back Space" s'arrête lorsqu'elle rencontre le premier espace entre les tirets et "Suppr" lorsqu'elle est utilisée, efface tout le texte dans le TextBox.

Merci d’avance.

:D
 
Dernière édition:

Robert

XLDnaute Barbatruc
Repose en paix
Re : Masque de saisie

Bonjour Apt, bonjour le forum,

Pour les numéros de téléphone j'aurais plutôt fait comme ça :
Code:
Option Explicit

Private Sub TextBox1_Change()
Select Case Len(TextBox1.Value)
    Case 3, 6, 9
        TextBox1.Value = TextBox1.Value & " "
    Case Is > 12
        TextBox1.Value = Left(TextBox1.Value, 12)
End Select
End Sub
sans rien indiquer à l'initialisation de l'UserForm...
 

MJ13

XLDnaute Barbatruc
Re : Masque de saisie

Bonjour Apt, Robert

Je viens de créer un nouveau UserForm avec un TextBox au lieu d'intégrer le code dans mon projet comme je l'avais fait et ça ne marchait plus (Je ne sais pour quelle raison).

J'aimerais tant que pour la nouvelle année, quand je vois Textbox, Userform, on ai un fichier à se mettre sous la dent, sinon, je vais finir pas ne plus rien comprendre à ce forum :eek:.

Par exemple comme ceci:
 

Pièces jointes

  • Masque_Saisie_Date.xlsm
    17 KB · Affichages: 155
Dernière édition:

jp14

XLDnaute Barbatruc
Re : Masque de saisie

Bonjour et Bonne année à tous

Ci dessous une autre manière d’appréhender le problème.



Code:
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
Dim Data1 As String
Dim Data2 As String
Dim i As Byte
Dim j As Byte
If KeyAscii < 48 Or KeyAscii > 57 Or _
 Len(Replace(TextBox1, "_", "")) = 12 Then
    KeyAscii = 0
    Exit Sub
End If
' formatage des données
TextBox1 = TextBox1 & Chr(KeyAscii)

Data1 = Replace(TextBox1, "_", "")
Data1 = Application.WorksheetFunction.Trim(Data1)
Data1 = Replace(Data1, " ", "")
j = 1
For i = 1 To 12
    Select Case i
        Case 1, 2, 3, 5, 6, 8, 9, 11, 12
            If IsNumeric(Mid(Data1, j, 1)) Then
                Data2 = Data2 & Mid(Data1, j, 1)
                j = j + 1
            Else
                Data2 = Data2 & "_"
            End If
        Case 4, 7, 10
            Data2 = Data2 & " "
    End Select
Next i
TextBox1 = Data2
KeyAscii = 0
End Sub

A tester

JP
 

apt

XLDnaute Impliqué
Re : Masque de saisie

Bonsoir Robert, MJ13 et jp14

Robert :- Ton masque est simple mais sans tirets à la ligne :) Je le garderais à coté.

MJ13 :- OK ;)
jp14:- Toujours un disfonctionnement dans les touches BACKSPACE et SUPP.

Par exemple si je saisie : 011 22 33 44, et je veux supprimer le premier "3" (Selstart=8) et le remplacer par un "5", j'aurais dans mon Textbox la chaine finale : 011 22 34 45 au lieu de 011 22 35 44, parce que le dernier caractère est toujours ajouté à la fin de la chaine et non pas en lieu du caractère supprimé
:eek:
 

Pièces jointes

  • masque_saisie_v1.xls
    41.5 KB · Affichages: 104

jp14

XLDnaute Barbatruc
Re : Masque de saisie

Bonjour

Ci dessous un code à tester

Code:
Option Explicit
Dim LeTexte As String
Dim chargement As Boolean
Dim posinex As Byte
Dim flag As Boolean
Dim poscur As Byte

Private Sub TextBox1_Change()
Dim Val As String
Dim Ind As Byte
Dim i As Byte
If flag = True Then Exit Sub
i = TextBox1.SelStart
If i < poscur Then
    TextBox1.SelStart = i
    poscur = i
    Label1.Caption = i - 1
    Exit Sub
End If

formatagetextbox
TextBox1.SelStart = 12
poscur = 12
For i = 1 To 12
    If Mid(TextBox1, i, 1) = "_" Then
        TextBox1.SelStart = i - 1
        poscur = i - 1
        Label1.Caption = i - 1
        Exit For
    End If
Next i


End Sub

Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)

If KeyAscii < 48 Or KeyAscii > 57 Or _
 Len(Replace(TextBox1, "_", "")) = 12 Then
    KeyAscii = 0
    Exit Sub
End If
End Sub
Private Sub formatagetextbox()
Dim Data1 As String
Dim Data2 As String
Dim i As Byte
Dim j As Byte
flag = True
' formatage des données
Data1 = Replace(TextBox1, "_", "")
Data1 = Application.WorksheetFunction.Trim(Data1)
Data1 = Replace(Data1, " ", "")
j = 1
For i = 1 To 12
    Select Case i
        Case 1, 2, 3, 5, 6, 8, 9, 11, 12
            If IsNumeric(Mid(Data1, j, 1)) Then
                Data2 = Data2 & Mid(Data1, j, 1)
                j = j + 1
            Else
                Data2 = Data2 & "_"
            End If
        Case 4, 7, 10
            Data2 = Data2 & " "
    End Select
Next i
TextBox1 = Data2
flag = False
End Sub

Private Sub UserForm_Initialize()
    LeTexte = "___ __ __ __"
'              123456789012
    TextBox1.Value = LeTexte
    TextBox1.SelStart = 0
End Sub
La procédure TextBox1_KeyPress permet de gérer les codes et la longueur du texte.
La procédure TextBox1_Change permet de gérer soit le formatage des données ou la position du curseur. Cela fonctionne si on supprime un symbole numérique et un seul.

A tester.

JP
 

apt

XLDnaute Impliqué
Re : Masque de saisie

Bonsoir jp14,

Ca ne marche pas à tous les coups !

Le BackSpace fonctionne si la suppression des chiffres commence depuis le dernier caractère.

Mais depuis le milieu la suppression n'est active que sur deux caractères au maximum. Idem pour la touche "Suppr".

Ensuite un autre souci, c'est quand je veux saisir d'autres chiffres à la place de ce qui ont été supprimés (au milieu par exemple), les chiffres sont ajoutés en dernière position du TextBox au lieu d'être ajoutés à la place ou est arrêté le curseur.
 

Pièces jointes

  • masque_saisie_v2.xls
    39 KB · Affichages: 91
Dernière édition:

jp14

XLDnaute Barbatruc
Re : Masque de saisie

Bonjour

J'ai trouvé le code qui permet de connaitre la touche utilisé " KeyCode", ci dessous le code qui devrait répondre au problème
Les valeurs sont un tableau et SelStart permet de connaitre la position dans le texte.


Code:
Option Explicit
Dim Posinex As Byte
Dim tablo(1 To 12) As String * 1



Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
If KeyCode = 8 Then
Posinex = TextBox1.SelStart
Select Case TextBox1.SelStart
    Case 1, 2, 3, 6, 9, 12
        tablo(TextBox1.SelStart) = "_"
        consttext
        TextBox1.SelStart = Posinex - 1
    Case 5, 8, 11
        tablo(TextBox1.SelStart) = "_"
        consttext
        TextBox1.SelStart = Posinex - 2

        
End Select
KeyCode = 0
End If

If KeyCode = 46 Then
Posinex = TextBox1.SelStart
Select Case TextBox1.SelStart
    Case 0, 1, 4, 7, 10, 11
        tablo(TextBox1.SelStart + 1) = "_"
        consttext
        TextBox1.SelStart = Posinex + 1
    Case 2, 5, 8
        tablo(TextBox1.SelStart + 1) = "_"
        consttext
        TextBox1.SelStart = Posinex + 2
        
        
        
End Select
KeyCode = 0
End If
End Sub

Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)

If KeyAscii < 48 Or KeyAscii > 57 Or _
 Len(Replace(TextBox1, "_", "")) = 12 Then
    KeyAscii = 0
    Exit Sub
End If

Posinex = TextBox1.SelStart

Select Case TextBox1.SelStart
    Case 0, 1, 4, 7, 10, 11
        tablo(TextBox1.SelStart + 1) = Chr(KeyAscii)
        consttext
        TextBox1.SelStart = Posinex + 1
    Case 2, 5, 8
        tablo(TextBox1.SelStart + 1) = Chr(KeyAscii)
        consttext
        TextBox1.SelStart = Posinex + 2
End Select
KeyAscii = 0
End Sub


Private Sub UserForm_Initialize()
Dim i As Byte
    For i = 1 To 12
    tablo(i) = "_"
    Next i
    tablo(4) = " "
    tablo(7) = " "
    tablo(10) = " "
    consttext
    TextBox1.SelStart = 0
End Sub
Private Sub consttext()
Dim i As Byte
TextBox1 = ""
For i = 1 To 12
    TextBox1 = TextBox1 & tablo(i)
Next i
End Sub


Le code ci dessous permet de modifier un chiffre sans supprimer la valeur
Code:
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)

If KeyAscii < 48 Or KeyAscii > 57 Then
    KeyAscii = 0
    Exit Sub
End If
Posinex = TextBox1.SelStart
If Len(Replace(TextBox1, "_", "")) = 12 Then
Select Case TextBox1.SelStart
    Case 0, 1, 4, 7, 10, 11
        tablo(TextBox1.SelStart + 1) = Chr(KeyAscii)
        consttext
        TextBox1.SelStart = Posinex + 1
    Case 2, 5, 8
        tablo(TextBox1.SelStart + 1) = Chr(KeyAscii)
        consttext
        TextBox1.SelStart = Posinex + 2
End Select
KeyAscii = 0
Exit Sub
End If



Select Case TextBox1.SelStart
    Case 0, 1, 4, 7, 10, 11
        tablo(TextBox1.SelStart + 1) = Chr(KeyAscii)
        consttext
        TextBox1.SelStart = Posinex + 1
    Case 2, 5, 8
        tablo(TextBox1.SelStart + 1) = Chr(KeyAscii)
        consttext
        TextBox1.SelStart = Posinex + 2
End Select
KeyAscii = 0
End Sub

A tester

JP
 
Dernière édition:

apt

XLDnaute Impliqué
Re : Masque de saisie

Bonsoir jp14,

Ca avance bien.

Mais reste que je cherche à mémoriser la position d'ou à commencer la suppression dans la variable

SuppInd = TextBox.Selstart

En utilisant la touche "Suppr" les chiffres sont supprimés mais le curseur ne revient pas à la position d'ou on a utilisé la touche "Suppr" pour écrire à nouveau les chiffres, ce qui fait qu'ils sont écris depuis le dernier caractère effacé.

J’ai ajouté dans la version v3, le traitement des espaces entres les tirets.
 

Pièces jointes

  • masque_saisie_v3.xls
    49.5 KB · Affichages: 75

jp14

XLDnaute Barbatruc
Re : Masque de saisie

Bonjour

Pour déterminer le point de départ du curseur dans le cas d'une suppression, on a deux cas de figure

Code:
If KeyCode = 8 Then '-- BackSpace Key
Posinex = TextBox1.SelStart
' [COLOR="#FF0000"]le curseur se trouve après le chiffre à supprimer[/COLOR]
SuppInd = TextBox1.SelStart-1
Label10.Caption = SuppInd

............
End If

'___ __ __ __
'123456789012

If KeyCode = 46 Then '-- DEL Key
Posinex = TextBox1.SelStart
' [COLOR="#FF0000"]le curseur se trouve avant le chiffre à supprimer[/COLOR]
SuppInd = TextBox1.SelStart
................

Supprimer et remplacer demande en fait 2 actions.
Une autre approche consisterait à supprimer l'utilisation des deux touches de suppression et simplement remplacer la valeur erronée par la nouvelle valeur.

JP
 

apt

XLDnaute Impliqué
Re : Masque de saisie

Bonjour jp14,

Une solution de Patrick :

Code:
'************************************************************************************************************************************
'*                                SUJET:FORMATER UN TEXTBOX DYNAMIQUEMENT AVEC MASQUE DE SAISIE                                     *
'*                                                                                                                                  *
'*                                                HAUTEUR : patricktoulon pour DVP                                                  *
'*                                                                                                                                  *
'*                                                   FORMAT DE BASE: "000 00 00 00"                                                 *
'*                                                                                                                                  *
'*                                                          VERSION N° 4                                                            *
'*                                                                                                                                  *
'* Avec cette version on va formater la chaine a chaque pression sur une touche que l'on completera avec la chaine vide préformatée *
'*                                                                                                                                  *
'************************************************************************************************************************************
 
 
Const chainevide = "___ __ __ __"   'chaine vide Préformatée representant les 9 chiffres vides(non renseigné)
Dim pointeur As Long                'variable qui sera renseignée pour déterminer l'emplacement du curseur
Dim chaine As Variant               'variable alimentée avec les caracteres numeriques du textbox
Private Sub TextBox1_Change()
chaine = ""
For i = 1 To Len(TextBox1)
If IsNumeric(Mid(TextBox1, i, 1)) Then chaine = chaine & Mid(TextBox1, i, 1) 'si le caractere est numerique on l'ajoute a la chaine
If Len(chaine) = 3 Or Len(chaine) = 6 Or Len(chaine) = 9 Then chaine = chaine & " "
Next 'fin de boucle
 
If Len(chaine) > 12 Then chaine = Left(chaine, 12) 'on bloque la chaine a 12 caractere espaces compris
'si la chaine numerique n'a pas encore les 9 chiffres on ajoute la partie correspondante de la chaine vide
TextBox1 = chaine & Mid(chainevide, Len(chaine) + 1, 12 - Len(chaine) + 1)
' on place le curseur
TextBox1.SelStart = pointeur
End Sub
 
 
Private Sub TextBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
'si l'on double clic le groupe de chiffre au niveau du curseur qui est separé des _
autres par un espace de chaque coté est selectionné en bleu
'avec la variable selection on va pouvoir gérer la fonction"TextBox1_KeyDown"
 
selection = True 'selection d'un groupe de chiffre
End Sub
 
Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
Select Case KeyCode
 
Case "8" ' si on appuie sur la touche effacer
pointeur = TextBox1.SelStart - 1
If pointeur < 0 Then pointeur = 0
 
Case "46"
'si le curseur se trouve devant un espace il ne supprimera pas puisque les espace sont placé et ne doivent pas changer
' alors on decale le curseur de 1 caractere vers la droite
If Mid(TextBox1, TextBox1.SelStart + 1, 1) = " " Then
pointeur = TextBox1.SelStart + 1
'maintenant que le curseur se trouve devant le chiffre on supprime le chiffre a droite du curseur
TextBox1 = Replace(TextBox1, Mid(TextBox1, pointeur, 1), "")
Else
pointeur = TextBox1.SelStart
End If
 
Case 96, 97, 98, 99, 100, 101, 102, 103, 104, 105 ''si on appuie sur le pavé numérique de 0 a 9
' avant on a selectionner un groupe de chiffre par le double clic on bloque le curseur pour qu'il ne se deplace pas comme il devrait le faire
If selection = True Then pointeur = TextBox1.SelStart: selection = False
'si l'on est devant un espace on decale le curseur de 2(exemple :" 1" alors on place le curseur devant "1")
If Mid(TextBox1, TextBox1.SelStart + 1, 1) = " " Then
pointeur = pointeur + 2
Else
'autrementon decale simplement le curseur de 1 vers la droite
pointeur = pointeur + 1
End If
Case 106
'on vide le textbox la chaine vide se remettra automatiquement par le text_change
TextBox1 = ""
 
End Select
End Sub
'ET voila le tour est joué
'finalement les choses les plus simples restent les plus éfficaces
 
Dernière édition:

Discussions similaires

Réponses
12
Affichages
492

Statistiques des forums

Discussions
312 484
Messages
2 088 801
Membres
103 971
dernier inscrit
abdazee