Masque de saisie

cs_apz Messages postés 281 Date d'inscription dimanche 7 avril 2002 Statut Membre Dernière intervention 11 avril 2013 - 6 janv. 2012 à 21:48
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 - 15 janv. 2012 à 19:52
Bonsoir à tous,

J'aimerais appliquer un masque pour la saisie d'un numéro de téléphone de la sorte :

"011 __ __ __"

Un code ici :

http://www.excel-downloads.com/forum/175704-masque-de-saisie.html#post1079963

Mais reste à bien traiter la touche "Suppr".

Merci d'avance.

81 réponses

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
6 janv. 2012 à 22:47
BONJOUR?

1) je suis assez enclin à m'opposer à de tels procédés, alors qu'il est bien plus simple de forcer la saisie de chiffres uniquement (de très nombreux exemples sur ce forum) et leur nombre (MaxLength) puis de formater à la sortie.

2) je vois que tu reviens chez nous après 4 ans d'absence et uniquement après avoir tenté en vain sur un site que tu fréquentes bien plus souvent (on se demande pour quelle vraie raison )

Ce n'est alors que pour m'amuser que je t'invite à voir ce que ferait ceci (par exemple) :

Private Sub TextBox1_Change()
  Dim masque As String, plein As String
  Static anc As String
  masque = "### ## ## ##"
  plein = "000 00 00 00"
  If (TextBox1.Text & Mid(plein, Len(TextBox1.Text) + 1)) Like masque Then
    If Mid(masque, Len(TextBox1) + 1, 1) = " " Then
      If TextBox1.Text >anc Then TextBox1.Text TextBox1.Text & " "
    End If
    anc = TextBox1.Text
    Exit Sub
  End If
  TextBox1.Text = anc
End Sub


qui te met, dans la foulée, à l'abri de copier/coller non en conformité
Il est perfectible. J'ai par exemple limité l'effacement aux seuls backspaces entamés depuis la fin.

Voilà. A toi de jouer à le perfectionner, si tu le veux...
A toi, également, de voir "où l'on est mieux chez soi"


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
7 janv. 2012 à 01:26
Salut

As-tu seulement regardé dans le menu Format, Cellule, onglet Nombre et Catégorie Spécial ?
Ça existe déjà.
Si cela ne te convient pas, enregistre une macro pendant que tu utilises un des format prévu et regarde le code + apporte des modifications.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
7 janv. 2012 à 08:16
Bonjour, Jack,

apz a simplement été moins précis sur ce forum qu'il ne l'a été sur au moins deux autres sites.

C'est dan une textbox, qu'il souhaite faire ce contrôle de saisie.


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
cs_apz Messages postés 281 Date d'inscription dimanche 7 avril 2002 Statut Membre Dernière intervention 11 avril 2013
7 janv. 2012 à 10:00
Bonjour ucfoutu, jack

je vois que tu reviens chez nous après 4 ans d'absence et uniquement après avoir tenté en vain sur un site que tu fréquentes bien plus souvent (on se demande pour quelle vraie raison )


Il n'y a pas de mal de revenir après tant d'années ici ou sur d'autres forums.

Et c'est ma première application vba que je tente de réaliser après 4 ans de rupture avec la programmation VBA, comme que tu l'as cité.

En ce qui concerne ma problématique, alors je cherche à appliquer un masque de saisie d'un numéro de téléphone sur une TextBox, sous forme de tirets à la place des chiffres.
("___ __ __ __").

Mais je rencontrais un problème dans le traitement des touches "BACKSPACE" et "Suppr".

Maintenant, il reste le problème de la touche "Suppr" quand elle supprime les chiffres : le curseur avance au fur et à mesure de la suppression, mais en voulant ressaisir des nouveaux chiffres à la place de ceux supprimés, le curseur ne revient pas à la position d'ou à commencer la suppression, mais reste à la position du dernier chiffre supprimé.

Alors, J'aimerais mémoriser la position d'ou à commencer la suppression et y revenir à la détection de saisie du premier nouveau chiffre.

Option Explicit
Dim Posinex As Byte, SuppInd As Byte
Dim tablo(1 To 12) As String * 1
 
Private Sub TextBox1_Change()
Label2.Caption = TextBox1.SelStart 'Posinex
End Sub
 
Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
'___ __ __ __
'123456789012
 
If KeyCode = 8 Then '-- BackSpace Key
Posinex = TextBox1.SelStart
 
Label4.Caption = Posinex
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
    Case 4, 7, 10
        tablo(TextBox1.SelStart) = " "
        consttext
        TextBox1.SelStart = Posinex - 1
End Select
KeyCode = 0
End If
 
'___ __ __ __
'123456789012
 
If KeyCode = 46 Then '-- DEL Key
Posinex = TextBox1.SelStart
SuppInd = TextBox1.SelStart
 
Label6.Caption = Posinex
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
 
    Case 3, 6, 9
        tablo(TextBox1.SelStart + 1) = " "
        consttext
        TextBox1.SelStart = Posinex + 1
 
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
Label10.Caption = SuppInd
 
'___ __ __ __
'123456789012
 
Label8.Caption = Chr(KeyAscii)
 
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


Merci d'avance.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
7 janv. 2012 à 10:17
Désolé, mais je ne "prends pas le relais" (ce n'est pas dans mes habitudes) d'un code et d'une pensée de mécanisme que je n'ai pas élaborés.
Je t'ai dit deux choses, plus haut :
1)
je suis assez enclin à m'opposer à de tels procédés, alors qu'il est bien plus simple de forcer la saisie de chiffres uniquement (de très nombreux exemples sur ce forum) et leur nombre (MaxLength) puis de formater à la sortie.

et
2) après t'avoir montré nonobstant comment j'envisage personnellement le début d'un mécanisme (mon ode) :
Il est perfectible. J'ai par exemple limité l'effacement aux seuls backspaces entamés depuis la fin.

Voilà. A toi de jouer à le perfectionner, si tu le veux...

Ce que je t'ai montré est dans mon esprit le début d'une petite usine à gaz
Le code que tu montres est celui du début d'une énorme usine à gaz.

Petite ou grande, une usine à gaz n'en est pas moins une et je n'aime pas participer à sa construction.
Bonne chance.

____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
cs_apz Messages postés 281 Date d'inscription dimanche 7 avril 2002 Statut Membre Dernière intervention 11 avril 2013
7 janv. 2012 à 10:26
Salut,

Je t'ai montré le code que je m'en sers actuellement.

S'il y'a un chemin plus cours à parvenir à l'idée finale, je suis preneur.

Si tu veux développer la tienne, on travaillera dessus.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
7 janv. 2012 à 10:33
Si tu veux développer la tienne, on travaillera dessus

= >>
Si tu veux développer la mienne, tu travailleras dessus

s'il te plait.
Voilà !


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
7 janv. 2012 à 12:37
Enfin, quoi !

Lorsque je parle d'usine à gaz, ce n'est ni pour me moquer, ni pour te décourager, mais simplement pour te rappeler aux sens des réalités.
Même Microsoft, qui, pourtant, développe avec des langages d'un niveau nettement plus "bas", a choisi d'éviter les lourdeurs de tells "usines" !
Regarde donc, si tu veux t'en convaincre, comment l'on peur changer l'heure système (entre autres, car idem pour les clés d'activation)
Et constate les choix faits

Mais si tu tiens vraiment à construire une usine de ce genre :
- rien ne t'empêche de le faire :
---- soit en continuant/compliquant le bout de code que je t'ai montré
---- soit en "construisant" ton propre contrôle personnalisé, composé de plusieurs textboxes
---- soit en restant sur l'idée d'une usine et en utilisant une textbox superposée à une autre (et avec moult calculs tenant compte de nombreux aspects, dont celui de la taille de la police de caractères)

Je te rappelle également l'existence du contrôle activex "Masked Edit".

Je voudrais également te rappeler que les égarements en tous genres ne sont pas les meilleurs "perfectionnements". D'autres choses beaucoup plus utiles révèlent en général mieux la qualité d'une application
Amitiés



____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
cs_apz Messages postés 281 Date d'inscription dimanche 7 avril 2002 Statut Membre Dernière intervention 11 avril 2013
7 janv. 2012 à 12:40
OK !

Alors, pour le début, se service des tirets comme masque de saisie est difficile de le faire ou c'est impossible ?
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
7 janv. 2012 à 12:52
Ce n'est pas "impossible" ! Rien ne l'est en développement informatique dès lors que cela peut s'appuyer sur un raisonnement logique. Tout ce qui se pense logiquement peut être exprimé de la même manière (logiquement).

La question qui demeure, cependant est de ce type :
"suis-je prêt à dépenser n'importe quoi (ressources et lenteurs) pour faire en sorte que je puisse utiliser un fil, plutôt qu'un couteau, pour couper du beurre ?"
Car : certes, on pourrait utiliser un fil (en prenant moult précautions) ... mais avec quel bénéfice réel et "mesurable" ????? ==>> moi, vois-tu , je choisis le couteau

____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
7 janv. 2012 à 13:00
Autre exemple : celui du robot polyvalent que mon épouse a voulu avoir il y a plusieurs années, déjà :

Il lui faut (à elle) beaucoup plus de temps pour le sortir de son placard, l' "armer" pour la fonction "lamelles de pommes de terre", l'utiliser, le nettoyer, le remettre dans son placard, etc ... qu'il ne m'en faut pour ne me servir que des pommes de terres et d'un couteau.
Le pire : elle se sera fatiguée bien avant moi !

Il reste vrai que s'il s'agissait de traiter ainsi 50 kgs de pommes de terre (mais à quelle occasion rare ?) elle aurait raison d'utiliser le robot dont il s'agit.
As-tu là ta réponse ?
____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
cs_apz Messages postés 281 Date d'inscription dimanche 7 avril 2002 Statut Membre Dernière intervention 11 avril 2013
7 janv. 2012 à 15:11
Re,

Un raisonnement tout à fait logique.

Donc, tu me suggères de me contenter d'un simple masque sans tirets ?

D'accord
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
7 janv. 2012 à 16:07
Non !
relis-moi : je te conseille de ne contrôler que la saisie de chiffres et de la longueur et de ne formater qu'en sortant
Tout le reste est pure ... fantaisie alourdissante.

____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
7 janv. 2012 à 16:29
Inspire-toi par exemple de ce que fait ceci, avec une textbox nommée TexBox4, sans limiter son MaxLength

Private Sub TextBox4_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
  If KeyAscii = 8 Then Exit Sub
  If Not IsNumeric(Chr(KeyAscii)) Then KeyAscii = 0
End Sub
Private Sub TextBox4_Exit(ByVal Cancel As MSForms.ReturnBoolean)
 If Not Replace(TextBox4.Text, " ", "") Like "#########" Then
   MsgBox "saisie erronée - saisissez 8 chiffres"
   Cancel = True
 End If
   TextBox4.Text = Format(TextBox4.Text, "### ## ## ##")
End Sub


Ce n'est qu'un exemple.
Tu verras ce qui se passe en quittant la textbox.


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
7 janv. 2012 à 16:30
Pardon 9 et pas "8 chiffres", hein ...


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
cs_apz Messages postés 281 Date d'inscription dimanche 7 avril 2002 Statut Membre Dernière intervention 11 avril 2013
9 janv. 2012 à 13:09
Bonjour ucfoutu,

Ne pas appliquer de masque en début facilite bien l'utilisation des touches "Suppr" et "BackSpace".

Mais quand même, j'aimerais bien avoir le masque appliqué au fur et à mesure de la saisie
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
9 janv. 2012 à 13:27
Ben ...
Si, comme je te l'ai déjà dit deux fois, tu es à ce point attiré par ce genre de gadget (qui ne m'intéresse personnellement pas), amuse-toi, mais sans moi (je ne dépense en général mon temps que pour ce qui a un réel intérêt. Et jamais si, de surcroît, on doit construire une "usine à gaz").
Amuse-toi bien.


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
9 janv. 2012 à 13:35
Et si tu veux vraiment faire ce gadget : alors sois sérieux et fais un contrôle personnalise (activex). Il te faudra cependant autre chose que VBA.
Et si tu veux à tout prix faire un "ersatz" à l'aide de VBA === >> usine à gaz ( ter repetita).


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
9 janv. 2012 à 13:42
Et pour ton info (égalemernt répété) . Ce contrôle personnalisé existe. Il a pour nom "MaskedEdit" et c'est l'activex MSMASK32.OCX
Si tu te sens vraiment la force de faire mieux (surtout avec VBA) nous te couronneront super-champion.


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
cs_apz Messages postés 281 Date d'inscription dimanche 7 avril 2002 Statut Membre Dernière intervention 11 avril 2013
9 janv. 2012 à 20:36
Salut,

Non, je voulais dire par masque celui avec des espaces.

Exemple :

Private Sub TextBox1_Change()
    Dim Val As String
    Val = TextBox1.Text
    If Len(Val) 3 Or Len(Val) 6 Or Len(Val) = 9 Then
        Val = Val & " "
    End If
    TextBox1.Text = Val
End Sub





-----------------------------------------
Debutant Excel/VBA, PHP/SQL, Delphi

Club de correspondance :
http://membres.lycos.fr/elatlasclub
-----------------------------------------
0
Rejoignez-nous