Concevoir une liste qui en alimente une autre

Jean-Philippe AMBROSINO

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.

Commentez ♪

- Titre : Concevoir une liste qui en alimente une autre

- Auteur : Jean-Philippe AMBROSINO

- Parution : 30 décembre 2007

- Mise à jour : 30 décembre 2007

- Licence : Ce document est issu de https://www.developpez.com et reste la propriété exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à l'obtention préalable de l'autorisation de l'auteur.

Sommaire

- 1. Avant propos

- 1-1. Niveau

- 1-2. Contact

- 2. Présentation du projet

- 2-1. Création des tables

- 2-1-1. Vue des tables en mode création

- 2-2. Remplissage des tables

- 2-2-1. Vue des tables en mode feuille de données

- 3. Création du formulaire

- 3-1. Affectation des propriétés aux contrôles

- 3-1-1. Propriétés de la liste des catégories

- 3-1-2. Propriétés de la liste des métiers

- 3-1-3. Disposition des contrôles

- 3-1-4. Mise en place du code événement

- 3-1-5. Rédaction de l'événement

- 4. Mise en exécution

- 5. Conclusion

- 6. Sujets corrélatifs

- 7. Remerciements

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

Les deux tables en mode création une fois les champs créés et les tables enregistrées.

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

Propriété Contenu (RowSource) de la liste des catégories

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 )