Forcer une saisie en majuscules dans un champ Access
Comment forcer une saisie en majuscules (ou inversement en minuscules) dans un champ de table Access ?
Première technique
La première technique consiste à intervenir directement au niveau du champ de table, grâce à la propriété « Masque de saisie
« . Pour cela :
- Ouvrez votre table en mode Création.
- Placez-vous sur le champ concerné.
- Dans les propriétés, renseignez le masque de saisie de cette manière :
>CCCCCCCCCC
Ce qu’il faut savoir :
- Dans un masque de saisie, le symbole
C
désigne n’importe quel caractère ou espace, en saisie facultative. Dans mon exemple, je suppose que le champ à forcer en majuscules fait donc 10 caractères facultatifs (puisque j’ai placé 10 fois le symboleC
). Si votre champ fait 30 caractères de long, vous devez placer 30 fois la lettreC
. Comme les caractères sont facultatifs, rien n’empêchera l’utilisateur de taper un mot de 5 lettres uniquement. - Pour rendre les caractères obligatoires, vous utiliseriez le symbole
&
à la place deC
. - Et surtout : le signe
>
force la transformation en majuscules des caractères qui le suivent. Dans mon exemple, il est placé en début de masque, ce qui veut dire que les 10 caractères qui suivront seront convertis en majuscules. - Pour forcer une conversion en minuscules, vous utiliseriez le signe
<
. - Du coup, un masque comme
>C<CCCC
signifierait : forcer la 1ère lettre (facultative) en majuscule, et les 4 suivantes (facultatives aussi) en minuscules.
Deuxième technique
La méthode précédente est rapide, assez simple à mettre en place, et elle a le mérite de se placer au niveau de la table. Mais elle a aussi quelques inconvénients à mon goût :
- Le fait de taper tous ces symboles, c’est loooong !
- Si je décide ultérieurement d’agrandir la taille du champ, il faut que je pense à ajouter d’autres caractères
C
dans le masque de saisie.
Du coup, voici une autre façon de faire, cette fois au niveau du formulaire :
- Ouvrez le formulaire qui sert à alimenter la table, en mode Création.
- Faites apparaître les propriétés du formulaire ou du champ concerné, onglet Evénement.
- Cliquez dans l’événement
Avant MAJ
, et réglez-le sur «Procédure événementielle
« , à l’aide de sa liste déroulante. - Cliquez sur les points de suspension à droite de l’événement, vous arrivez dans un bloc Visual Basic.
- Enfin, tapez quelque chose comme ceci (vous aménagez en fonction de vos noms de champs) :
Me.Nom_Acteur = UCase(Me.Nom_Acteur)
ou :
Me![Nom Acteur] = UCase(Me![Nom Acteur])
Dans mon cas, le champ à forcer en majuscules s’appelle Nom Acteur
. C’est la fonction VBA UCase()
qui effectue la conversion. La conversion se fera systématiquement avant que la saisie soit transférée dans la table.
Avant Maj
du formulaire, la conversion est faite au moment de l’enregistrement. Si vous utilisez l’événement du champ, la mise à jour est faite dès la sortie du champ.
merci pour cette information, mais pourquoi ne pas utiliser L au lieu de C…, pour les lettres, c’est plutôt L non?
L ou C sont effectivement applicables, c’est au choix. La différence étant que L désigne un caractère A-Z obligatoire, C un caractère A-Z-espace facultatif.
LLLL suppose donc une saisie systématique de 4 caractères, alors qu’avec CCCC on peut en saisir 0, 1, 2, 3 ou 4 (c’est donc plus souple).
Ouala !
Bonjour,
Toujours au chapitre conversion des données d’entrée, j’utilise l’evènement keypress de la rubrique pour substituer par exemple le chiffre 7 au caractère « è » (par ex. code postal ou N° de Téléphone) :
If KeyAscii = 232 Then KeyAscii = 55 pour cet exemple
Les utilisateurs de portable fâchés avec leur clavier sans pavé numérique comprendront sûrement l’intérêt de bout code
toutefois cela ne fonctionne pas si j’essaie de le transposer dans une fonction.
Cela est-il du à l’évènement KeyPress?
Quelqu’un a-t-il une idée ou une piste?
Un grand merci, Monsieur Inisan, pour tous ces tutos et ce travail colossal. Simple, clair, limpide (enfin pas toujours, mais cela ne vient pas de vous) MERCI
Je n’ai pas le code sous la main, mais j’aurais 2 remarques :
S’il y a possibilité de poster la fonction ici, je pourrai peut-être en dire plus.
Ouala !
Bonsoir,
La fonction ressemblerai à cela :
Function KeyPad()
If KeyAscii = 224 Then KeyAscii = 48
If KeyAscii = 38 Then KeyAscii = 49
If KeyAscii = 233 Then KeyAscii = 50
If KeyAscii = 34 Then KeyAscii = 51
If KeyAscii = 39 Then KeyAscii = 52
If KeyAscii = 40 Then KeyAscii = 53
If KeyAscii = 45 Then KeyAscii = 54
If KeyAscii = 232 Then KeyAscii = 55
If KeyAscii = 95 Then KeyAscii = 56
If KeyAscii = 231 Then KeyAscii = 57
End Function
N’ayant toujours pas trouvé comment la faire fonctionner, je mets ce code sur l’évènement Keypress de toutes mes rubriques numériques mais cela alourdi inutilement mon programme.
Votre remarque sur la procédure Keypress reste mystérieuse pour moi. Je crains de ne pas être encore arrivé à ce niveau…
Si vous avez une suggestion, ce sera avec plaisir.
Je vois mieux. En fait, la fonction
KeyPad()
n’a pas ici de paramètreKeyAscii
, ce qui fait que lesIf
ne peuvent pas fonctionner. J’écrirais d’abord ceci dans un module standard (pour que ce soit indépendant des formulaires) :J’ai remplacé les
If
par unSelect
, de manière à traiter le cas où le caractère ne doit pas être modifié (leCase Else
).Ensuite, pour chaque rubrique numérique, il faut quand même définir l’événement
KeyPress
. Mais cette fois, il se réduit à ceci :Ça devrait pouvoir coller… 🙂
Pfffft…. je ne dirais qu’un mot : Respect!
Non seulement ça marche mais en plus j’ai découvert l’instruction Select case. Merci infiniment :):):):)
Je profite de ce post pour vous demander où je peux acheter votre livre Access 2007 référence qui est épuisé partout? Allez-vous le rééditer ou le mettre à jour?
Content que ça puisse dépanner. 🙂
Le Référence 2007 est effectivement épuisé. Pour l’instant, je n’ai malheureusement pas le temps d’écrire une mise à jour pour Access 2013, bien que ça m’intéresserait. On va attendre la prochaine version d’Access… 😉
Autre possibilité, toujours sur un événement du champ concerné :
La mise à jour s’exécute au fur et à mesure de la saisie et en dur dans la table. Les accents en plus …
Bobe48000 > Si le nombre de chiffres est variable, le masque de saisie n’est sans doute pas adapté. La structure est vraiment variable ?
bon jour Hervé Inisan merci pour ces tuto
mon question est comment utilise un masque de saisie pour force l’écriture un certain nombre de chiffre suivie par » / » puis un nombre de chiffre par ex 1255/25 ou 111/127 . et surtout pas des lettre
merci pour votre aide d’avance
goran > Dans une table, les champs doivent être « atomiques » (une information simple et unitaire dans chaque champ). Ça veut dire que les nom et prénom ne devraient pas être stockés dans le même champ, il te faut 2 champs différents.
Ça permet plus tard de trier ou filtrer sur n’importe quel champ indépendamment, et de gérer différents problèmes d’affichage. Par exemple, sur un état, l’affichage que tu souhaites est une formule du type :
Inversement, si les 2 infos sont dans le même champ, il n’y a aucune méthode fiable pour résoudre ta question.
Bonsoir,
Je cherche depuis un certain temps comme faire pour que dans mon champ Nom Prénom qu’il m’écrive le NOM en majuscule et Prénom avec la première lettre en majuscule et le reste en minuscule et entre nom et prénom qu’il insère une virgule?
exemple: DUPONT,Jean
Par avance merci
mathieu2105 > Une piste, à froid comme ça, consisterait à utiliser la fonction
Replace()
de VBA, dans la 2ème méthode.Bonjour,
Merci pour la méthode, je voudrais en plus forcer la saisie sans accents? comment faire merci d’avance pour une éventuelle solution
Mathieu
otam > Effectivement, la solution est bonne s’il faut forcer les majuscules à la volée.
J’ai déposé un commentaire pour savoir comment enregistrer en majuscule une donnée absente d’une liste déroulante. En fait sur votre site il suffit de remplacer rst!Intitulé = NewData par rst!Intitulé = UCase(NewData) dans votre article AJOUTER UN ELEMENT DANS UNE LISTE DEROULANTE pour que la saisie soit comfortable
Bonjour,
La difficulté désormais consiste à forcer les majuscules lorsqu’une valeur n’est pas dans une liste déroulante issue d’une table et que l’on veut ajouter la nouvelle valeur à la dite table. Il y a semble-t-il conflit dans l’ordre des évènement.
La solution que j’ai trouvée a été de mettre >CCCCCC dans le masque de saisie du champ du formulaire pour enregistrer la valeur en majuscule dans la table.
Y avait-il plus simple?
citoyen_pip > Effectivement, la méthode VBA est toujours la meilleure pour ce type de traitement. 🙂
Maintenant, le fait que les accents soient conservés n’est pas un problème, c’est même plutôt une qualité (cf. « Majuscules accentuées » sur Wikipedia, et en typographie d’une manière générale).
attention, l’utilisation de « > » en format d’un champ texte de votre formulaire force uniquement l’AFFICHAGE du texte dans votre formulaire, dans votre table le texte sera toujours en minuscule !
si vous voulez enregistrer votre texte en majuscule « en dur » dans votre table, il faut alors utiliser la 2nde méthode (en utilisant avant MAJ) qui marche très bien… (à ceci près que vos majuscules conserve les accents)
possible924 > Dans le cas d’une conversion en majuscule, le
Avant MAJ
du champ n’est effectivement pas adapté (leAvant MAJ
du formulaire, leAprès MAJ
ou Perte Focus sont ok). Ce n’est pas facile à expliquer, mais il y a en quelque sorte « conflit d’événements », sur leAvant MAJ
du champ.La raison : je tape une info dans le champ (donc je déclenche une mise à jour). Mais avant cette mise à jour, une autre mise à jour est déclenchée par VBA. On a un problème similaire aux références circulaires d’Excel.
Dans les autres événements cités, la mise à jour faite par Access (la 1ère) est terminée lorsque les événements sont appelés. Il n’y a donc plus de conflit, et l’enchaînement est possible.
Bonjour,
Si je met ce code
Me.Usager_Nom = UCase(Trim(Me.Usager_Nom))
sur AvantMAJ, ça plante
et je reçois un message d’erreur « … empêche d’enregistrer les données dans le champ »
sur AprèsMAJ, ça marche
sur PerteFocus, ça marche
pourquoi ça ne marche pas sur AvantMAJ ?
abdelmajid > En fait, l’événement
Avant mise à jour
du champ peut faire l’affaire (il se produit avantLostFocus
, et il pourrait être annulé si nécessaire).c’est mieux de mettre le code suivant:
Me.Nom_Acteur = UCase(Me.Nom_Acteur)
dans l’événement LostFocus()
Cri > Laquelle des 2 méthodes as-tu employée ? Est-ce que tu as un message d’erreur ? Est-ce que le nom de ton champ est correct ?
forcer la majuscule dans une zone texte sous access, soit j’ai rien compris et donc je n’y suis pas arrivée soit elle marche pas
dommage
cri