XL 2010 Propriété MaxLength d'une TextBox pour saisie n° de téléphone

Eric C

XLDnaute Barbatruc
Bonjour le forum
Bonjour à tous & à toutes

Lorsque je désire saisir un numéro de téléphone via une TextBox, j'utilise ce code :
VB:
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    TextBox1.Value = Format(TextBox1.Value, "0# ## ## ## #")
End Sub
Celui-ci fonctionne très bien sauf que je ne peux y adjoindre la propriété MaxLength pour limiter sa saisie ce qui fait que si par mégarde j'ajoute un chiffre de trop, le numéro est à ressaisir...
Ma question est simple : pourquoi ?
Si je retire le "0" (qui n'apparaitra plus dans la valeur de la TextBox (Numéro de téléphone saisi)), je peux indiquer le MaxLength.

Ou peut etre y a t'il une autre proposition de code (j'ai un problème avec les accents circonflexes, il faudra que je nettoie mon clavier).

Sur ce bonnes fetes de fin d'année à toutes & à tous.
Eric c
 

Eric C

XLDnaute Barbatruc
Re,

En cherchant un peu (chose que je n'avais pas faite (méa culpa), j'ai dégoté un code de notre ami Patrick (que je salue au passage) qui fait ce que je désire :
VB:
Private Sub TextBox2_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    If Not Chr(KeyAscii) Like "[0-9]" Then KeyAscii = 0 'on ne peut taper que des chiffre dans le textbox
    With TextBox2
        .Text = Mid(.Text & Chr(KeyAscii), 1, 14) ' le caractere n'est pas pris en compte lors du keypress on y remedie et on bride en meme temps à 14 caracteres espaces compris
        If "2 5 8" Like "*" & Len(.Text) & "*" Or Len(.Text) = 11 Then .Text = .Text & " " ' l'espace
    End With
    KeyAscii = 0 'comme on a forcé la mise a jour du caractère tapé dans le keypress, on annule la touche sinon le chiffre va etre tapé deux fois
End Sub

@+ Eric c
 

patricktoulon

XLDnaute Barbatruc
re
Bonjour @Eric C
il manque pas un "#" dans ton format?

VB:
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
TextBox1.Value =mid( Format(TextBox1.Value, "0# ## ## ## #"),1,14)
End Sub
et en plus ca ne peut pas fonctionner comme ça j'ai testé le format n'est pas bon à la fin

Arrête de t'ambrouiller la vie ;)
tu fait pareil qu'avec ma méthode keydown
VB:
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
   With TextBox1
   Select Case KeyAscii
    Case 48 To 57
     If Len(.Value) = 14 Then KeyAscii = 0
     Select Case Len(.Value): Case 2, 5, 8, 11: .Value = .Value & " ": End Select
    Case Else: KeyAscii = 0
    End Select
End With
End Sub
 

patricktoulon

XLDnaute Barbatruc
j'ai testé comme ca ca marche aussi mais c'est pas ergonomique
Code:
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    TextBox1.Value = Mid(Format(TextBox1.Value, "0# ## ## ## #"), 1, 14)
End Sub
pourquoi ce n'est pas ergonomique?:
1° dès le premier chiffre tapé on a les 14 "00 00 ...."
2°les chiffres tapés sont à droite de cette chaine (quand on se trompe il faut remonter)

tandis qu'avec ma méthode il n'y a que les chiffre tapés + les espaces automatique
en cas d'erreur c'est plus facile de remonter
 

Eric C

XLDnaute Barbatruc
Re,

Merci à toi Patrick. Ta dernière version mise en ligne (#4) ne fonctionne pas, tu peux encore entrer 2 chiffres après le n° de téléphone. Un peu comme avec la propriété MaxLength à 14 ????
Je ne comprends pas trop, c'était pour avoir une réponse mais je reste sur ma faim. ????

Je conserve la version du post #3 -
Bonnes fetes de fin d'année
Eric c
 

patricktoulon

XLDnaute Barbatruc
re
pour les keycode les plus courants
96 to 105 c'est le pavé (0 à 9) - > conversion keycode-48=keyascii
48 to 57 c'est les chifrres en haut du clavier (0 à 9) - > conversion keycode=keyascii
97 to 122 les lettre de A à Z - > conversion keycode-32=keyascii
13 enter
9 tabulation
26,27,28,29 les flèches
11 control

regarde c'est pareil même effet
VB:
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    With TextBox1
        Select Case KeyAscii
        
        Case 48 To 57
            If Len(.Value) = 14 Then KeyAscii = 0
            Select Case Len(.Value): Case 2, 5, 8, 11: .Value = .Value & " ": End Select
        
        Case Else: KeyAscii = 0
        
        End Select
    End With
End Sub


Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    With TextBox1
        Select Case KeyCode
        
        Case 96 To 105, 48 To 57
            If KeyCode < 96 Then KeyCode = KeyCode + 48 'conversion du haut du clavier
            If Len(.Value) = 14 Then KeyCode = 0
            Select Case Len(.Value): Case 2, 5, 8, 11: .Value = .Value & " ": End Select
        
        'autre case touche ici selon le besoins
      
        Case Else: KeyCode = 0
        
        End Select
    End With
End Sub
 

job75

XLDnaute Barbatruc
Bonjour Eric C, Patrick,

Ceci est très simple et facile à comprendre :
VB:
Private Sub TextBox1_Change()
Dim x$, i%, y$
x = TextBox1
For i = 1 To Len(x)
    If IsNumeric(Mid(x, i, 1)) Then y = y & Mid(x, i, 1)
Next
y = Left(y, 10)
For i = 2 To 11 Step 3
    y = RTrim(Left(y, i) & " " & Mid(y, i + 1))
Next
TextBox1 = y
End Sub
A+
 

patricktoulon

XLDnaute Barbatruc
re
@job75
là encore une fois on voit bien les limites du formatage au change
au plus facile ;essaie donc de revenir sur le dernier chiffre pour le changer ;)
et bien tu ne peux pas tu es bloqué

vous pouvez me croire j'ai tourné ca dans tout les sens
l'event change n'est pas adapté pour faire du formatage dynamique en restant libre
c'est mort! mort! mort! mort!
et pourquoi les event key (press et down) je le redis
parce que l'on a la possibilité de l'intercepter a chaque instant
je vais pas vous cacher que j'ai trouvé la solution pour le change mais au prix de mini usine a gaz
 

patricktoulon

XLDnaute Barbatruc
ma version avec le change
astuce de chez patricktoulon 😂😂
dans cette astuce on utilise le tag du textbox
dans le quel on memorise la valeur <<a chaque fin d'event change!!!>> en enlevant le dernier caractère!!
si au change on est plus grand alors avance sinon on laisse vba faire
VB:
Private Sub TextBox3_Change()
    Dim x$
    With TextBox3
        x = .Text
        If Len(x) > Len(.Tag) Then
            Select Case Len(x): Case 2, 5, 8, 11: x = x & " ": End Select
            .Value = Mid(x, 1, 14)
        End If
        If .Text <> "" Then .Tag = Left(.Text, Len(.Text) - 1)
    End With
End Sub
;)
@job75 ta solution fonctionne visiblement je sais pourquoi tout a l'heure la touche back bloquait
 

patricktoulon

XLDnaute Barbatruc
re
bien sur si le Tag sert a autre chose ou si c'est un textbox sur feuille (donc pas de tag) on utilisera une variable statique
VB:
Private Sub TextBox3_Change()
    Dim x$: Static Back$
    With TextBox3
        x = .Text
        If Len(x) > Len(Back) Then
            Select Case Len(x): Case 2, 5, 8, 11: x = x & " ": End Select
            .Value = Mid(x, 1, 14)
        End If
        If .Text <> "" Then Back = Left(.Text, Len(.Text) - 1)
    End With
End Sub
;)
 

Discussions similaires

Statistiques des forums

Discussions
313 258
Messages
2 096 614
Membres
106 685
dernier inscrit
phob