Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :
Sujets que vous pourriez aussi aimer :Adapter la vue d'un état
Pour des raisons d'optimisation d'une 
base de données et d'une 
application Access, il est important de ne pas multiplier la création des objets. Par exemple, 
une seule et même requête doit être en mesure d'adapter ses filtres et tris en fonction des sollicitations émises depuis un 
formulaire. De la même façon, 
un seul et même état doit être capable de livrer une vue adaptée à la demande dynamique effectuée depuis un 
formulaire.

Sur l'exemple illustré par la capture, un 
formulaire tabulaire énumère des activités de sorties recensées dans différents départements. L'utilisateur peut choisir l'un de ces départements à l'aide d'une 
liste déroulante placée en haut à droite de la fenêtre. Dès lors, s'il clique sur le 
bouton Aperçu, il obtient une vue prête à l'impression de toutes les activités de sorties dans le département demandé. La 
source de données de l'état cible a donc été modifiée dynamiquement en fonction du choix utilisateur depuis le 
formulaire.
Base de données à télécharger
Pour la démonstration de cette nouvelle 
astuce VBA Access, nous suggérons d'appuyer l'étude sur une 
base de données offrant ces 
activités de sorties. 
Comme l'indique le 
volet de navigation sur la gauche de l'écran, cette petite 
base de données est constituée d'une 
table listant les 
activités de sorties ainsi que d'un 
formulaire et d'un 
état.
- Double cliquer sur le formulaire f_societes pour l'ouvrir,
 
Il est fidèle à celui de la présentation. En mode tabulaire, il énumère pêle-mêle, toutes les 
activités de sorties recensées dans la 
table societes. En haut à droite de ce 
formulaire, l'utilisateur peut définir un département avec une 
liste déroulante. Mais à ce stade bien entendu, s'il clique ensuite sur le 
bouton Aperçu, rien ne se produit encore. L'objectif et nous l'avons dit, est d'afficher une vue filtrée de ces activités sur le département choisi.
- Dans le volet de navigation, double cliquer sur l'état e_societes pour commander l'aperçu,
 
Nous débouchons sur un affichage de toutes les sorties mélangées, dans une 
vue prête à l'impression. Cet 
état a simplement été construit sur la 
table societes sans clause Where. C'est lui que nous devons afficher 
au clic sur le bouton du formulaire, en adaptant dynamiquement sa 
source de données, pour imposer le 
filtre sur le département désigné par l'utilisateur.
Code VBA Access au clic
Nous devons donc commencer par créer la 
procédure événementielle associée au 
bouton du formulaire.
- Fermer l'état pour revenir sur le formulaire en exécution,
 
- A gauche du ruban Accueil, cliquer sur la flèche du bouton Affichage,
 
- Dans les propositions, choisir le mode Création,
 
- Sur le formulaire en conception, cliquer sur le bouton en haut à droite, pour le sélectionner,
 
- Dès lors, activer l'onglet Evénement de sa feuille de propriétés,
 
Si elle n'est pas visible dans votre environnement, vous devez l'afficher. Pour cela, vous devez cliquer sur le 
bouton Feuille de propriétés dans le 
ruban Création ou le 
ruban Conception de formulaire (Selon la version).
- Dans l'onglet Evénement donc, cliquer sur le bouton de son événement Au clic,
 
- Dans la boîte de dialogue qui suit, choisir le générateur de code et valider par le bouton Ok,
 

Nous basculons ainsi dans l'
éditeur VBA Access entre les bornes de la 
procédure événementielle Apercu_Click :
Private Sub Apercu_Click()
End Sub
Son code se déclenchera naturellement au clic de l'utilisateur sur ce bouton. C'est lui qui doit ajuster la 
source de données de l'état pour ensuite l'afficher. Et pour la suite des démonstrations nous proposons de procéder par étapes.
Les variables
Nous avons tout d'abord besoin de calibrer une 
requête à utiliser comme source de données mais aussi de piloter l'
état à afficher. C'est la raison pour laquelle, nous devons déclarer 
deux variables dédiées.
- Dans les bornes de la procédure événementielle, ajouter les deux déclarations suivantes :
 
Dim requete As String: Dim Etat As Report
Nous déclarons la 
variable requete et la typons comme un texte (As String). Elle doit en effet recevoir la 
syntaxe Sql de la requête à utiliser comme 
source de données de l'état. Et précisément pour pouvoir piloter ce dernier, nous déclarons la 
variable Etat comme un 
objet de type Report, soit un 
objet Etat.
Etat et requête
Nous devons maintenant 
initialiser ces deux variables en commençant par la 
syntaxe Sql à stocker dans la 
variable requete. Il s'agit d'une 
requête sélection classique mais sa 
clause Where est dynamique. Elle dépend du choix du département effectué par l'utilisateur avec la 
liste déroulante nommée 
ListeDep. Elle doit agir sur le 
champ societes_departement de la 
table societes.
- A la suite du code de la procédure événementielle, ajouter l'affectation suivante :
 
requete = "SELECT * FROM societes WHERE societes_departement = '" & ListeDep.Value & "' ORDER BY societes_nom;"
Nous sélectionnons (SELECT) 
tous les champs (*) de la 
table societes (FROM societes) pour lesquels (WHERE) le 
département (societes_departement) équivaut à celui choisi par l'utilisateur avec la 
liste déroulante (ListeDep.Value). Notez la présence des 
simples côtes avant la double côte fermante ('") et après la double côte ouvrante ("') pour la concaténation de la partie dynamique. En effet, il s'agit d'une valeur textuelle. Elle doit donc être encadrée. Enfin, nous organisons un 
tri croissant sur le nom des activités (ORDER BY societes_nom).
Maintenant et avant de pouvoir 
piloter l'état avec la variable objet, nous devons l'ouvrir en 
mode création par le 
code VBA. C'est seulement ainsi que nous pourrons influer sur ses propriétés pour modifier sa 
source de données. Et c'est alors que nous retrouvons sur notre chemin, le précieux 
objet DoCmd (Do Command) qui permet d'engager de très nombreuses actions grâce à ses riches 
méthodes.
- A la suite du code, ajouter l'instruction VBA suivante :
 
DoCmd.OpenReport "e_societes", acViewDesign, , , acHidden
Grâce à la 
méthode OpenReport de l'
objet DoCmd, nous définissons tout d'abord le nom de l'état ("e_societes") à ouvrir, en premier paramètre. En deuxième paramètre, nous indiquons que nous souhaitons l'atteindre en mode conception avec la 
valeur acViewDesign. Nous ignorons le troisième et quatrième paramètres. Ils sont facultatifs. C'est ainsi que nous atteignons le cinquième paramètre. Avec la 
valeur acHidden, nous conservons le formulaire masqué pour agir en arrière-plan.
Désormais, nous devons initialiser la 
variable objet pour qu'elle prenne possession de l'
état.
- A la suite du code VBA, ajouter l'initialisation suivante :
 
Set Etat = Application.Reports("e_societes")
Grâce à la 
propriété Reports de l'
objet Application, nous 
instancions la classe permettant à la variable de 
piloter un état. Le nom de cet état est passé en paramètre de la propriété. D'ailleurs, nous aurions pu le stocker dans une variable pour éviter de le répéter à chaque reprise. Dès lors, la 
variable objet Etat hérite des 
propriétés et 
méthodes pour piloter cet élément par le 
code VBA.
Changer la source de l'état
Puisque l'
état est ouvert en 
mode création, nous allons pouvoir exploiter cette 
variable objet pour 
modifier la source de l'état en corrélation avec le 
choix du département effectué par l'utilisateur.
- A la suite du code, ajouter l'instruction VBA suivante :
 
Etat.RecordSource = requete
C'est donc la 
propriété RecordSource d'un 
objet de type Report qui permet de définir la 
source de données de l'état représenté par la variable. Et cette source, nous la définissons dynamiquement grâce à la 
requête Sql que nous avons stockée dans la 
variable requete.
Enregistrer les modifications et afficher l'état
Puisque la 
source a été redéfinie en arrière-plan, nous devons maintenant sauvegarder ces réglages en 
fermant le formulaire pour le 
rouvrir en mode normal. C'est ainsi que nous offrirons à l'utilisateur la 
vue filtrée correspondant à son choix.
- A la suite du code de la procédure, ajouter les deux lignes VBA suivantes :
 
DoCmd.Close acReport, "e_societes", acSaveYes
DoCmd.OpenReport "e_societes", acViewReport, , , acWindowNormal
Nous retrouvons notre 
objet DoCmd. Grâce à sa 
méthode Close, nous définissons que l'objet à fermer est un 
état (acReport). En deuxième paramètre, nous renseignons bien entendu le nom de cet état. En dernier paramètre, nous indiquons que les modifications opérées sur la source de données doivent être conservées (acSaveYes). Ensuite, nous utilisons de nouveau la 
méthode OpenReport. Mais cette fois, nous ouvrons le 
formulaire e_societes en mode exécution (
acViewReport).
- Enregistrer les modifications (CTRL + S) puis fermer l'éditeur VBA Access,
 
- De retour sur le formulaire, l'enregistrer à son tour,
 
- Puis, l'exécuter avec la touche F5 du clavier,
 
- Dès lors, choisir un département avec la liste déroulante, par exemple : 38-Isère,
 
- Puis, cliquer sur le bouton Aperçu,
 

Comme vous pouvez l'apprécier, le 
rendu de l'état est aussitôt livré mais il est dynamiquement calibré sur les activités de sorties du département choisi par l'utilisateur. Bien entendu, si vous fermez l'état, que vous choisissez un nouveau département sur le formulaire et que vous cliquez de nouveau sur le bouton Aperçu, c'est une nouvelle vue qui est proposée en corrélation avec ce nouveau choix
Pour un tel résultat, le code complet de la 
procédure événementielle que nous avons construite, est relativement simple :
Private Sub Apercu_Click()
Dim requete As String: Dim Etat As Report
requete = "SELECT * FROM societes WHERE societes_departement='" & ListeDep.Value & "' ORDER BY societes_nom;"
DoCmd.OpenReport "e_societes", acViewDesign, , , acHidden
Set Etat = Application.Reports("e_societes")
Etat.RecordSource = requete
DoCmd.Close acReport, "e_societes", acSaveYes
DoCmd.OpenReport "e_societes", acViewReport, , , acWindowNormal
End Sub