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
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
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
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
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
Merci Patrick pour tes explications. Code parfait et fonctionnel.
J'ai regardé un peu le controle KeyDown, c'est assez ardu avec tous ces KeyCodes à connaitre. Ce n'est pas demain que je m'y attelerai
@+ Eric
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
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
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
Bonjour job75.
Pour ma part, dans le code de notre ami Gérard (que je salue), je peux également revenir sur le ou les derniers caractères saisi(s).
@+ Eric c
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
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