Personnalisez l'affichage des onglets dans vos formulaires Access

BALLAT Jean

Cet article a pour but de montrer comment afficher un repère dans l'onglet d'un contrôle contenant un résultat de requête.
Même s'il contient un peu de code, il s'adresse à tout public.

Commentez ♪

- Titre : Personnalisez l'affichage des onglets dans vos formulaires Access

- Auteur : BALLAT Jean

- Parution : 3 octobre 2009

- Licence : Copyright ® 2009 Jean BALLAT. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- I. Introduction

- II. Le cahier des charges

- III. Les tables

- IV. Le formulaire de consultation

- IV-A. La liste déroulante

- IV-A-1. Étape 1 : Sélection du type de la source des données

- IV-A-2. Étape 2 : Choisir la table source

- IV-A-3. Étape 3 : Choisir les champs sources de la liste déroulante

- IV-A-4. Étape 4 : Choisir les clés de tri

- IV-A-5. Étape 5 : Modifier la largeur de colonne

- IV-A-6. Étape 6 : Changer la légende de la liste

- IV-A-7. Que s'est-il passé au niveau du contrôle ?

- IV-A-8. Modifier le nom de notre contrôle liste déroulante

- IV-A-9. Concaténation des deux champs

- IV-A-9-a. Définition

- IV-A-9-b. Étape 1 : Afficher la requête source de la liste

- IV-A-9-c. Étape 2 : Modifier la structure de la requête

- IV-A-9-d. Étape 3 : Modifier les propriétés de la liste déroulante

- IV-B. Les sous-formulaires par catégorie

- IV-B-1. Création de la requête source

- IV-B-2. Création du sous-formulaire

- IV-B-3. Modifier les propriétés du formulaire

- IV-C. L'insertion des sous-formulaires

- IV-C-1. Implantation du contrôle Onglet

- IV-C-2. Implantation du sous-formulaire dans le contrôle Onglet

- IV-D. Le code d'affichage des repères

- IV-D-1. À l'ouverture du formulaire

- IV-D-2. Après sélection d'un auteur

- IV-D-2-a. Déclaration des variables

- IV-D-2-b. Initialisation des variables

- IV-D-2-c. Traitement

- IV-D-2-c-i. Exécution des requêtes

- IV-D-2-c-ii. Récupération du nombre d'enregistrements

- IV-D-2-c-iii. Affichage des images

- IV-D-2-c-iv. Fermeture et libération des RecordSet

- IV-D-2-d. Intégralité de la procédure

- V. Conclusion

- VI. Remerciements

- VII. Téléchargement

I - Introduction

L'utilisation du contrôle d'onglet est souvent très intéressante lorsqu'on a besoin d'afficher beaucoup d'informations sur un formulaire. Hormis l'organisation des champs à afficher par thème afin d'alléger l'interface, celui-ci permet aussi d'organiser l'affichage du résultat d'une requête concernant plusieurs thèmes différents.
À partir de là, comment savoir dans quel onglet la requête retourne des informations ?
Quelle galère pour l'utilisateur, s'il doit cliquer sur chaque onglet afin de voir si un enregistrement est renvoyé pour un thème donné.
L'objectif de ce petit article est donc de montrer comment afficher un repère dans le ou les onglets qui contiennent une information répondant au critère posé.

II - Le cahier des charges

Notre base de données gère une petite bibliothèque.
Afin de faciliter le travail du bibliothécaire, nous devons afficher dans un sous-formulaire, le résultat de la recherche des ouvrages écrits par un auteur sélectionné.
Afin de rendre plus pratique sa recherche, nous devons :
- lui mettre à disposition une liste déroulante affichant les auteurs disponibles ;
- ventiler le résultat par catégorie de lecteurs (Adulte - Adolescent - Enfant).

Le formulaire de consultation (cf. l'image ci-contre) affichera donc :
1) Une liste déroulante reprenant la concaténation du nom et du prénom de l'auteur ;
2) Un contrôle d'onglet affichant dans chaque onglet,
- un petit livre ouvert si la requête renvoie des infos,
- un petit livre fermé si la requête est vide ;
3) Sous-formulaire identique dans chaque onglet affichant les infos souhaitées.

III - Les tables

Afin de prendre en main la base et les tables qui entrent en jeu, vous trouverez ci-dessous le modèle relationnel.

IV - Le formulaire de consultation

Le formulaire se compose donc d'une liste déroulante qui nous permettra de sélectionner un auteur et d'un contrôle d'onglets contenant les sous-formulaires (tous identiques, un par catégorie de lecteur) affichant les résultats des différentes requêtes.

IV-A - La liste déroulante

Cette liste déroulante est basée sur une requête qui récupère les données de la table T_Auteur.
Pour les débutants, nous allons reprendre les différentes étapes de la construction de la liste, puis nous allons contrôler les différentes propriétés modifiées et enfin nous allons intervenir directement dans le contenu de la source afin d'afficher le nom et le prénom de l'auteur concaténés comme demandé dans le cahier des charges.

IV-A-1 - Étape 1 : Sélection du type de la source des données

Nous allons créer un nouveau formulaire indépendant (c'est-à-dire sans source attachée à celui-ci).
Suivant la version :
- avant 2007 : affichez la boîte à outils et cliquez sur l'outil : Zone de liste modifiable ;
- à partir de 2007 : Cliquez, dans le ruban, sur l'onglet Créer, puis sur l'outil Création de formulaire et enfin sur l'outil Zone de liste déroulante.
Dans les deux cas, cliquez ensuite sur le formulaire afin d'y déposer le contrôle à créer.
Access nous propose de choisir le type de source. Laissez le choix par défaut (1er choix)

Petit rappel sur les choix disponibles :

Choix « Je veux que la liste déroulante recherche… » : la liste sera dynamique (fonction du contenu de la table source) ;

Choix…« Je taperai les valeurs … » : liste statique, la mise à jour de la liste devra passer par une séquence de code (voir dans la F.A.Q : Ajouter une valeur dans une liste).

Puis cliquez sur « Suivant ».

IV-A-2 - Étape 2 : Choisir la table source

Lors de cette étape, il nous faut choisir la table source de notre liste déroulante.
Choisissez la table « T_Auteur » puis cliquez sur Suivant.

IV-A-3 - Étape 3 : Choisir les champs sources de la liste déroulante

Il est temps maintenant de sélectionner les champs qui s'afficheront dans notre liste déroulante.
Il suffit de double cliquer sur les divers champs dont nous avons besoin, en l'occurrence :
- Code_Auteur ;
- Nom_Auteur ;
- Prenom_Auteur.
Cliquez sur le bouton « Suivant ».

IV-A-4 - Étape 4 : Choisir les clés de tri

Nous passerons l'étape 4 qui permet de choisir de trier le contenu de la liste sur un ou plusieurs champs.
Cliquez sur « Suivant ».

IV-A-5 - Étape 5 : Modifier la largeur de colonne

Cette étape a pour but de redimensionner les colonnes de la liste. On ne perdra pas de vue que seule la première colonne visible sera affichée dans la liste, mais que toutes les autres seront affichées lors de l'ouverture de la liste déroulante.
On remarquera aussi la case à cocher mentionnée par le warning. Celle-ci nous indique que la colonne contenant la clé primaire est masquée. Ce champ est implanté par défaut. Il représente la valeur que mémorisera la liste lorsqu'un choix sera fait par l'utilisateur et il pourrait nous servir pour faire le lien entre le formulaire principal et le sous-formulaire via les propriétés Champs pères et Champs fils.
Pour modifier la largeur des colonnes, il suffit de manipuler le pointeur comme pour les colonnes d'Excel (voir le repère sur l'image ci-contre).

IV-A-6 - Étape 6 : Changer la légende de la liste

Durant cette étape, nous saisissons la légende de notre contrôle et non le nom de l'objet qu'il faudra modifier via les propriétés.
Manipulation importante pour la suite. Il est nécessaire de nommer tout objet placé sur un formulaire ou un état.
À ce propos lire l'excellent tuto de Jean-Philippe Ambrosino (Argyronet) Descriptif des conventions typographiques.

IV-A-7 - Que s'est-il passé au niveau du contrôle ?

Lors de la création de notre liste déroulante, tout en suivant les différentes étapes de la création, Access a modifié les propriétés de notre contrôle.
Passons en revue les modifications.

En affichant la fenêtre des propriétés (clic droit sur le contrôle puis clic sur Propriétés), on trouvera deux onglets concernés par les modifications.
1) L'onglet Données :
1) Origine Source : propriété renseignée lors de la première étape ;
2) Contenu : propriété renseignée lors des étapes 2 et 3.
Représente une syntaxe SQL générée lors de la sélection de la table et des champs à afficher dans la liste ;
3) Colonne liée : propriété renseignée par défaut à 1.
Représente la colonne de la requête contenant le champ dont la valeur sera stockée dans la liste après sélection d'une ligne.

2) L'onglet Format :
1) Nombre de colonnes : propriété renseignée lors du choix des champs (Étape 3).
Indique le nombre de champs contenus dans la requête (masqués ou non) ;
2) Largeur des colonnes : propriété renseignée lors de l'étape 5.
On peut remarquer une largeur à 0 cm. Cette colonne fait partie de la requête, mais est masquée à l'affichage.

Nous avions choisi deux champs (nom_auteur et prenom_auteur). Rappelons-nous qu'Access avait ajouté d'office la clé primaire !

IV-A-8 - Modifier le nom de notre contrôle liste déroulante

Lors de l'étape 6 nous avions, à la demande de l'assistant, modifié l'étiquette de notre liste déroulante. J'avais alors insisté sur le fait qu'il était nécessaire de nommer tout objet placé sur le formulaire (ou sur un état).
Pour réaliser cette opération, cliquez sur l'onglet Autres dans la fenêtre des propriétés. Dans la propriété Nom, saisissez un nom évocateur du contrôle concerné. Ici, vous tapez cboAuteur

IV-A-9 - Concaténation des deux champs

IV-A-9-a - Définition

La concaténation est une opération permettant la juxtaposition de deux expressions alpha ou numérique. Le résultat sera une expression de type texte.
L'opérateur à utiliser : &
Exemples :
bon & jour -> bonjour
1 & 2 -> 12

La modification du contenu de la liste (donc de la syntaxe SQL générée automatiquement par ACCESS) peut se faire en direct dans la propriété correspondante ou par l'intermédiaire de l'assistant requête.
J'opte pour cette seconde solution, plus simple pour les débutants.

IV-A-9-b - Étape 1 : Afficher la requête source de la liste

Pour afficher notre requête, il nous faut passer par la fenêtre des propriétés :
- cliquez droit sur la liste déroulante puis cliquez Propriétés ;
- cliquez sur l'onglet Données.
Nous voici à pied d'œuvre. Dans l'image ci-contre j'ai placé deux repères :
1) cliquez dans la ligne Contenu.
2) cliquez sur le bouton avec les points de suspension afin d'afficher la fenêtre de création de requête.
2) C'est dans cette fenêtre que nous allons intervenir pour modifier le contenu de la liste.

IV-A-9-c - Étape 2 : Modifier la structure de la requête

Dans cette étape nous procèderons à trois opérations :
- créer un champ calculé pour générer la concaténation des deux champs Nom et Prénom de l'auteur.
- Pour cette opération :
1) Pour cette opération :1) cliquez devant le nom du second champ et tapez idAuteur : (nom du champ calculé) ;
1) Pour cette opération :2) & " " & prenom_auteur (Expression de la concaténation).
- Appliquer un tri (n° 3 sur l'image) afin d'avoir toujours une liste ordonnée lors de la mise à jour de la table T_Auteur.
- Sélectionner le champ prenom_auteur (n°´4 sur l'image) afin de le supprimer, celui-ci n'ayant plus de raison d'être dans la liste.

Les modifications de la structure de la requête étant terminées, il suffit de fermer l'interface et répondre par l'affirmative à la demande de sauvegarde des modifications de la syntaxe SQL. De retour à la fenêtre des Propriétés, validez la nouvelle syntaxe en faisant Entrée.

Nous mettons un espace entre guillemets afin de séparer le nom et le prénom lors de la concaténation.

IV-A-9-d - Étape 3 : Modifier les propriétés de la liste déroulante

La structure étant modifiée, les paramètres des propriétés enregistrées lors de l'utilisation de l'assistant sont devenus obsolètes.
Si la source a été enregistrée précédemment, il faut corriger le format de notre liste (cliquez dans l'onglet FORMAT de la fenêtre des propriétés).
Pour cela deux valeurs à changer :
1) Nombre de colonnes : saisissez le nombre de champs de notre nouvelle structure de requête (ici 2) ;
2) Largeur des colonnes : sélectionnez les deux dernières valeurs et saisissez une dimension ad hoc (ici tapez 5).

Remarquez que les dimensions de colonnes sont indiquées en cm. Il est inutile de saisir cette unité, Access l'ajoute automatiquement.

Voilà, nous en avons terminé avec notre liste déroulante, vous pouvez fermer votre formulaire et l'enregistrer sous le nom de F_Consultation. Nous allons maintenant créer les différents sous-formulaires que nous insèrerons dans un contrôle à onglets.

IV-B - Les sous-formulaires par catégorie

Afin de simplifier la mise en forme, l'affichage des sous-formulaires sera de type feuille de données.
Les trois sous-formulaires étant identiques, on pourra procéder à une copie de l'objet et seul le critère de sélection dans la requête source sera à modifier.

IV-B-1 - Création de la requête source

Nous allons créer une nouvelle requête.
Ajoutez, comme ci-contre, les différentes tables et sélectionnez les champs dont nous aurons besoin.
Il est à remarquer :
1) Le champ CodeCategorie est le critère de sélection de la catégorie de lecteurs ENFANT.
1) C'est cette valeur qu'il faudra changer dans les deux autres requêtes.
1) Vous pouvez lire les valeurs des catégories de lecteurs dans la table T_Categorie.
2) Nous avons inséré également le champ code_auteur.
2) Ce champ sera le lien entre le sous-formulaire et la liste déroulante (champ père) et la requête (champ fils).

La requête étant terminée, sauvegardez celle-ci sous le nom : R_OuvragesEnfant.
Procédez à la copie de cette requête deux fois en prenant soin de modifier la valeur du critère de sélection de la catégorie.
Sauvegardez ces copies en les nommant successivement : R_OuvragesAdo et R_OuvragesAdulte.

IV-B-2 - Création du sous-formulaire

Créez un nouveau formulaire en lui donnant comme source : R_OuvragesEnfant.
Placez dans la section Détail les deux champs Titre et Genre.
Le champ Code_Auteur sert de lien et ne doit pas être affiché.
Le champ Code_Categorie ne doit pas être visible puisqu'il y a un sous-formulaire par catégorie.

IV-B-3 - Modifier les propriétés du formulaire

Le cahier des charges nous demande un affichage en mode feuille de données. Pour optimiser l'affichage, nous allons modifier quelques propriétés.
Affichez la fenêtre des Propriétés du formulaire et cliquez sur l'onglet Format :
1) Affichage par défaut : choisir FEUILLE DE DONNÉES ;
2) Autoriser le mode Formulaire : choisir NON ainsi seul le mode choisi restera accessible ;
3) Autoriser le mode Feuille de données : choisir OUI ;
4) Autoriser le mode Tableau croisé : choisir NON ;
5) Autoriser le mode Graphique : choisir NON ;
6) Boutons de déplacement : choisir NON
6) (il s'agit des boutons situés en bas à gauche du formulaire et qui permettent de se déplacer dans les enregistrements) ;
7) Barre de défilement : choisir VERTICALE
7) (la barre de défilement horizontale étant inutile).

Ce sous-formulaire étant terminé, enregistrez -le sous le nom de F_OuvragesEnfant.

Il ne reste plus qu'à copier cet objet et à changer la source en conséquence.

Sauvegardez les copies sous les noms de F_OuvragesAdo et F_OuvragesAdulte.

IV-C - L'insertion des sous-formulaires

IV-C-1 - Implantation du contrôle Onglet

Pour créer le contrôle, cliquez :
- Version 2007 : dans le ruban sur l'onglet Outils de création de formulaire puis onglet Créer puis sur l'outil Contrôle d'onglet ;
- Versions antérieures : dans la boîte à outils, clic sur l'outil Contrôle Onglet.

Cliquez ensuite sur le formulaire et redimensionnez l'objet créé en fonction de la dimension des sous-formulaires à incorporer puis renommez le contrôle ctlConsultation (voir l'image ci-dessus à droite).
Enfin, nous avons besoin de trois onglets pour afficher les résultats de nos requêtes. Il nous faut en insérer un supplémentaire :
cliquez à droite du dernier onglet avec le bouton droit de la souris puis, dans le menu contextuel, choisissez : Insérer une page (voir l'image ci-dessus à gauche).

Il faut maintenant identifier les onglets :

Affichez la fenêtre des Propriétés et cliquez sur l'onglet Toutes.
1) Nom : saisir pgEnfant.
1) Il s'agit en fait de l'identifiant de l'onglet qui sera utilisé dans le Code.
2) Légende : saisir Enfant.
2) Il s'agit du texte affiché dans l'onglet. S'il n'y a pas de légende, Access affiche alors le nom de l'objet.

Recommencez cette opération pour les trois onglets en donnant successivement :

- Nom : pgAdo / Légende : Adolescent ;

- Nom : pgAdulte / Légende : Adulte.

Dans Access, les onglets sont appelés des pages.

IV-C-2 - Implantation du sous-formulaire dans le contrôle Onglet

L'insertion d'un sous-formulaire dans un contrôle d'onglet est une opération simple.
- Activez l'onglet qui doit recevoir le sous-formulaire.
- Suivant la version :
Antérieures à 2007 : affichez la fenêtre base de données (F11) puis cliquez maintenu sur le nom du sous-formulaire ;
Version 2007 : cliquez maintenu sur le nom du sous-formulaire affiché dans le volet de gauche.
Glissez dans le sous-formulaire. Lorsque le cadre noir apparaît, lâchez la souris.

Maintenant, il nous faut relier le formulaire principal et le sous-formulaire.
Pour cela, affichez la fenêtre des Propriétés :
- cliquez sur l'onglet Données ;
- modifiez les deux propriétés ci-dessous :
- Champs pères : saisir cboAuteur (nom de la liste déroulante);
- Champs Fils : saisir code_auteur (champ présent dans la requête source du sous-formulaire).

L'implantation est terminée. Il suffit de renouveler ces opérations sur les deux autres onglets avec les deux autres sous-formulaires sans oublier de modifier les propriétés.

IV-D - Le code d'affichage des repères

IV-D-1 - À l'ouverture du formulaire

Ouvrez le formulaire principal en mode création et affichez la fenêtre des propriétés du formulaire, cliquez sur l'onglet Évènements et recherchez dans la liste l'évènement Sur ouverture. Cliquez dans la ligne puis sur le bouton liste déroulante (voir image ci-contre) et choisissez Procédure évènementielle. Enfin cliquez sur le bouton affichant les points de suspension.

Nous sommes dans l'éditeur de VBA (interface VBE : Visual Basic Editor). C'est ici que nous allons saisir les lignes de code permettant d'implanter les images à l'ouverture du formulaire. Le curseur étant placé entre deux lignes présaisies :

Private Sub Form_Open(Cancel As Integer)
End Sub

Saisir les lignes suivantes :

' Initialisation des images des onglets
Me.pgEnfant.Picture = CurrentProject.Path & "\image\livreferme.ico"
Me.pgAdo.Picture = CurrentProject.Path & "\image\livreferme.ico"
Me.pgAdulte.Picture = CurrentProject.Path & "\image\livreferme.ico"

Pour avoir de plus amples informations sur la gestion des images dans une base de données, je vous conseille la lecture du tuto de Caféine : Gestion des images et des photos.

IV-D-2 - Après sélection d'un auteur

Ce code concerne la liste déroulante. Chaque fois que je choisis un nouvel auteur, les sous-formulaires se mettent à jour grâce au lien champ père/Champ fils, mais je ne sais pas qui contient des enregistrements.
Nous allons écrire une procédure qui va calculer le nombre d'enregistrements récupérés par chaque requête source des sous-formulaires.
Cette procédure sera placée sur l'évènement Après MAJ de la liste déroulante.
Affichez les propriétés de la liste déroulante et cliquez sur l'onglet Évènements. Positionnez-vous dans l'évènement Après MAJ et choisissez Procédure évènementielle puis cliquez sur les points de suspension. (Idem que ci-dessus pour la procédure sur l'ouverture du formulaire.)

La procédure se divise en plusieurs parties :
1) Déclaration des variables ;
2) Initialisation des variables ;
3) Traitement.

IV-D-2-a - Déclaration des variables

Nous allons exécuter en arrière-plan les requêtes sources des sous-formulaires. Pour cela nous aurons besoin de zones de travail (dites variables en programmation).

' Déclaration des variables
' Variable représentant la base de données en cours
Dim MaBase As DAO.Database
' Variables contenant des enregistrements
Dim rsEnfant As DAO.Recordset, rsAdo As DAO.Recordset, rsAdulte As DAO.Recordset
' Variables stockant le nombre d'enregistrements récupérés
Dim intEnfant As Integer, intAdo As Integer, intAdulte As Integer
' Variables de type texte permettant de stocker les syntaxes des requêtes
' Variable représentant la partie SELECT de la requête
Dim strRequete As String
' 2 Variables pour la catégorie Enfant : la partie condition et la concaténation de la requête de base et la partie conditionnelle
Dim strWhereEnfant As String,strEnfant As String
' 2 Variables pour la catégorie Adolescent : la partie condition et la concaténation de la requête de base et la partie conditionnelle
Dim strWhereAdo As String, strAdo As String
' 2 Variables pour la catégorie Adulte : la partie condition et la concaténation de la requête de base et la partie conditionnelle
Dim strWhereAdulte As String, strAdulte As String
' Variable représentant un onglet
Dim pgOnglet As Page

IV-D-2-b - Initialisation des variables

Une fois les variables déclarées, nous allons les initialiser :

' Initialisation de la Variable Base de données
Set MaBase = CurrentDb

' Intitalisation de la partie commune de la requête
strRequete = "SELECT T_Auteur.code_auteur, T_Livres.titre, T_Genre.genre FROM " _
& "T_Categorie INNER JOIN " _
& "(T_Genre INNER JOIN " _
& "(T_Auteur INNER JOIN T_Livres " _
& "ON T_Auteur.code_auteur = T_Livres.code_auteur) " _
& "ON T_Genre.code_genre = T_Livres.code_genre) " _
& "ON T_Categorie.code_categorie = T_Livres.code_categorie "

' Création de la clause de condition avec récupération de la valeur stockée dans la liste déroulante (Concaténation)
strWhereEnfant = "WHERE T_Categorie.code_categorie = 1 AND T_Auteur.code_Auteur = " & Me.cboAuteur
' Concaténation de la requête de base et de la clause WHERE
strEnfant = strRequete & strWhereEnfant & ";"
' Création de la clause de condition avec récupération de la valeur stockée dans la liste déroulante (Concaténation)
strWhereAdo = "WHERE T_Categorie.code_categorie = 2 AND T_Auteur.code_Auteur = " & Me.cboAuteur
' Concaténation de la requête de base et de la clause WHERE
strAdo = strRequete & strWhereAdo & ";"
' Création de la clause de condition avec récupération de la valeur stockée dans la liste déroulante (Concaténation)
strWhereAdulte = "WHERE T_Categorie.code_categorie = 3 AND T_Auteur.code_Auteur = " & Me.cboAuteur
' Concaténation de la requête de base et de la clause WHERE
strAdulte = strRequete & strWhereAdulte & ";"

IV-D-2-c - Traitement

Les éléments pour faire le traitement sont prêts. Celui-ci se déroule en quatre temps :
1) Exécution des requêtes ;
2) Récupération du nombre d'enregistrements ;
3) Affichage des repères ;
4) Fermeture et libération des RecordSet.

IV-D-2-c-i - Exécution des requêtes

' exécution des requêtes
Set rsEnfant = MaBase.OpenRecordset(strEnfant)
Set rsAdo = MaBase.OpenRecordset(strAdo)
Set rsAdulte = MaBase.OpenRecordset(strAdulte)

IV-D-2-c-ii - Récupération du nombre d'enregistrements

' repérage du nombre d'enregistrements de chaque requête
intEnfant = rsEnfant.RecordCount
intAdo = rsAdo.RecordCount
intAdulte = rsAdulte.RecordCount

IV-D-2-c-iii - Affichage des images

' Affichage des images
Set pgOnglet = Me.pgEnfant
' Empêche Access de redessiner l'onglet à chaque appel de la procédure
Me.Painting = False
' Appel de la routine d'affichage
Call AfficherRepere(pgOnglet, intEnfant)
Set pgOnglet = Me.pgAdo
Call AfficherRepere(pgOnglet, intAdo)
Set pgOnglet = Me.pgAdulte
Call AfficherRepere(pgOnglet, intAdulte)
' Met à jour les onglets en une seule fois
Me.Painting = True

On peut remarquer dans cette procédure l'instruction : Call AfficherRepere(pgOnglet, intAdulte)

Cet appel évite de réécrire plusieurs fois les mêmes instructions. Cette procédure est écrite à la suite des autres procédures évènementielles.

Ci-dessous le détail de la procédure :

Sub AfficherRepere(pgOnglet As Page, NbrEnregistrements As Integer)
' Teste le nombre d'enregistrements dans la requête
If NbrEnregistrements = 0 Then
pgOnglet.Picture = CurrentProject.Path & "\image\livreferme.ico"
Else
pgOnglet.Picture = CurrentProject.Path & "\image\livreouvert.ico"
End If
End Sub

IV-D-2-c-iv - Fermeture et libération des RecordSet

' Fermeture et libération des Recordset
rsEnfant.Close
Set rsEnfant = Nothing
rsAdo.Close
Set rsAdo = Nothing
rsAdulte.Close
Set rsAdulte = Nothing

IV-D-2-d - Intégralité de la procédure

Voici ci-dessous l'intégralité de la procédure :

Private Sub cboAuteur_AfterUpdate()

' Déclaration des variables
Dim MaBase as DAO.CurrentDb
Dim rsEnfant As DAO.Recordset, rsAdo As DAO.Recordset, rsAdulte As DAO.Recordset
Dim intEnfant As Integer, intAdo As Integer, intAdulte As Integer
Dim strRequete As String
Dim strEnfant As String, strWhereEnfant As String
Dim strAdo As String, strWhereAdo As String
Dim strAdulte As String, strWhereAdulte As String
Dim pgOnglet As Page

' Initialisation des variables
Set MaBase = CurrentDb

strRequete = "SELECT T_Auteur.code_auteur, T_Livres.titre, T_Genre.genre FROM " _
& "T_Categorie INNER JOIN " _
& "(T_Genre INNER JOIN " _
& "(T_Auteur INNER JOIN T_Livres " _
& "ON T_Auteur.code_auteur = T_Livres.code_auteur) " _
& "ON T_Genre.code_genre = T_Livres.code_genre) " _
& "ON T_Categorie.code_categorie = T_Livres.code_categorie "

strWhereEnfant = "WHERE T_Categorie.code_categorie = 1 AND T_Auteur.code_Auteur = " & Me.cboAuteur
strEnfant = strRequete & strWhereEnfant & ";"

strWhereAdo = "WHERE T_Categorie.code_categorie = 2 AND T_Auteur.code_Auteur = " & Me.cboAuteur
strAdo = strRequete & strWhereAdo & ";"

strWhereAdulte = "WHERE T_Categorie.code_categorie = 3 AND T_Auteur.code_Auteur = " & Me.cboAuteur
strAdulte = strRequete & strWhereAdulte & ";"

' Traitement
'----------------
' exécution des requêtes
Set rsEnfant = MaBase.OpenRecordset(strEnfant)
Set rsAdo = MaBase.OpenRecordset(strAdo)
Set rsAdulte = MaBase.OpenRecordset(strAdulte)

' repérage du nombre d'enregistrements du résultat
intEnfant = rsEnfant.RecordCount
intAdo = rsAdo.RecordCount
intAdulte = rsAdulte.RecordCount

' Affichage des images
Set pgOnglet = Me.pgEnfant
' Empêche Access de redessiner l'onglet à chaque appel de la procédure
Me.Painting = False
' Appel de la routine d'affichage
Call AfficherRepere(pgOnglet, intEnfant)
Set pgOnglet = Me.pgAdo
Call AfficherRepere(pgOnglet, intAdo)
Set pgOnglet = Me.pgAdulte
Call AfficherRepere(pgOnglet, intAdulte)
' Met à jour les onglets en une seule fois
Me.Painting = True
' Libération des Recordset
rsEnfant.Close
Set rsEnfant = Nothing
rsAdo.Close
Set rsAdo = Nothing
rsAdulte.Close
Set rsAdulte = Nothing
End Sub

V - Conclusion

L'utilisation du contrôle Onglet est évidente dans la création des interfaces contenant beaucoup d'informations. J'espère que cette petite application vous ouvrira de nouveaux horizons dans la création de vos futures interfaces.

VI - Remerciements

Je voudrais remercier l'ensemble de l'équipe DVP qui fait un travail énorme, qui a fait de Développez.com ce qu'il est aujourd'hui et qui nous tire toujours vers le haut.
Merci également à Arkham46, Philippe Jochmans, User et Tofalu pour leurs précieux conseils.
Merci à Chtulus et Claude Leloup pour leur relecture attentive.

VII - Téléchargement

La base exemple est disponible en suivant ce lien :
Afficher les repères dans les onglets