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
237
14 janv. 2012 à 17:13
Non.
1) C'est bien et c'est largement suffisant tel quel.
2) Je tiens à saluer le fait que la méthode est de manière évidente le résultat de ton seul esprit de création. C'est ce fait, que j'apprécie avant tout




____________________
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

14 janv. 2012 à 21:57
En premier, tu crées une Textbox ensuite tu clones toute la forme.

Donc le "Fantôme" est la 8eme TextBox (TextBox8) créée dans laquelle on manipule les masques.

Corriges-moi si je me trompe
0
Utilisateur anonyme
14 janv. 2012 à 22:20
Salut apz,
si j'ai bien compris tu programmes uniquement en VBA? Je vais donc essayer de te créer un XLS avec le tout.

Merci pour vos commentaires



CF2i - Guadeloupe
Ingénierie Informatique
0
cs_apz
Messages postés
281
Date d'inscription
dimanche 7 avril 2002
Statut
Membre
Dernière intervention
11 avril 2013

14 janv. 2012 à 23:31
Salut acive,

J'utilise le VBA/Excel.
0

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

Posez votre question
Utilisateur anonyme
15 janv. 2012 à 00:30
Salut apz et Uc,
J'ai commencé la conversion de vb6 en VBA Excel mais je m'y perds, entre les enregistrements au 50.000 formats, les macros et les classeurs... VBA c'est pas trop mon truc, vous pouvez y jeter un oeuil?

Il faut créer une userform avec 5 textbox
textbox1 => rien
textbox2 => "### ## ## ##"
Textbox3 => "9"
textbox4 => "3"
textbox5 => "_"

Le code:
(il subsistent des erreurs)

Dim Masque, Caractère, St As String
Dim ChrsAffichés, Compteur, i, Rt As Integer
Dim ToucheSupp As Boolean

Private Sub TextBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
SelectNext
End Sub

Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If IsNumeric(Chr(KeyAscii)) = True Then
   If KeyAscii <> 8 Then
      TextBox1.Tag = TextBox1.Tag & Chr(KeyAscii)
      Formate
   End If
Else
   If KeyAscii = 8 Then
     St = TextBox1.Tag
     If Len(St) > 0 Then
        St = Replace(St, " ", "")
        St = Left(St, Len(St) - 1)
        TextBox1.Tag = St
        Formate
     End If
   End If
End If
'L'unique touche qui sera validée sera le BackSpace, le reste sera traité ci-dessus
If KeyAscii = 8 Then
   If Len(TextBox1.Tag) < 1 Then KeyAscii = 0
Else
   KeyAscii = 0
End If
End Sub

Private Sub TextBox1_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
If KeyCode = 46 Then Formate
SelectNext
End Sub

Private Sub TextBox1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
SelectNext
End Sub

Private Sub TextBox2_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
'On prend en compte uniquement la touche Backspace, les espaces et les "#"
If KeyAscii <> 35 And KeyAscii <> 32 And KeyAscii <> 8 Then KeyAscii = 0
End Sub

Private Sub TextBox2_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
'On supprime les éventuelles erreurs de double espaces
TextBox2.Text = Replace(TextBox2.Text, "  ", " ")
Masque = TextBox2.Text
Formate
End Sub

Private Sub TextBox3_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
'on prend en compte uniquement les chiffres et la touche BackSpace
If IsNumeric(Chr(KeyAscii)) False And KeyAscii <> 8 Then KeyAscii 0
End Sub

Private Sub TextBox3_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
'Au changement de la valeur on inscrit automatiquement le masque
'A l'utilisateur d'y inscrire les espaces après
If IsNumeric(TextBox3.Text) = True Then
   TextBox2.Text = ""
   For Rt = 1 To Val(TextBox3.Text)
      TextBox2.Text = TextBox2.Text & "#"
   Next Rt
   Masque = TextBox2.Text
   Formate
End If
End Sub

Private Sub TextBox4_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If IsNumeric(Chr(KeyAscii)) False And KeyAscii <> 8 Then KeyAscii 0
End Sub

Private Sub TextBox4_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
'Determine le nombre de caractères qui doivent rester visibles au début du texte
If IsNumeric(TextBox4.Text) = True Then
   If Val(TextBox4.Text) > Val(TextBox3.Text) Then TextBox4.Text = Val(TextBox3.Text)
   ChrsAffichés = Val(TextBox4.Text)
   Formate
End If
End Sub

Private Sub TextBox5_Change()
'Determine le caractère de substituition du masque
Caractère = TextBox5.Text
Formate
End Sub

Private Sub TextBox5_Enter()
TextBox5.SelStart = 0
TextBox5.SelLength = 1
End Sub

Private Sub TextBox5_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If KeyAscii 8 Then KeyAscii 0
End Sub

Private Sub UserForm_Initialize()
Masque = TextBox2.Text
Caractère = TextBox5.Text
ChrsAffichés = Val(TextBox4.Text)
Formate
TextBox1.SelStart = 0
TextBox1.SelLength = 0
TextBox1.MaxLength = Len(Masque)
TextBox5.MaxLength = 1
TextBox4.MaxLength = 1
End Sub

Private Sub SelectNext()
St = TextBox1.Tag
St = Replace(St, " ", "")
Compteur = 0
'On sélectionne le prochain emplacement
For i = 1 To Len(TextBox1.Text)
   If Mid(TextBox1.Text, i, 1) <> " " Then
      Compteur = Compteur + 1
      If Compteur > Len(St) Then
         TextBox1.SetFocus
         TextBox1.SelStart = i - 1
         TextBox1.SelLength = 0
         Exit For
      End If
   End If
Next i
'Si le numéro est complet on déselectionne le texte
'et le contenu de textbox1.Tag est prêt à être utilisé
If Len(TextBox1.Tag) = Len(Masque) Then
   TextBox1.SelStart = Len(TextBox1.Text)
   TextBox1.SelLength = 0
   'List1.AddItem textbox1.Tag
End If
End Sub

Private Sub Formate()
 i = 0
 St = ""
 'On supprime les espaces
 TextBox1.Tag = Replace(TextBox1.Tag, " ", "")
 'On remet le tout au format pré-défini
 For Rt = 1 To Len(Masque)
     If Mid(Masque, Rt, 1) = "#" Then
        i = i + 1
        If i > Len(TextBox1.Tag) Then Exit For
        St = St & Mid(TextBox1.Tag, i, 1)
     Else
        St = St & " "
     End If
 Next Rt
 TextBox1.Tag = St
 
 'Affichage du chiffre à titre d'exemple
 Me.Caption = "Le numéro est le: " & TextBox1.Tag

 'On remet le textbox1 au même format mais avec les caractères de
 'subtituition et en tenant compte des chiffre qui doivent rester visibles
 St = ""
 TextBox1.Text = ""
 i = 0
 For Rt = 1 To Len(TextBox1.Tag)
    If Mid(TextBox1.Tag, Rt, 1) = " " Then
       St = St & " "
    Else
       i = i + 1
       If i > ChrsAffichés Then
          St = St & Caractère
       Else
          St = St & Mid(TextBox1.Tag, Rt, 1)
       End If
    End If
 Next Rt
 'On remplit le restant du textbox1 conformément au masque
 If Len(TextBox1.Tag) < Len(Masque) Then
    For Rt = Len(TextBox1.Tag) + 1 To Len(Masque)
       If Mid(Masque, Rt, 1) = " " Then
          St = St & " "
       Else
          St = St & Caractère
       End If
    Next Rt
 End If

 TextBox1.Text = St
 End Sub


Merciii!....




CF2i - Guadeloupe
Ingénierie Informatique
0
ucfoutu
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
237
15 janv. 2012 à 06:15
A apt :
En premier, tu crées une Textbox ensuite tu clones toute la forme.

Donc le "Fantôme" est la 8eme TextBox (TextBox8) créée dans laquelle on manipule les masques.

Corriges-moi si je me trompe

- j'adore "tu clones toute la form" ! je n'ai même pas la moindre idée de ce que tu veux dire par là !
- il n'y a pas de textbox nommée Textbox8
Il est manifeste que tu n'as pas "chassé" (analysé), te contentant d'avoir des "impressions", à l'aide d'une lecture en diagonale.


____________________
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
237
15 janv. 2012 à 06:49
je te confirme cependant que fantome est bien évidemment une bien une textbox, tel que la ligne de code suivante ne le cache absolument pas, bien au contraire :
Set fantome = F.Controls.Add("Forms.TextBox.1")

____________________
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
237
15 janv. 2012 à 08:22
Bonjour, acive,

L'un de tes problèmes résulte d'une différence de comportement entre VB6 et VBA.
La touche Backspace (8), par exemple, n'est pas, contrairement à VB6, interceptée par l'évènement KeyPress, mais par l'évènement Keydown sous VBA (et retourne le paramètre Keycode avec la valeur 8 également).
Amitiés
Jacques


____________________
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
237
15 janv. 2012 à 08:28
Les codes Keycode retournés par l'évènement Keydown étant, notamment pour les chiffres, de même valeur que ceux du paramètre Keyascii retourné par l'évènement KeyPress, il te suffira d'utiliser KeyDown à la place de Keycode, partout où u utilises KeyPress (en changeant bien sur KeyAscii par Keycode).

____________________
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
237
15 janv. 2012 à 10:56
oublie mon tout dernier (lui seul) message : il n'est pas exact.
Et il y a d'autres petites choses..
Je regarde en revenant de la pêche.

____________________
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
Utilisateur anonyme
15 janv. 2012 à 14:06
Salut Jacques,
Merci pour le Chr(8) je le cherchais ce petit...

Ça devrait fonctionner (j'ai pas encore testé) j'avais peur parce que je fais un keyascii = 0 pour toutes les touches sauf le Chr(8), ce qui annule la frappe.

Bonne pêche, moi aussi je parts en plongée...





CF2i - Guadeloupe
Ingénierie Informatique
0
ucfoutu
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
237
15 janv. 2012 à 17:02
alors ?
aucun baliste ne t'a soufflé ce que m'a soufflé un sar ?
Et ce n'est pas évident du tout (merci petit poisson)

Efface tout ce que tu as dans l'évènement KeyPresse (à ne pas utiliser) de textbox1 et remplace par ceci :
Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
  If KeyCode > 95 And KeyCode < 108 Then
    If KeyCode <> 8 Then
      TextBox1.Tag = TextBox1.Tag & Chr(KeyCode - 48)
      Formate
    End If
  Else
    If KeyCode = 8 Then
     St = TextBox1.Tag
     If Len(St) > 0 Then
        St = Replace(St, " ", "")
        St = Left(St, Len(St) - 1)
        TextBox1.Tag = St
        Formate
     End If
   End If
  End If
'L'unique touche qui sera validée sera le BackSpace, le reste sera traité ci-dessus
  If KeyCode = 8 Then
   If Len(TextBox1.Tag) < 1 Then KeyCode = 0
  Else
   KeyCode = 0
  End If
End Sub


Applique le même principe à toutes les textboxes où tu fais un test sur le backspace

Autre chose :

Remplace l'évènement textbox5_Gotfocus (inexistant en VBA) par
Private Sub TextBox5_Enter()
  TextBox5.SelStart = 0
  TextBox5.SelLength = 1
End Sub


Voilà, en respectant ton code.
Si tu as une difficulté ===>> MP (moi, j'ai fait)
____________________
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
Utilisateur anonyme
15 janv. 2012 à 17:18
Re:
Merci Jacques,

Je me suis débrouillé tout seul finalement...

J'ai posté le XLS ICI

Du coup ma plongée est morte...

Merci encore


CF2i - Guadeloupe
Ingénierie Informatique
0
ucfoutu
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
237
15 janv. 2012 à 17:29
C'est bien et le mécanisme est plus logique que le premier.

Juste une chose :

Rentre dans ton projet, dégrade-le pour versions antérieures (97 - 2003 *.xls) ==>> remplace ton zip
Sinon : seuls les utilisateurs de 2007 et supérieurs pourront ouvrir le classeur
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
Utilisateur anonyme
15 janv. 2012 à 17:42
Oui, c'est vrai je m'en occupe.
Tu as vu que j'ai rajouté le choix du caractère séparateur?

Je vais voir pour faire une DLL avec tout ça, de façon que ça fonctionne avec .Net aussi

Cordialement



CF2i - Guadeloupe
Ingénierie Informatique
0
cs_apz
Messages postés
281
Date d'inscription
dimanche 7 avril 2002
Statut
Membre
Dernière intervention
11 avril 2013

15 janv. 2012 à 18:04
Bonsoir ucfoutu,

Effectivement je parle de cette ligne (Le fantôme):

Set fantome =  F.Controls.Add("Forms.TextBox.1")


Si tu affiches son nom dans une boite de dialogue elle te renverra bien : TextBox8

Et cette TextBox est à chaque fois déplacée sur le TextBox active.

Pour le "Clonage de la forme", tu as bien fais :

Set Fac  = F


Et avec cette Fac que tu travailles ?
0
ucfoutu
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
237
15 janv. 2012 à 18:27
Et ru appelles cela un clone ?
Assez inquiétant :
de l'aide en ligne, donc :
En règle générale, lorsque vous utilisez l'instruction Set pour associer une référence d'objet à une variable, aucune copie de l'objet n'est créée pour cette variable

Fac n'est pas un clone, mais l'userform lui-même
____________________
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
Utilisateur anonyme
15 janv. 2012 à 18:40
Eh bien,
je ne vois pas trop comment on est passé d'un masque de saisie au clonage...
Éloignons-nous(/vous) du sujet de départ?

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





CF2i - Guadeloupe
Ingénierie Informatique
0
ucfoutu
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
237
15 janv. 2012 à 18:47
à acive :
apz, qui se réfère au code que j'ai déposé et qui concerne tout masque de saisie, n'a tout simplement pas compris que fac n'était utilisé que par-ce-que tout le code était mis dans un module, de sorte à rendre plus clair celui de l'userform. Il en est à l'analyse du mécanisme impliquant un fantôme


____________________
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
Utilisateur anonyme
15 janv. 2012 à 19:43
Apz: Alors, selon wikipédia, (une recherche sur google) - dans ce lien:
Le terme module en programmation identifie une structure de programmation.

Ce qui fait que; si tu réfléchis en termes de bâtiment, la structure c'est ce qui supporte (et ce qui détermine les règles d'assemblage également) du restant des éléments du bâtiment.

Donc si tu as une structure qui permet l'ouverture d'une porte vers l'éxtérieur uniquement, c'est dans le "module" qui t'interdit de l'ouverture vers l'intérieur.

En programmation c'est la même, c'est un peu comme le code de la route, c'est publique, tout le monde doit le connaitre, au cas échéant tu auras des erreurs ou tu es simplement incapable de pratiquer l'interdit (comme dans le code de la route tu as une ammende, même en chine )





CF2i - Guadeloupe
Ingénierie Informatique
0