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 :

  1. Ouvrez votre table en mode Création.
  2. Placez-vous sur le champ concerné.
  3. 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 symbole C). Si votre champ fait 30 caractères de long, vous devez placer 30 fois la lettre C. 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 de C.
  • 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.
Conseil
Pour obtenir la liste des caractères autorisés dans un masque de saisie, consultez l’aide d’Access.

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 :

  1. Ouvrez le formulaire qui sert à alimenter la table, en mode Création.
  2. Faites apparaître les propriétés du formulaire ou du champ concerné, onglet Evénement.
  3. Cliquez dans l’événement Avant MAJ, et réglez-le sur « Procédure événementielle« , à l’aide de sa liste déroulante.
  4. Cliquez sur les points de suspension à droite de l’événement, vous arrivez dans un bloc Visual Basic.
  5. 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.

Info
Si vous utilisez l’événement 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.

Vous aimerez aussi...

26 réponses

  1. atexcel dit :

    merci pour cette information, mais pourquoi ne pas utiliser L au lieu de C…, pour les lettres, c’est plutôt L non?

    • Hervé Inisan dit :

      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 !

  2. zoconline dit :

    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

    • Hervé Inisan dit :

      Je n’ai pas le code sous la main, mais j’aurais 2 remarques :

      • Le fait de passer par une fonction (ou une procédure) externe est une bonne idée, ça permet d’externaliser le code et de le réutiliser ailleurs.
      • La procédure KeyPress doit quand même être définie pour répondre à l’événement. L’idée est que ce bout de code va appeler la fonction.

      S’il y a possibilité de poster la fonction ici, je pourrai peut-être en dire plus.
      Ouala !

      • zoccolo dit :

        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.

        • Hervé Inisan dit :

          Je vois mieux. En fait, la fonction KeyPad() n’a pas ici de paramètre KeyAscii, ce qui fait que les If 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 un Select, de manière à traiter le cas où le caractère ne doit pas être modifié (le Case 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… 🙂

          • zoccolo dit :

            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?

          • Hervé Inisan dit :

            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… 😉

  3. Vini76 dit :

    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 …

  4. Hervé Inisan dit :

    Bobe48000 > Si le nombre de chiffres est variable, le masque de saisie n’est sans doute pas adapté. La structure est vraiment variable ?

  5. Bobe48000 dit :

    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

  6. Hervé Inisan dit :

    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.

  7. goran dit :

    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

  8. Hervé Inisan dit :

    mathieu2105 > Une piste, à froid comme ça, consisterait à utiliser la fonction Replace() de VBA, dans la 2ème méthode.

  9. mathieu2105 dit :

    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

  10. Hervé Inisan dit :

    otam > Effectivement, la solution est bonne s’il faut forcer les majuscules à la volée.

  11. otam dit :

    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

  12. otam dit :

    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?

  13. Hervé Inisan dit :

    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).

  14. citoyen_pip dit :

    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)

  15. Hervé Inisan dit :

    possible924 > Dans le cas d’une conversion en majuscule, le Avant MAJ du champ n’est effectivement pas adapté (le Avant MAJ du formulaire, le Aprè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 le Avant 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.

  16. possible924 dit :

    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 ?

  17. Hervé Inisan dit :

    abdelmajid > En fait, l’événement Avant mise à jour du champ peut faire l’affaire (il se produit avant LostFocus, et il pourrait être annulé si nécessaire).

  18. abdelmajid dit :

    c’est mieux de mettre le code suivant:
    Me.Nom_Acteur = UCase(Me.Nom_Acteur)
    dans l’événement LostFocus()

  19. Hervé Inisan dit :

    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 ?

  20. cri dit :

    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

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *