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
- Ouvrez votre formulaire en mode Création.
- Faites apparaître les propriétés du formulaire, notamment l’onglet Événement.
- Cliquez dans l’événement
Sur erreur
, déroulez la liste proposée, puis choisissezProcédure événementielle
. - Cliquez sur les points de suspension à droite de l’événement, pour passer dans le code VBA.
- Faites en sorte que votre événement ressemble à ceci :
1 2 3 4 5 6 7 |
Private Sub Form_Error(DataErr As Integer, Response As Integer) Select Case DataErr Case 3022: MsgBox "Un genre de film existe déjà avec ce code.", vbExclamation Response = acDataErrContinue End Select End Sub |
Apuka tester !
- Le fait d’utiliser un
Select Case / End Select
(au lieu deIf / 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éro3022
, transmise par la variableDataErr
. Il suffira d’ajouter d’autres blocsCase
pour traiter d’autres erreurs. - La variable
Response
détermine le comportement d’Access à la sortie de l’événementForm_Error
. Cette variable vautacDataErrDisplay
par défaut, ce qui signifie que le message d’erreur standard sera affiché. Pour éviter ce message, on donne àResponse
la valeuracDataErrContinue
(« 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 :
- Créez un module standard, que vous nommerez par exemple
mod Constantes
. - Dans ce module, tapez simplement :
Public Const ERR_DOUBLON As Integer = 3022
(vous appelez bien sûr la constante comme vous voulez !) - Remplacez le chiffre
3022
parERR_DOUBLON
, dans le code plus haut. Ce qui donne :
1 2 3 4 5 6 7 |
Private Sub Form_Error(DataErr As Integer, Response As Integer) Select Case DataErr Case ERR_DOUBLON: MsgBox "Un genre de film existe déjà avec ce code.", vbExclamation Response = acDataErrContinue End Select End Sub |
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 🙂
Cet article que je viens de poster devrait aider.
Ouala ! 🙂
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
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 !
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
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.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
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)
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