Autres Masque de saisie universel pour formats spéciaux saisis dynamiquement dans un TextBox

Eric C

XLDnaute Barbatruc
Bonsoir le forum

De très nombreux sujets ont trait aux formats spéciaux saisis à l'aide d'une TextBox (N° d'immatriculation de véhicules – N° SIRET de société – N° de sécurité sociale – N° spéciaux de téléphone étrangers…….).

Une demande, faite en 2018, par notre ami Cathodique ;) concernait la saisie dynamique d'un N° SIRET Entreprise (Le lien ). Des réponses fournies, j'ai remarqué que celle de notre ami job75 ;), pouvait être aisément reprise et aménagée pour d'autre types de formats.

A cet effet, j'ai "déterré" ledit post qui avait été vu par quelques 650 internautes, à l'époque, en demandant si la saisie jusqu'alors uniquement numérique pouvait être modifiée afin de devenir saisie alphanumérique et ce afin d'élargir la saisie à d'autres formats spéciaux .

Est arrivé notre ami patricktoulon ;), qui nous a sorti de sa besace le fichier par EXCELlence : Un masque de saisie universel pour une grande partie des formats spéciaux (Post vu ~ 250 fois).

Ma question : peut-on améliorer le fichier afin de saisir des caractères alphanumériques incluant des ponctuations, des chiffres ainsi que des lettres Majuscules & Minuscules. Un grand Merki par anticipation.

Bonne soirée & bon ouikand à toutes & à tous
@+ Eric c
 

Pièces jointes

  • textbox formaté par mask de saisie (3).xlsm
    15.1 KB · Affichages: 31
Dernière édition:

Eric C

XLDnaute Barbatruc
Bonjour le forum
Bonjour le fil
Bonjour Patrick, bonjour job75

Waouh ! Que de travail accompli depuis mon absence. Je n'ai rien à redire quant à ton travail Patrick. De plus, déjà 170 "visiteurs", preuve que cela intéresse nombre d'entre nous !!
@job75 ;) - J'ai aimé (déjà dit), le travail que vous aviez fourni dans le post initial et l'ai "déterré" afin qu'il serve à la communauté. Je désirais cependant qu'il soit adaptable à la saisie AlphaNumérique. Personne, hormis notre ami patricktoulon ;) , n'est venu alimenter, de façon constructive, l'évolution de mon projet....
Dans le présent post, vous avez amené votre touche personnelle et je vous en remercie. Toutefois, cela ne me convient pas car si l'on transpose le code dans un UserForm avec un TextBox, le masque ne peut en aucun cas être "modélisé" depuis le code sans fausser la saisie. J'ose espérer que vous ne me tiendrez pas rigueur de part mes propos :(
Bonne fin de dimanche à toutes & à tous
@+ Eric c
 

job75

XLDnaute Barbatruc
Bonjour Eric C,
Toutefois, cela ne me convient pas car si l'on transpose le code dans un UserForm avec un TextBox, le masque ne peut en aucun cas être "modélisé" depuis le code sans fausser la saisie.
Que dites-vous là ? Il n'y a aucun problème pour adapter le code à un UserForm, voyez le fichier joint.

A+
 

Pièces jointes

  • Masque USF(1).xlsm
    24.1 KB · Affichages: 13

Eric C

XLDnaute Barbatruc
Re,

@ Monsieur job75. Vous savez ou devriez savoir oh combien je vous respecte sur ce forum (d'ailleurs il n'y a que sur ce forum que je vos connais ... et c'est dommage... Avec mon ancienne profession, je n'ai jamais pu assister aux réunions qui ont eu lieu entre forumeurs). Vous avez fait du bon boulot mais ce que je veux dire c'est que le masque ne peut être modifié en dur (dans le code). Si on le modifie, la saisie est faussée.
Très cordialement
 

job75

XLDnaute Barbatruc
Allons, le masque de saisie peut toujours être modifié sans inconvénient dans le code de l'UserForm !

Maintenant une petite gymnastique dans ce fichier (2) pour le cas où la TextBox peut perdre le focus.

Quand on revient dans TextBox1 le curseur se positionne après l'exécution de la macro TextBox1_Enter.

Il faut donc différer l'exécution de TextBox1_Change :
VB:
Private Sub TextBox1_Enter()
Application.OnTime 1, "Entrer" 'exécution différée
End Sub
avec dans Module1 :
VB:
Sub Entrer()
UserForm1.TextBox1 = UserForm1.TextBox1 & " "
End Sub
 

Pièces jointes

  • Masque USF(2).xlsm
    25.6 KB · Affichages: 12

Eric C

XLDnaute Barbatruc
@ Gérard (je m'autorise... Si vous n'êtes" pas okay, alors veuillez me le dire). Concernant la modification de la saisie du masque; en dur, voilà que je que j'obtiens au final :
TxtB.gif
 

job75

XLDnaute Barbatruc
Bonjour Eric C, le forum,

Si vous n'avez pas fini l'exercice voyez ce fichier (3) avec le nouveau masque de saisie et cette macro :
VB:
Private Sub TextBox1_Change()
Dim x$, t$, i%, j%, pos%
x = "- / -- -: --- --- --" 'masque de saisie avec tirets, espaces et autres caractères
t = Replace(Replace(Replace(Replace(TextBox1, "-", ""), " ", ""), "/", ""), ":", "")
For i = 1 To Len(t)
    For j = j + 1 To Len(x)
        If Mid(x, j, 1) = "-" Then
            x = Left(x, j - 1) & Mid(t, i, 1) & Mid(x, j + 1)
            pos = j
            Exit For
        End If
Next j, i
If Not retour Then pos = InStr(pos + 1, x & "-", "-") - 1 'tiret suivant
TextBox1 = x
TextBox1.SelStart = pos + IIf(pos, retour, 0)
TextBox1.SelLength = 1
End Sub
Bonne journée.
 

Pièces jointes

  • Masque USF(3).xlsm
    24.2 KB · Affichages: 17

Eric C

XLDnaute Barbatruc
Bonjour le forum
Bonjour le fil
Bonjour Patrick, bonjour Gérard

Comme précisé dans le titre (post vu près de 250 fois.... Je le savais qu'il serait intéressant ce fil) masque Universel, donc chacun pourra y mettre ce qu'il désire au niveau ponctuation et caractères alphanumériques. EXCELlent ce dernier fichier.

Une question avant de partir : Où trouver les valeurs des constantes des différents KeyCode utilisées dans le code de Patrick ? J'ai bien trouvé VbKeyReturn (valeur O*8) et VbKeyEscape (valeur O*1B) mais pas KeyCode 8 ou 46 ????
Bonne journée à toutes & à tous
ET Encore MERKI à vous
@+ Eric c
 

ChTi160

XLDnaute Barbatruc
Bonjour Eric,Job75
le Fil,le Forum
une question n'y aurait il pas la possibilité d'utiliser
un array des caracteres utilisables
Dim ArraySpecials
Ex :
VB:
ArraySpécials=Array(" " ,"/","\",":","|")'Etc Etc
puis de faire une boucle
Ex :
VB:
For i =0 to Ubound(ArraySpecials)-1
t=Replace(TextBox1,ArraySpecials(i),"")
Next i
Peut être pas compris le principe de fonctionnement , mais bon !
Merci Messieurs
jean marie
 

patricktoulon

XLDnaute Barbatruc
re
non job ca ne remplace pas

demo3.gif



comme tu peux le voir quand j'ai retapé "1" dans la sélection çà a fait revenir tout ce qui suit (donc suppression de 2 caractères
et le selstart est reparti au 1er caractere masque dispo

pour que nous nous comprenions
cahier des charge
masque de saisie toute forme doit être accepté
la rédaction avance fur et a mesure
la touche back(retour en arrière) efface le précèdent et remet le caractère du mask si sellength=0
si sellength>1 alors remet les caractères du masque SANS!! ramener ce qui suit (chez toi pas ok et impossible avec ta méthode double boucle puisque le caractères est tapé et c'est l’événement change donc l'action est entériné)

les touches autorisée doivent inscrire le caractère ET!!! les caractères correspondant au sellength (ca pas ok chez toi est impossible avec cette méthode )
exemple J'ai ABCDEFGHIJKL je sélectionne au milieu du texte DEFG et tape "Z" ca doit me marquer "ABCZ---HIJ" à l'endroit même de la sélection
et le selstart se positionne après "Z"

en gros pour te la faire courte le textbox doit se comporter comme si chaque caractères était un textbox

et ta méthode double boucle sur le replace du masque et redistribution ne pourra jamais le permettre

ma méthode est simple
elle se base sur l'interception du keycode et application dans variable text et invalidation du keycode (et oui keycode vaut toujours 0)
on a ainsi le caracteres entériné MAIS !! dans la variable text contenant le textbox en l'etat
elle se base aussi sur le selstart et sellength (+1 pour obtenir le mid) et replacement par le même mid du mask et vise et verca
et cela avec les touches( alpha numérique , pavé numérique , 8, 46 , 37, 39 , 13 et/ou 9 pour sortie )

en fin de case .value=txt

voila on a la fois le caractère entérine a la bonne place je peux faire ce que je veux dessus AVANT que ca soit entériné dans le textbox comme ca l'est avec le change
si tu remplace ta sous boucle par le instr(1,mask,,caractere du masque)tu peux deja jouer un peu mieux avec les emplacements

demonstration
exemple avec mon double inputdateBox
demo3.gif


avec ta méthode il te sera impossible de faire ca
 

job75

XLDnaute Barbatruc
Bonjour Jean-Marie,
une question n'y aurait il pas la possibilité d'utiliser
un array des caracteres utilisables
Bien sûr mais avec mon code il est plus simple de faire comme ceci :
VB:
x = "- / -- -: --- --- --" 'masque de saisie avec tirets, espaces et autres caractères
t = TextBox1
For i = 1 To Len(x): t = Replace(t, Mid(x, i, 1), ""): Next
Fichier (3 bis).
 

Pièces jointes

  • Masque USF(3 bis).xlsm
    24.4 KB · Affichages: 13

patricktoulon

XLDnaute Barbatruc
re
ben c'est moi qui l'ai pondu et c'est sur cette base que eric est parti
et si tu regarde les cases c'est pas si compliqué que ça

simple çà doit l’être pour l'utilisateur
si je dois me repositionner avec la souris a chaque fois pour modifier un caractère dans une sélection dans la chaîne tu en conviendra c'est pénible
donc pas simple pour l'utilisateur ;)

cela dit pour une simple rédaction et/ou re rédaction complète j'utiliserais le tiens
je supprimerais la gestion des autres touches et ne garderais que la suppr (par exemple)et celle qui sont autorisées
donc je me trompe --> suppr efface tout et remet le mask --> réédition
la oui je suis d'accords c'est simple (a mettre en place et en utilisation) bien que ça fout un peu les boules si la chaîne est complexe ou longue comme un iban ou une ref avec suffixe et autre
mais dans ce cas la on vire le change pour le keydown

tout ça est prévu dans mon select case
si j'en suis arrivé a cette solution c'est que je l'ai fait tester par des personnes douées et moins douées elles ont eu toutes la mêmes réponse
le clap souris/clavier les a vite gonflé
et c'est un sujet que je traite depuis un moment déjà et qui a fait grand débat (quand a son utilité avéré) sur un autre forum
certains pensent que c'est du temps perdu et q'un simple test de validité afterupdate ou en exit est suffisant
perso je pense que j'ai rien inventé les masques de saisie existaient déjà et c'est pas pour rien

et en plus ça me détends de faire des trucs comme ça;)
 

Discussions similaires