formateur informatique

Extraire et filtrer les données en VBA Access

Accueil  >  Bureautique  >  Access  >  Access VBA  >  Extraire et filtrer les données en VBA Access
Livres à télécharger


Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :


Inscription Newsletter    Abonner  Youtube    Vidos astuces Instagram
Sujets que vous pourriez aussi aimer :


Extraire et filtrer de l'information de base de données Access

Dans cette formation, nous souhaitons bâtir un formulaire à partir duquel l'utilisateur pourra, à l'aide de listes déroulantes, filtrer instantanément les données d'une table volumineuse, afin d'en extraire l'information. Nous allons préfabriquer les requêtes Access qui permettent de remplir les listes déroulantes et de recouper les critères. Elles seront conçues sur des critères dynamiques en fonction des choix utilisateurs spécifiés depuis le formulaire. Et c'est un code VBA qui permettra de réaliser le lien entre tous ces objets afin de rendre l'application parfaitement dynamique et fonctionnelle.

Présentation des données à filtrer
Pour réaliser cette application, nous partons d'une base de données existante pour laquelle, un formulaire a été préconçu.
  • Télécharger la base de données sorties.accdb en cliquant sur son lien,
  • Puis, l'ouvrir dans Access,
  • Si nécessaire, cliquer sur le bouton Activer le contenu du bandeau jaune de sécurité,
  • Double cliquer sur la table societes depuis le volet de gauche des objets Access,
Données de table Access à filtrer et extraire depuis formulaire

Nous ouvrons ainsi cette table en mode feuille de données. Cette table comporte un nombre important de champs sur 1536 enregistrements. Elle liste des idées de sorties regroupées par activités dans des départements de la France. A la lecture de cette table, il est donc difficile de réunir rapidement les idées de sorties qui correspondent à l'envie du moment, dans un département donné. C'est pourquoi nous proposons de finaliser un formulaire qui permettra de filtrer et extraire les idées de sorties, correspondant à la demande, grâce à des choix dans des listes déroulantes.
  • Fermer la table en cliquant sur la croix de son onglet,
  • Double cliquer sur le formulaire Formulaire_extraction depuis le volet des objets Access,
Le formulaire est ainsi ouvert en exécution. Comme le propose la capture ci-dessous, deux listes déroulantes permettent à l'utilisateur de formuler des critères de tris à recouper. Pour l'instant, ces listes déroulantes sont vides. Le formulaire ne propose aucun lien avec des objets Access.

A l'issue, le sous formulaire de la partie inférieure, devra afficher en temps réel, les résultats de l'extraction commandée par les requêtes effectuées par l'utilisateur, par le biais des listes déroulantes. Il va s'agir dans un premier temps de concevoir des requêtes dynamiques à relier aux différents contrôles du formulaire.
Conception du formulaire dynamique pour extraction des données Access

Requêtes dynamiques et bases SQL
Avant de plonger dans le code VBA Access, nous allons réaliser tous les filtres et extractions qu'il est possible de faire avec les objets que propose Access par défaut. La première liste déroulante doit proposer de choisir une activité de sortie recensée dans la base de données. La seconde doit permettre de restreindre le filtre sur le département. Ces données sont répétées de nombreuses fois dans la table societes puisque beaucoup d'idées de sorties sont situées dans le même département pour la même activité. Par exemple, il n'y a pas qu'un seul restaurant dans la Drôme. Il s'agit donc de construire deux requêtes capables d'extraire sans doublons, d'une part les activités et d'autre part, les départements. Une fois conçues, elles serviront de sources à chacune des listes déroulantes du formulaire. C'est le langage SQL avec une syntaxe très simple qui va réaliser cette extraction sans doublons.
  • Fermer le formulaire en cliquant sur la croix de son onglet,
  • Cliquer sur l'onglet Créer, en haut de la fenêtre Access pour activer son ruban,
  • Dans la section Requêtes, cliquer sur le bouton Création de requête,
  • Dans la boîte de dialogue qui suit, sélectionner la table societes,
  • Cliquer sur le bouton Ajouter puis sur le bouton Fermer,
Nous n'allons pas utiliser la grille de requête pour réaliser la sélection distincte des informations que nous souhaitons extraire, afin de nourrir la liste déroulante. L'objectif est de pouvoir, dans un premier temps, réaliser l'extraction de toutes les activités recensées dans la table, sans doublons. Le critère SQL doit donc être réalisé sur le champ societes_activite de la table.
  • Cliquer sur la flèche du bouton Affichage, en haut à gauche du ruban Créer, dédié aux requêtes,
  • Dans la liste, choisir Mode SQL,
Vous basculez sur l'affichage d'une feuille blanche, semblable à une feuille de code VBA. Il s'agit ici de bâtir la requête SQL qui réalisera cette extraction SQL. Le SQL est un langage universel qui permet d'attaquer les bases de données, notamment pour extraire de l'information.

Vous remarquez qu'une requête est déjà présente avec la syntaxe suivante :

SELECT FROM societes;

Il s'agit de la requête SQL la plus basique et la plus conventionnelle. Elle permet d'extraire toutes les informations de la base de données puisqu'aucun critère n'est encore posé. Le mot clé SELECT indique qu'il s'agit d'une requête sélection dont le but est de réaliser un filtre sur la table désignée après le mot clé FROM. Comme aucun champ n'est stipulé entre le SELECT et le FROM, cette requête doit extraire tous les champs de la table. Toutes les requêtes que vous construisez en mode création avec Access sont traduites en langage SQL.
  • Modifier la requête comme suit :
SELECT DISTINCT societes_activite FROM societes;

Le mot clé DISTINCT suivi du nom du champ sur lequel il agit, indique que la requête doit extraire les informations de ce champ sans doublons. Et seul ce champ sera affiché dans la sélection puisqu'aucun autre n'est stipulé.
  • Enregistrer cette requête (CTRL + S) sous le nom activites_distinctes,
  • Fermer cette requête en cliquant sur la croix de son onglet,
  • Puis, double cliquer sur cette requête depuis le volet de gauche pour l'exécuter,
Requête SQL pour extraire données de champ Access sans doublons

La requête affiche une sélection de la table source, en mode feuille de données. Et, comme vous le constatez, seul figure le champ societes_activite. Et pour ce champ, les activités sont en effet filtrées sans doublons. Il ne restera plus qu'à relier la liste déroulante du formulaire à cette requête SQL afin qu'elle propose ce contenu extrait. Mais avant cela, selon le même mode opératoire, nous allons bâtir la requête qui permet d'extraire tous les départements sans doublons, pour la seconde liste déroulante.
  • Fermer la requête en cliquant sur la croix de son onglet,
  • Activer le ruban Créer en cliquant sur son onglet en haut de la fenêtre Access,
  • Dans la section Requêtes, cliquer sur le bouton Création de requête,
  • Dans la fenêtre qui suit, sélectionner la table societes,
  • Cliquer sur le bouton Ajouter puis sur le bouton Fermer,
  • Cliquer sur la flèche du bouton Affichage en haut à gauche du ruban Créer,
  • Dans la liste, choisir Mode SQL comme précédemment,
  • Modifier la requête SQL comme suit :
SELECT DISTINCT societes_departement FROM societes;
  • Enregistrer la requête (CTRL + S) sous le nom : departements_distincts,
  • Puis la fermer en cliquant sur la croix de son onglet,
  • Enfin, double cliquer sur cette requête depuis le volet des objets Access pour l'exécuter,
Extraction sans doublon dans base de données Access

Chose promise, la requête extrait bien les départements issus de la table, sans doublons. Avant de connecter les listes déroulantes à ces requêtes SQL, nous avons besoin d'une requête sélection classique, pour alimenter le sous formulaire par défaut, à l'ouverture du formulaire. Mais nous ne souhaitons pas le détail de tous les champs. Donc nous allons la concevoir à l'aide de la grille de requête que propose Access.
  • Fermer la requête en cours en cliquant sur la croix de son onglet,
  • Dans le ruban Créer, cliquer sur le bouton Assistant Requête,
  • Dans la boîte de dialogue qui suit, choisir Requête simple et cliquer sur Suivant,
  • Dans l'étape qui suit, ajouter les champs societes_nom, societes_activite, societes_departement, societes_ville, societes_contact, societes_tel, societes_mail et societes_web,
Requête sélection pour filtrer données de base avec assistant

Pour ce faire, il suffit de sélectionner un champ depuis la liste de gauche et de cliquer sur la flèche dirigée vers la droite, pour le basculer dans les champs à intégrer, dans la liste de droite.
  • Cliquer sur le bouton Suivant,
  • Dans la dernière étape, nommer la requête : societes_sans_critere,
  • Puis cliquer sur Terminer,
Les 1536 enregistrements s'affichent en mode feuille de données, mais seulement pour les champs sélectionnés. Cette requête, bien que n'excluant aucun enregistrement, offre une vue simplifiée de la table d'origine.
  • Fermer la requête en cliquant sur la croix de son onglet.
Relier les contrôles de formulaire aux requêtes - Objets sources
Les contrôles de formulaire sont semblables à des objets de programmation. Ils disposent de propriétés, accessibles depuis leur feuille de propriétés qui permettent de les personnaliser, ou encore de les lier à des sources de données. Ils proposent de même un gestionnaire d'événements qui permet de déclencher des actions, gérées par des macros ou du code VBA, sur ordre précis. C'est ce que nous avions appris au travers de la formation pour débuter la programmation en Visual Basic pour Access. Et c'est ce dont nous allons nous servir ici.
  • Cliquer avec le bouton droit de la souris sur l'objet Formulaire_extraction depuis le volet gauche des objets Access,
  • Dans le menu contextuel, choisir Mode création,
  • Sélectionner la première liste déroulante pour filtrer par activités,
  • Dans le ruban Création, cliquer sur le bouton Feuille de propriétés si cette dernière n'est pas visible,
  • Dans la feuille de propriétés sur la droite, activer l'onglet Données,
  • Cliquer sur la flèche de la propriété Contenu,
  • Dans la liste, choisir la requête activites_distinctes,
  • Sélectionner la seconde liste déroulante du formulaire,
  • Cliquer sur la flèche de sa propriété Contenu depuis sa feuille de propriétés,
  • Dans la liste, choisir la requête departements_distincts,
Connecter objets de formulaire liste déroulante à requête Access

Désormais, les deux listes déroulantes doivent se remplir du contenu extrait par les deux requêtes SQL. Mais avant de le vérifier en exécutant le formulaire, nous devons lier le sous formulaire à la requête sélection.
  • Sélectionner le rectangle sous le titre Retour de l'extraction,
  • Cliquer sur la flèche de sa propriété Objet source dans l'onglet Données de sa feuille de propriétés,
  • Dans la liste, choisir l'objet Requête.societes_sans_critere,
  • Enregistrer les modifications (CTRL + S) puis exécuter le formulaire (F5),
Contrôles de formulaire Access dynamiquement liés aux données par requêtes

Comme vous le constatez, le sous formulaire offre la vue des 1536 enregistrements de la table source, uniquement pour les champs définis par la requête Sélection. Les listes déroulantes proposent respectivement les activités et départements sans doublons. A ce stade en revanche, aucune interaction n'existe entre les contrôles. Le fait de choisir une activité et/ou un département par le biais des listes, ne filtre pas les données du sous formulaire selon ces critères dynamiques. C'est l'objectif que nous devons atteindre désormais.

Extraire l'information selon action utilisateur depuis le formulaire
Nous devons construire des requêtes dynamiques qui extraient les résultats, selon les choix opérés par l'utilisateur au travers des listes déroulantes. Alors nous devrons être en mesure de modifier la source de contrôle du sous formulaire, en temps réel, afin qu'il affiche les résultats extraits, correspondant aux filtres occasionnés par les listes déroulantes. Nous devons prévoir trois requêtes aux critères dynamiques. La première doit correspondre au critère de l'activité sélectionnée seule. La seconde doit correspondre au critère dynamique du département sélectionné seul. La dernière doit permettre de recouper les deux critères, si l'utilisateur a fait des choix dans les deux listes déroulantes. Comme ces requêtes dynamiques doivent extraire l'information sur les mêmes champs que la requête sélection, nous allons partir de cette dernière et la personnaliser.
  • Fermer le formulaire en cliquant sur la croix de son onglet,
  • Sélectionner la requête societes_sans_critere depuis le volet de gauche,
  • Réaliser le raccourci CTRL + C pour la copier et CTRL + V pour la dupliquer,
  • La renommer critere_activite dans la boîte de dialogue qui suit et valider,
  • Cliquer avec le bouton droit sur cette requête critere_activite depuis le volet de gauche,
  • Dans le menu contextuel, choisir Mode Création,
La requête s'affiche en mode conception. Tous les champs qui avaient été désignés grâce à l'assistant sont déjà placés dans la grille de requête. Il s'agit maintenant de définir un critère dynamique sur le champ societes_activite. Ce critère doit correspondre au choix fait par l'utilisateur, dans la liste déroulante des activités, depuis le formulaire. Nous avions appris à créer ce type de critère dynamique dans la formation Access pour relier un formulaire et une requête.
  • Cliquer avec le bouton droit de la souris dans la zone Critères du champ societes_activite,
  • Dans le menu contextuel, choisir Créer,
  • Dans le générateur d'expressions, déployer l'affichage des formulaires depuis le liste de gauche,
  • Sélectionner alors le formulaire Formulaire_extraction,
  • Dans la partie centrale, double cliquer sur le contrôle liste_activites,
Requête critère dynamique selon choix liste déroulante formulaire grâce générateur expression

L'expression de correspondance s'affiche dans la zone d'expression en haut de la boîte de dialogue.

[Formulaires]![Formulaire_extraction]![liste_activites]

Liste_activites désigne l'objet liste déroulante des activités du formulaire. Comme ce critère est posé sur le champ societes_activite, la requête doit filtrer les enregistrements correspondant à l'activité choisie depuis le formulaire, par le biais de cette liste déroulante.
  • Valider cette expression en cliquant sur le bouton Ok,
  • Enregistrer les modifications et fermer la requête,
Bien sûr, cette requête ne peut pas être exploitée indépendamment du formulaire puisque son critère dépend de la valeur choisie, à l'instant t par l'utilisateur, par le biais de la liste déroulante. Ainsi, si vous double cliquez dessus depuis le volet des objets Access, une boîte de dialogue vous demandera de préciser le critère sur le champ societes_activite.

Nous devons maintenant concevoir la requête qui permettra d'extraire les informations de la table, en fonction du département choisi par l'utilisateur, par le biais de la seconde liste déroulante. La technique est exactement la même.
  • Dupliquer de nouveau la requête societes_sans_critere comme précédemment,
  • Nommer la copie : critere_departement et l'ouvrir en mode création,
  • Générer l'expression : Formulaires![Formulaire_extraction]![liste_departement], dans la zone de critères du champ societes_departement, en suivant la même procédure que précédemment,
  • Enregistrer les modifications et fermer la requête,
Elle apparaît, tout comme la précédente, dans le volet des objets Access, précisément dans la section des requêtes. Il reste à créer une dernière requête dynamique, celle qui permet d'extraire les informations selon les critères recoupés sur l'activité et le département. C'est une sorte d'union des deux précédentes requêtes.
  • Dupliquer cette fois la requête critere_departement,
  • La renommer : critere_departement_activite, puis l'ouvrir en mode Création,
Le critère sur le champ societes_departement est ainsi déjà créé. Il s'agit de répliquer celui de l'autre requête sur le champ societes_activite. Lorsque des critères sont ainsi énoncés sur plusieurs champs, mais sur la même ligne de la zone de critères, ils agissent comme un ET. Cela signifie qu'ils doivent être vérifiés ensemble, l'un et l'autre, donc recoupés.
  • Dans la zone de critères du champ societes_activite, générer l'expression :
[Formulaires]![Formulaire_extraction]![liste_activites]
  • Enregistrer les modifications et fermer la requête.
Changer dynamiquement la source de contrôle d'un sous formulaire
L'objectif désormais est de pouvoir charger le sous formulaire des informations extraites par les requêtes, en fonction des choix réalisés par l'utilisateur, au travers des listes déroulantes. Or la source de contrôle du sous formulaire est définie une fois pour toutes, grâce à la feuille de propriétés. C'est là que VBA Access intervient. Visual Basic va permettre de modifier la source du contrôle, selon l'événement généré par l'utilisateur. La formation VBA Access pour créer des interactions entre les objets de base de données, nous avait appris à manipuler ce gestionnaire d'événements. Les événements en question doivent être interceptés lorsque l'utilisateur fait un choix dans une liste déroulante.
  • Cliquer avec le bouton droit de la souris sur l'objet Formulaire_extraction depuis le volet des objets Access,
  • Dans le menu contextuel, choisir Mode création,
  • Sélectionner la première liste déroulante, celle des activités,
  • Activer l'onglet Evénement de sa feuille de propriétés,
  • Cliquer sur le petit bouton associé à l'événement Sur changement,
  • Dans la boîte de dialogue qui suit, sélectionner Générateur de code et valider,
Nous basculons ainsi dans l'éditeur de code Visual Basic entre les bornes de la procédure événementielle : Private Sub liste_activites_Change(). liste_activites est le nom de l'objet liste déroulante. Change est l'événement associé à cet objet. Lorsqu'il est intercepté parce que l'utilisateur change la valeur choisie dans la liste déroulante, le code saisi entre les bornes de cette procédure se déclenche.

Il s'agit ici de modifier la source du sous formulaire, selon le cas. Si les deux listes déroulantes contiennent des valeurs, alors la requête aux critères recoupés (Activités + Départements : critere_departement_activite) doit servir à charger le sous formulaire. Sinon, seule la requête critere_activite doit servir à charger le sous formulaire. Pour vérifier ce critère nous devons exploiter l'instruction de branchement If que nous avions apprise à programmer dans la formation VBA Excel pour gérer les critères. En d'autres termes, nous devons traduire ceci : Si la valeur de la liste déroulante des départements n'est pas définie (IsNull), alors le sous formulaire doit être bâti sur la requête des activités. Sinon, il doit être bâti sur la requête recoupée des activités et départements. Grâce aux macros converties de la formation sur les interactions des objets Access en VBA, nous avions appris que nous pouvions désigner un contrôle de formulaire par son nom, grâce à l'objet Forms pour formulaires, en désignant et le nom du formulaire, et le nom du contrôle liste déroulante, comme suit :

Forms![ Formulaire_extraction]![liste_departements]
  • Selon ce principe, saisir le code suivant entre les bornes de la procédure :
If( IsNull( Forms![Formulaire_extraction]![liste_departement] )) Then
zone_extraction.SourceObject = 'Query.critere_activite'
Else
zone_extraction.SourceObject = 'Query.critere_departement_activite'
End If

zone_extraction.Requery


La fonction VBA Access IsNull permet de savoir si le contrôle passé en paramètre (liste_departement) est défini. Si aucune valeur n'a encore été choisie, elle renvoie True, signifiant qu'aucun critère n'a encore été spécifié par le biais de la liste déroulante des départements. Dans ce cas, nous lions le sous formulaire à la source de données générée par la requête critere_activite. Cette dernière génère en effet une extraction de la base de données, selon l'activité choisie par l'utilisateur par le biais de la première liste déroulante. C'est la propriété SourceObject, de l'objet sous formulaire désigné par son nom (zone_extraction), qui permet de modifier la source de données. Notez que dans l'affectation, le nom de la requête source doit être préfixée du mot clé Query (Query.critere_activite), désignant une requête. En effet, rien n'empêche un formulaire de porter le même nom par exemple. Pour éviter tout ambiguïté, il faut donc spécifier la nature de l'objet source.

Dans le cas contraire (Else), la requête aux deux critères recoupés sert de source de données (zone_extraction.SourceObject = 'Query.critere_departement_activite'). Enfin, une fois que le test est terminé (Enf If), nous forçons la mise à jour du sous formulaire grâce à sa méthode Requery (zone_extraction.Requery). Nous mettons ainsi à jour la liaison et donc, la source de données.
  • Enregistrer les modifications (CTRL + S),
  • Basculer sur le formulaire grâce au raccourci clavier ALT + F11 par exemple,
  • Exécuter ce dernier en enfonçant la touche F5 du clavier,
  • Sélectionner une activité de sortie à l'aide de la première liste déroulante,
Vous remarquez que le contenu du sous formulaire s'adapte instantanément, grâce au code VBA Access, selon le critère dynamique généré par la requête, qui a récupéré l'information choisie par l'utilisateur dans la liste.

En revanche, si vous choisissez un élément dans la liste déroulante des départements, rien ne se produit. En effet, pour l'instant, nous n'avons développé aucun code associé à l'événement sur changement, pour cette liste.

Par contre, une fois le département désigné, si vous changez de nouveau d'activité, le sous formulaire se charge des critères recoupés. C'est la branche Else du If qui est déclenchée pour charger la requête critere_departement_activite, comme source de données du sous formulaire.

C'est d'ailleurs ce qu'illustre la capture ci-dessous. Nous avons choisi de n'afficher que les restaurants pour le département de la Drôme.
Données extraites dynamiquement dans sous formulaire grâce à VBA pour modifier source requête

Nous devons maintenant développer le code associé au changement de la seconde liste déroulante. Le principe est le même. Si le choix des activités n'est pas défini, la source du sous formulaire doit être la requête sur les départements. Sinon, il doit s'agir, comme précédemment, de la requête recoupée sur les deux critères.
  • Afficher de nouveau le formulaire en mode création,
  • Sélectionner la deuxième liste déroulante (liste_departement),
  • Cliquer sur le bouton de son événement Sur changement depuis sa feuille de propriétés,
  • Choisir Générateur de code et valider,
Nous basculons de nouveau dans l'éditeur de code VBA, entre les bornes de la procédure événementielle : liste_departement_Change. Le code développé entre ces bornes se déclenchera donc lorsqu'un changement de valeur sera détecté dans la liste déroulante nommée : liste_departement.
  • Saisir le code suivant :
If( IsNull( Forms![Formulaire_extraction]![liste_activites] )) Then
zone_extraction.SourceObject = 'Query.critere_departement'
Else
zone_extraction.SourceObject = 'Query.critere_departement_activite'
End If

zone_extraction.Requery


On change le nom de l'objet sur lequel on fait le test (liste_activites) ainsi que le nom de la requête à charger (critere_departement), si le critère est vérifié. Littéralement, au changement de valeur dans la liste des départements, si aucune valeur n'est encore définie pour les activités, on charge la requête du critère du département. Sinon on charge la requête qui recoupe les deux critères. A l'issue, comme précédemment, on réactualise le lien entre le sous formulaire et la requête grâce à la méthode Requery.
  • Enregistrer les modifications et basculer sur le formulaire,
  • L'exécuter et choisir une activité puis un département,
Filtrer base de données Access avec changement liste déroulante détecté par Visual Basic

Cette fois, les données du sous formulaire se mettent à jour instantanément, au changement de valeur dans les deux listes déroulantes. Il aurait pu être intéressant d'ajouter une zone de saisie pour définir un critère sur le nom de la société. Mais avec une requête, nous aurions défini un critère LIKE général sur le mot clé tapé. Nous aurions obtenu des résultats assez grossiers. Pour des résultats plus fins et plus proches, nous aurons besoin cette fois d'un code VBA Access plus subtil. C'est ce que nous verrons dans une prochaine formation.
 
Sur Facebook
Sur Youtube
Les livres
Contact
Mentions légales



Abonnement à la chaîne Youtube
Partager la formation
Partager sur Facebook
Partager sur Twitter
Partager sur LinkedIn