Tester l’existence d’une valeur de clef

Je dispose d’un formulaire de saisie. La clef primaire doit être saisie sur ce formulaire (il ne s’agit pas d’un NuméroAuto). Lorsque je tape une clef qui existe déjà dans la table, Access m’affiche un message d’erreur (ce qui est normal). Comment vérifier si la clef existe déjà, pour éviter le message d’erreur d’Access ?

Le principe

Il y  a plusieurs méthodes pour atteindre notre objectif. Classiquement, on a le réflexe d’écrire un bout de code VBA pour vérifier par soi-même si la valeur de clef est déjà présente dans la table, et afficher un message en conséquence. Mais ce n’est pas forcément la peine : Access fait forcément cette vérification lui-même, puisque ça fait partie de « ses règles du jeu ». Pourquoi réinventer la roue ?

Concrètement, au moment où les données du formulaire sont validées (« vont être transférées dans la table »), Access vérifie si la clef saisie existe déjà. Si c’est le cas, Access affiche une erreur standard, correspondant à l’erreur numéro 3022 (clef dupliquée).

Mais avant d’afficher cette erreur, il appelle un événement appelé « Sur erreur » (Form_Error), qui vous permet d’intercepter l’erreur, d’afficher votre propre message, et d’annuler celui d’Access. C’est là que tout se joue…

Mise en place

  1. Ouvrez votre formulaire en mode Création.
  2. Faites apparaître les propriétés du formulaire, notamment l’onglet Événement.
  3. Cliquez dans l’événement Sur erreur, déroulez la liste proposée, puis choisissez Procédure événementielle.
  4. Cliquez sur les points de suspension à droite de l’événement, pour passer dans le code VBA.
  5. Faites en sorte que votre événement ressemble à ceci :

Apuka tester !

  • Le fait d’utiliser un Select Case / End Select (au lieu de If / End If) permettra de traiter d’autres codes d’erreur, plus tard si nécessaire. Pour l’instant, on ne traite que l’erreur numéro 3022, transmise par la variable DataErr. Il suffira d’ajouter d’autres blocs Case pour traiter d’autres erreurs.
  • La variable Response détermine le comportement d’Access à la sortie de l’événement Form_Error. Cette variable vaut acDataErrDisplay par défaut, ce qui signifie que le message d’erreur standard sera affiché. Pour éviter ce message, on donne à Response la valeur acDataErrContinue (« continuer l’exécution sans afficher le message standard »).

Petites améliorations

Le fait d’utiliser la valeur 3022 directement dans le code ci-dessus n’est pas une bonne idée : pour chaque formulaire, vous devrez penser à ce code, retaper la valeur… Avec les risques d’erreur que ça comporte. Les habitués auront déjà prévu une constante pour centraliser tout ça. Voici comment faire :

  1. Créez un module standard, que vous nommerez par exemple mod Constantes.
  2. Dans ce module, tapez simplement :
    Public Const ERR_DOUBLON As Integer = 3022
    (vous appelez bien sûr la constante comme vous voulez !)
  3. Remplacez le chiffre 3022 par ERR_DOUBLON, dans le code plus haut. Ce qui donne :

Vous aimerez aussi...

9 réponses

  1. jean luc dit :

    alors je veux bien mais dis moi ou cliquer enfin j ai laisse le message d’acces mais bon ca fait pas top déjà que je ne suis pas un pro d ‘access j avoue mais bon j ‘ai promis cette petite base a une amie faut je tienne parole maintenant 🙂

    • Hervé Inisan dit :

      Cet article que je viens de poster devrait aider.
      Ouala ! 🙂

      • jean dit :

        j ai trouver le sur erreur enfin je pense que c’est le bon mais bon comme j ai trjs le message de Ms access standart je vais rester avec ce message et au pire y aura des doublons merci de ton aide en tout cas

        • Hervé Inisan dit :

          Il n’y a qu’un « Sur Erreur », donc ça devrait être le bon. Est-ce que dedans, tu as recopié exactement le « Select Case / End Select » de l’article ?
          Sinon, comme indiqué dans l’article, il y d’autres méthodes pour éviter les doublons (notamment, le fait de définir un index sans doublons sur le champ ; pas la peine si c’est une clef primaire : elle est déjà sans doublons obligatoirement).
          Bon courage !

  2. jean luc dit :

    je dois etre bete car je ne vois pas ou se trouve dans l’événement Sur erreur sur la propriete de mon bouton ni de mon formulaire tout court d ailleurs

    • Hervé Inisan dit :

      L’événement Sur erreur existe pour le formulaire, mais pas pour ses objets enfants. En sélectionnant le formulaire (mais pas un objet enfant) et en affichant ses propriétés, l’événement devrait être présent dans la liste.

      • jean luc dit :

        ben j ai cliquer aussi bien sur le detail sur l entete de mon formulaire et sur )pied de formulaire je ne vois nul par dans les proprietes sur erreur

  3. Hervé Inisan dit :

    margot > A quel endroit cela coince-t-il ?

    Et sinon, est-ce qu’un index sans doublons sur le champ concerné ne suffirait pas ? (avant de coder en VBA)

  4. margot dit :

    Bonsoir,

    J’ai créer un formulaire qui permet d’ajouter des données dans la table. Mais le problème c’est que je n’arrive pas a vérifier si un champs du formulaire est déjà dans la table. J’ai suivit votre tutoriel mais je n’arrive pas.
    Si vous avez besoin du code n’hésitez pas

Laisser un commentaire

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