1. Avant propos ▲
Ce document a pour but de vous montrer comment concevoir une liste qui permet de rafraîchir le contenu d'une
autre liste en fonction de ce qui est sélectionné dans la première.
Vous devez être relativement à l'aise avec Microsoft Access et connaître la conception de formulaires mais
également avoir des notions du langage Visual Basic for Application afin mettre en pratique cet exemple.
1-1. Niveau ▲
Ce tutoriel s'adresse plus particulièrement aux personnes qui débutent sur la gestion des événements avec Visual Basic sur Microsoft Access
1-2. Contact ▲
Pour tous renseignements complémentaires, veuillez me contacter directement (Argyronet) par MP.
2. Présentation du projet▲
Ce petit projet sans prétention permet de comprendre comment mettre en oeuvre la possibilité
d'obtenir les enregistrements correspondants à une sélection dans une liste.
Bien entendu, la liste où est puisée la valeur à faire correspondre peut très bien être une
zone de texte où tout autre contrôle capable de retourner une valeur.
Je précise qu'aucun peaufinage n'est mis en application dans la conception de ce projet du fait
que l'objectif se limite à la compréhension du phénomène de pseudo-communication entre
deux contrôles Zone de liste déroulante via une procédure VBA traduite par
un événement AfterUpdate() (Après MAJ).
Pour mettre en oeuvre ce projet, j'ai pris une liste de catégories de métiers et les métiers
correspondants.
Pour créer ces listes, je me suis rendu sur le site de
Wikipedia afin de
remplir mes tables.
Note:
Ce tutoriel peut, dans son ensemble, être mis en application pour toutes les versions d'Access.
Toutefois, certaines méthodes seront inexistantes dans les versions antérieures à la version 97.
2-1. Création des tables▲
Vous devez donc concevoir une table de catégories qui contient toutes les catégories
possibles souhaitées. Dans cette table il existe 2 champs :
- le 1er champ définissant l'identifiant de la catégorie représentée
par ce que l'on appelle une clé primaire ;
Pour plus de commodité, nous appellerons ce champ IDCategorie.
Le préfixe ID définit le fait que ce champ est l'identifiant de l'enregistrement.
- Le 2ème champ Categorie, quant à lui, définit le nom de la catégorie.
En guise de propriétés, vous affectez à IDCategorie le type Numéro auto
afin que celui-ci soit un compteur et affectez Texte avec une longueur de 100
pour le champ Categorie. Vous enregistrez la table sous le nom TBLcategories.
Vous devez ensuite créer la seconde table des Métiers qui elle contient trois champs :
- le 1er champ champ définissant l'identifiant du métier représenté par
le nom IDMetier ;
En guise de propriété, vous lui affectez le type Numéro auto afin que
celui-ci soit un compteur.
- Le 2ème champ Métier qui représente le métier ;
- Le 3ème champ qui définit la catégorie à laquelle le métier appartient.
Plus de commodité, vous nommez ce champ avec le même nom que l'identifiant spécifié
dans la table dont il dépend à savoir IDCategorie.
Par principe, ne mettez jamais d'accents dans les noms des champs.
Vous enregistrez la table sous le nom TBLMetiers.
2-1-1. Vue des tables en mode création▲
2-2. Remplissage des tables▲
Pour pouvoir tester le bon fonctionnement de ce projet, vous devez entrer des catégories
de métier ainsi que des métiers qui leur correspondent.
Libre à vous de procéder comme bon vous semble.
Personnellement, j'ai utilisé Excel comme phase intermédiaire du fait que
j'ai puisé les données depuis un site internet.
Le principe consiste à saisir d'abord toutes les catégories afin d'obtenir un numéro de
catégorie représentant l'identifiant de chacune d'elles.
Ces numéros s'incrémentent d'eux-mêmes du fait qu'ils sont stockés dans un champ Numéro Auto.
2-2-1. Vue des tables en mode feuille de données▲
Les deux tables en mode feuille de données une fois les enregistrements saisis.
Le numéro de catégorie pour chaque métier est issu de la table des catégories...
Vous pouvez d'ailleurs faire en sorte que ce champ aille chercher directement la valeur
du N° de catégorie à partir d'une liste déroulante
dans la table elle-même.
A partir des propriétés du champ IDCategorie de la table TBLMetiers, vous définissez les
valeurs suivantes :
Cette personnalisation n'est utile que si vous saisissez les métiers un par un dans la table.
3. Création du formulaire▲
Vous créez donc un nouveau formulaire vide en Mode création où vous posez deux contrôles Zone de liste modifiable (ComboBox).

Vous intitulez l'étiquette de chacune des listes respectivement avec les valeurs
Catégories et Métiers.
Vous nommez chacune des listes respectivement avec les noms cmbCategories et
cmbMetiers.
Pour plus d'information sur la convention de nommage des objets, vous pouvez lire ce tutoriel.
3-1. Affectation des propriétés aux contrôles▲
Les zones de liste modifiables doivent recevoir certaines propriétés pour pouvoir
aboutir au résultat souhaité.
Bien que très nombreuses, seules quelques-unes nous intéressent pour ce projet dans
le sens où il n'est pas évoqué de façon exhaustive l'interfaçage des contrôles.
3-1-1. Propriétés de la liste des catégories▲
Pour la liste des Catégories, vous allez affecter les propriétés suivantes :
- Nom = cmbCategories
- Contenu = (voir ci-après)
- Nombre de colonnes = 2
- Largeurs colonnes = 0cm;10cm
- Largeur liste = 10cm
Explications :
- 0cm pour la première colonne puisque nous ne voulons pas voir
l'identifiant de la catégorie (Numéro Auto) ;
- 10cm réservés au nom de la catégorie que nous voulons effectivement voir
apparaître dans la liste déroulante ;
Nous choisissons 10cm mais cette largeur pourrait très bien être +/-
grande ; cela dépend de la longueur du mot (ici, la catégorie est parfois
définie par plusieurs mots).
Lorsque vous prenez l'Assistant Création Contrôle et que vous lui demandez de
vous aider dans la conception d'une zone de liste déroulante
sur telle table ou telle
requête, il vous propose par défaut de masquer la colonne numéro 1 puisqu'il
est sous-entendu (normalisation oblige),
que vous avez effectivement mis un
identifiant UNIQUE pour représenter chacun des enregistrements de la table source.
Bien entendu, cela est le cas si votre table possède au moins deux champs tels que vous
les avez conçus dans les tables de ce projet.
Il en est de même si vous construisez le contrôle manuellement…
Ce sera alors à vous d'ajuster en conséquence...
Vous la nommez cmbCategories et laissez sa propriété Activé (Enabled) à Oui (True)
La propriété Contenu (RowSource) est ici représentée par une
chaîne SQL que vous pouvez écrire directement.
Vous pouvez aussi affecter une requête existante ou la générer sur le pouce...
SELECT * FROM TBLCategories ORDER BY [Categorie];
Pour générer la chaîne SQL à partir d'une requête, cliquez sur le petit bouton doté de trois petit points qui juxtapose la propriété Contenu.
3-1-2. Propriétés de la liste des métiers▲
Pour la liste des Métiers, vous allez affecter les propriétés suivantes :
- Nom = cmbMetiers
- Contenu = Rien (Laissez vide)
- Nombre de colonnes = 3
- Largeurs colonnes = 0cm;10cm;0cm
- Largeur liste = 10cm
Explications :
- 0cm pour la première colonne puisque nous ne voulons pas voir
l'identifiant du métier (Numéro Auto),
- 10cm réservés au métier que nous voulons le voir effectivement apparaître dans la
liste déroulante,
- Et à nouveau 0cm parce nous ne voulons pas voir non plus la catégorie à
laquelle il appartient (Numérique).
De façon identique et à votre appréciation, vous affectez 10cm pour la largeur,
celle-ci tout comme la précédente pouvant être +/- grande ;
cela dépend de la longueur du mot (ici, le métier est parfois défini par plusieurs mots).
Ce sera alors à vous d'ajuster en conséquence...
Vous la nommez cmbMetiers et sa propriété Activé (Enabled) sera égale à Non (False)
3-1-3. Disposition des contrôles▲
Vous disposez vos deux contrôles juxtaposés sur le formulaire avec la liste
cmbCategories à gauche, et l'autre liste déroulante, cmbMetiers à droite.
Vous passez en Mode Formulaire pour pouvoir contrôler le bon fonctionnement
de la liste déroulante des catégories :
=> lorsque vous cliquez dessus, vous devez obtenir la liste de toutes les catégories
triées par ordre alphabétique.
La liste déroulante des métiers est quant à elle verrouillée pour l'instant.
Vous repassez alors en Mode Création et effectuez un clic droit sur le
contrôle de liste déroulante cmbCategories :
=> dans le menu contextuel qui apparaît, vous choisissez "Créer code événement…".
3-1-4. Mise en place du code événement▲
Pour mettre en place le code événement, effectuez un clic droit sur le contrôle de liste déroulante des catégories...
Cliquez alors sur le menu "Créer code événement…".
Si vous n'avez pas l'habitude d'utiliser l'éditeur Visual Basic ou bien si vous n'avez pas coché dans les options d'Access, la rubrique intitulée "Toujours utiliser les procédures événementielles"...
...une boîte de dialogue de confirmation du choix de la rédaction de l'événement
apparaît et propose à travers 3 rubriques la possibilité de mettre en place l'événement.

Dans cette boîte de dialogue intermédiaire, si elle apparaît, vous sélectionnez
"Générateur de code".
Ce choix va instantanément ouvrir l'éditeur Visual Basic appelé plus
exactement Visual Basic Editor et abrégé VBE.
Dans l'éditeur Visual Basic, une fenêtre blanche va vous proposer d'écrire
un bout de code correspondant à l'événement de votre choix.
Ici, c'est l'événement BeforeUpdate() (Avant mise à jour) qui
est proposé...
C'est le code événement par défaut chaque fois que vous faîtes ce genre
d'opération mais dans ce projet, ce n'est pas cet événement qui nous
intéresse puisque nous souhaitons pouvoir déclencher quelque chose après avoir
choisi une catégorie dans la liste et non avant.
Private
Sub
cmbCategorie_BeforeUpdate
(
Cancel As
Integer
)
End
Sub
Pour plus d'informations sur les événements des contrôles et autres objets, veuillez
vous référer à l'aide en ligne en mettant en surbrillance l'événement souhaité et
appuyez sur la touche F1.
Rappelez-vous qu'un événement est quelque chose qui se passe lorsque l'utilisateur
effectue une certaine opération "avant", "pendant", "après"…, etc. sur tel ou tel contrôle.
L'événement qui nous intéresse est celui qui se nomme "Après MAJ"
à savoir AfterUpdate().
Dans la partie haute de la fenêtre blanche sur laquelle vous êtes
actuellement focalisée, vous voyez apparaître 2 petites listes déroulantes :
=> l'une porte le nom du contrôle en cours à savoir "cmbCategorie"
=> l'autre porte le nom de l'événement en cours à savoir "BeforeUpdate"…
Ces deux listes déroulantes représentent respectivement pour l'une, la liste des contrôles de votre formulaire et pour l'autre, la liste des événements potentiellement affectables à chacun de ces contrôles.
Il faut savoir qu'un contrôle de type liste déroulante ne possède pas les
mêmes événements d'un contrôle bouton de commande par exemple et pour autant,
ils ont des événements communs.
Il vous appartiendra alors de choisir l'événement le plus approprié lorsque tel ou
tel contrôle est utilisé dans votre formulaire.
3-1-5. Rédaction de l'événement▲
Vous choisissez donc dans la liste de droite l'événement AfterUpdate.
Le code correspondant à cet événement prend place au-dessus du précédent, chaque
bloc de code étant par défaut trié alphabétiquement...
Vous pouvez si vous le souhaitez supprimer le bloc de code affairant à l'événement BeforeUpdate() car il ne sera pas utilisé.
Private
Sub
cmbCategorie_AfterUpdate
(
)
End
Sub
Ensuite, dans la zone de cet événement, vous pouvez saisir ce code :
Private
Sub
cmbCategories_AfterUpdate
(
)
Dim
lngIDCat As
Long
Dim
SQL As
String
'' Vérifie que l'on a cliqué sur une catégorie pour éviter le NULL
If
Not
IsNumeric
(
Me!cmbCategories) Then
Exit
Sub
'' Affecte la valeur de IDCategorie à la variable lngIDCat
lngIDCat =
Me!cmbCategories
'' Construit la chaîne SQL avec la catégorie concernée
SQL =
"SELECT IDMetier, Metier, IDCategorie FROM TBLMetiers WHERE IDCategorie ="
&
lngIDCat &
" ORDER BY Metier"
'' Affecte la chaîne SQL à la liste des métiers
cmbMetiers.RowSource
=
SQL
'' Déverrouille la liste des métiers
cmbMetiers.Enabled
=
True
'' Donne le focus la liste des métiers
cmbMetiers.SetFocus
'' Déroule la liste des métiers
cmbMetiers.Dropdown
End
Sub
Explications du déroulement :
Le code est commenté pour une meilleure compréhension: en voici le détail :
Sur le principe, le code vérifie qu'une catégorie a été sélectionnée.
Du fait qu'un contrôle de type liste déroulante retourne la valeur de la
propriété Colonne liée que nous avons définit à 1,
lorsque vous sélectionnerez une catégorie dans la liste de gauche, le numéro représentant
l'identifiant de l'enregistrement sera retourné.
C'est cette valeur que nous stockons dans la variable de type Long lngIDCat.
Une vérification de cette variable est effectuée par la fonction IsNumeric() de manière
à contrôler si elle est affectée avec un nombre sans quoi, la sortie de la procédure
par l'intermédiaire de l'instruction Exit Sub est exécutée.
La variable SQL de type String est affectée par une chaîne SQL qui représente
la sélection de tous les métiers ayant pour IDCategorie la valeur de la variable qui,
comme cela vient d'être cité, représente la catégorie sélectionnée dans la liste...
Par la suite, la propriété RowSource (Contenu) du contrôle de liste des métiers
initialement à vide se voit affectée par la valeur de cette chaîne SQL...
Enfin, le code procède au déverrouillage du contrôle via la propriétéEnabled affectée True puis lui donne le focus.
Le code termine son exécution par la méthode Dropdownqui permet de dérouler la liste
des métiers, disons, pour faire plus joli.
4. Mise en exécution▲
Une fois cela terminé, vous basculez de nouveau sur votre formulaire (Alt+Tab) ou bien
vous quittez l'éditeur Visual Basic depuis le menu Fichier.
Vous enregistrez de manière à ne pas perdre votre travail et vous passez en Mode Formulaire
une seconde fois.
À cet instant, lorsque vous cliquez sur la liste de gauche et que vous choisissez une catégorie,
la liste déroulante de droite se déverrouille et vous affiche les métiers correspondant à la catégorie sélectionnée.
5. Conclusion▲
Ce petit tutoriel tout simple permettra aux personnes débutant avec la programmation
des événements dans Microsoft Access, de mettre en place cette routine fort pratique dans bien des cas.
Je suis conscient qu'il existe bien d'autres façons de faire pour aboutir à un résultat identique,
pour autant, j'apprécie celle-ci par sa simplicité de mise en oeuvre et j'ai souhaité vous en faire profiter.
6. Sujets corrélatifs▲
Dans la FAQ du forum Access,
vous pouvez trouver de nombreux sujets sur les zones de liste et zones de liste modifiables en cliquant ici.
FRED.G vous propose par ailleurs la méthode (si souvent oubliée qu'elle est souvent posée comme question)
où vous apprenez à récupérer la valeur de la colonne d'une liste...
7. Remerciements ▲
Je tiens à remercier toutes celles et ceux qui ont participé à la relecture de ce document en y incluant leurs remarques et en particulier :
Lou Pitchoun,
Starec et
Heureux-oli (Pour sa judicieuse remarque sur l'ombre de la souris )