Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :
Sujets que vous pourriez aussi aimer :Extraire une information au clic
Grâce aux travaux cumulés lors des
astuces précédentes, nous avons monté un outil fort intéressant. Nous disposons désormais d'un
formulaire parent encapsulant deux
sous-formulaire. Le
formulaire parent permet de consulter les informations des clients de l'entreprise. Pour chaque client ainsi passé en revue, le premier
sous-formulaire restitue automatiquement toutes les commandes qu'il a passées. Et au clic sur l'une d'entre elles, le
détail de la commande est délivré dans le second
sous-formulaire. Mais ce détail n'offre pas tous les renseignements sur les articles achetés, comme la désignation et le prix par exemple. Il s'agit en effet d'une vraie
application Access articulant quatre tables reliées entre elles pour des raisons d'optimisation de ressources.
Désormais donc, au clic sur une ligne d'un produit acheté dans le second
sous-formulaire, nous souhaitons importer automatiquement l'information sur la désignation du produit. Et ce renseignement doit s'incruster dans une zone grisée située sur la gauche de l'écran de l'application.
Base de données source
Nous le disions, nous souhaitons agir à partir de cette application améliorée au fil des
astuces précédentes. Il s'agit donc de récupérer cette
base de données dans un premier temps.
- Télécharger le fichier extraire-donnee-rechdom.rar en cliquant sur ce lien,
- Le décompresser dans le dossier de votre choix,
- Double cliquer sur le fichier résultant pour l'ouvrir dans Access,
- Cliquer sur le bouton Activer le contenu du bandeau de sécurité,
- Puis, dans le volet de navigation, double cliquer sur le formulaire f_Clients pour l'exécuter,
La partie gauche du
formulaire renseigne sur le client en cours de consultation. Toutes ses
commandes sont listées dans le premier
sous-formulaire placé dans la partie supérieure droite. La
barre de navigation personnalisée propose des boutons de déplacement qui permettent de faire défiler les clients. Et pour chaque client, le premier
sous-formulaire s'actualise automatiquement pour énumérer ses commandes. Au clic sur l'une d'entre elles, le détail des achats est livré dans le second
sous-formulaire, positionné dans la partie inférieure droite du
formulaire parent. Tout cela, nous l'avons constaté au cours de la présentation de l'enjeu de cette
astuce. Et donc à ce stade, si vous cliquez sur l'une des lignes d'un détail de commande, aucune information n'est extraite dans le petit rectangle grisé situé en bas à gauche du
formulaire parent. Nous devons être en mesure de récolter la référence de l'enregistrement cliqué. En fonction de cette référence, nous devons pouvoir extraire la donnée sur la désignation de l'article. Nous pourrions d'ailleurs en profiter pour restituer le prix. Mais pour l'exemple, une seule information suffira.
Extraire la référence de l'article
Pour extraire une information encapsulée dans un sous-formulaire, un petit
code VBA Access est nécessaire. Mais il est très simple et consiste en une instruction triviale. C'est ce
code qui va nous permettre de descendre dans la hiérarchie pour atteindre le
contrôle de la référence encapsulé dans le
sous-formulaire, lui-même encapsulé dans le
formulaire parent.
- A gauche du ruban Accueil, cliquer sur la flèche du bouton Affichage,
- Dans la liste des propositions, choisir le mode création,
Nous basculons ainsi dans la vue en conception du
formulaire. En le faisant défiler vers le bas, vous notez la présence de deux zones de texte, sanctionnées par l'intitulé Indépendant.
Elles sont respectivement nommées
Recup et
Article. C'est la
feuille de propriétés qui renseigne sur ces noms après les avoir sélectionnés tour à tour. La
zone Recup est prévue pour l'extraction de la référence cliquée. Elle pourra être masquée à l'issue. Son rôle est de transmettre ce code à la
fonction RechDom qui doit exercer dans la
zone Article afin de livrer la désignation correspondant à la référence du produit cliqué.
- Cliquer sur le second sous-formulaire pour le sélectionner,
- Dès lors, cliquer sur son contrôle Det_num pour le désigner,
- Activer ensuite l'onglet Evénement de la feuille de propriétés,
- Puis, cliquer sur le petit bouton situé à l'extrémité droite de son événement Au clic,
- Dans la boîte de dialogue qui surgit, choisir le Générateur de code et valider par Ok,
Nous basculons ainsi dans l'
éditeur de code Visual Basic Access, plus précisément entre les bornes de la
procédure événementielle Det_num_Click. Son code se déclenchera donc au clic sur l'une des références du détail de la commande souhaitée. Il s'agit maintenant d'extraire cette référence pour la greffer dans la zone de saisie nommée
Recup.
- Entre les bornes de cette procédure, ajouter l'instruction VBA Access suivante :
Forms("f_clients").Recup.Value = Det_ref.Value
L'
objet VBA Forms permet de désigner le
formulaire parent f_clients par son nom. Grâce à lui, nous pouvons atteindre son
contrôle Recup. Dès lors, nous exploitons sa
propriété Value pour l'affecter de la valeur à récupérer. De la même façon, nous exploitons la
propriété Value du
contrôle Det_ref, celui du second
sous-formulaire. Nous ne sommes pas contraints de le désigner en descendant dans la hiérarchie des contrôles encapsulés dans la mesure où cette
procédure événementielle est explicitement attachée à l'un de ses contrôles. En revanche, lorsque l'utilisateur clique sur une ligne du détail, rien n'indique quel contrôle il a pointé la souris. C'est la raison pour laquelle, nous devons déclencher cette même instruction sur chacun d'entre eux.
- En haut de l'éditeur VBA Access, déployer la liste déroulante de gauche,
- Dans l'énumération, sélectionner le contrôle Det_com,
- Déployer alors la liste déroulante de droite et choisir l'événement Click,
- Entre les bornes de cette nouvelle procédure, coller la précédente instruction,
Nous devons ensuite reproduire exactement la même procédure pour les contrôles Det_qte, Det_ref et Det_remise :
Private Sub Det_com_Click()
Forms("f_clients").Recup.Value = Det_ref.Value
End Sub
Private Sub Det_num_Click()
Forms("f_clients").Recup.Value = Det_ref.Value
End Sub
Private Sub Det_qte_Click()
Forms("f_clients").Recup.Value = Det_ref.Value
End Sub
Private Sub Det_ref_Click()
Forms("f_clients").Recup.Value = Det_ref.Value
End Sub
Private Sub Det_remise_Click()
Forms("f_clients").Recup.Value = Det_ref.Value
End Sub
Puis, il s'agit de supprimer les
procédures événementielles vides générées automatiquement au choix d'un contrôle dans la première liste déroulante.
- Enregistrer les modifications (CTRL + S) puis fermer l'éditeur de code VBA Access,
- De retour sur le formulaire, l'enregistrer à son tour et l'exécuter avec la touche F5,
Vous pouvez naviguer au travers des clients et cliquer sur l'une de ses commandes dans le premier
sous-formulaire. Dès lors, au clic sur l'une des lignes du détail de la commande en question, vous constatez que la référence de l'article acheté est extirpée et restituée dans la
zone de texte Recup.
Rechercher l'information associée
Désormais, le plus dur est fait. Nous devons exploiter cette référence extraite pour trouver la désignation associée dans la table liée
Produits. Pour cela, la
fonction Access RechDom est dédiée. Il suffit de lui indiquer le nom du champ désiré en premier paramètre. Il s'agit du
champ produit_nom. Ensuite, nous devons lui indiquer le nom de la table hébergeant ce champ. Il s'agit de la
table Produits. Enfin, en troisième et dernier paramètre, nous devons émettre la
clause Where. C'est elle qui va permettre d'isoler précisément la donnée souhaitée en fonction de la référence cliquée. Nous devons donc poser une condition sur le
champ produit_ref et vérifier que sa valeur est identique à celle de la référence cliquée. Par contre et pour éviter toute erreur, nous devons nous assurer que la
zone Recup porte bien une valeur avant d'enclencher le calcul. Tant que l'utilisateur n'a pas cliqué sur le détail d'une commande, elle ne porte aucune donnée. Donc, nous devons encapsuler la
fonction RechDom dans la
fonction Access VraiFaux. Il s'agit de l'équivalent de la
fonction Excel Si.
- 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 la zone Article pour la sélectionner,
- Activer l'onglet Données de sa feuille de propriétés,
- Cliquer dans la zone vide de son attribut Source contrôle pour l'activer,
- Taper le symbole égal (=) pour initier la syntaxe de la formule,
- Inscrire la fonction conditionnelle suivie d'une parenthèse, soit : VraiFaux(,
- Désigner la zone de texte à contrôler entre crochets, soit : [Recup],
- Puis, taper l'égalité suivante : ="", pour le critère à vérifier,
- Taper alors un point-virgule (;) pour passer dans la branche Alors de la fonction conditionnelle,
- Inscrire deux guillemets ("") pour garder la zone vide,
De cette manière, lorsqu'aucune référence n'a encore été importée dans la
zone Recup, nous n'enclenchons aucune recherche.
- Taper un point-virgule (;) pour passer dans la branche Sinon de la fonction conditionnelle,
- Inscrire la fonction de recherche suivie d'une parenthèse, soit : RechDom(,
- Désigner le champ de recherche entre guillemets et entre crochets, soit : "[produit_nom]",
- Taper un point-virgule (;) pour passer dans l'argument de la table contenant ce champ,
- Inscrire le nom de la table entre guillemets, soit : "Produits",
- Taper un point-virgule (;) pour passer dans l'argument de la clause Where,
- Ouvrir les guillemets et inscrire le nom du champ à analyser, soit : "[produit_ref],
- Taper le symbole égal (=) pour annoncer le critère à honorer,
- Inscrire une simple côte suivie d'une double côte (guillemet), soit : '",
En effet, la valeur à comparer doit être concaténée dynamiquement. Elle est portée par le
champ Recup. Il s'agit d'un texte. Tout texte doit être encadré de côtes. Mais comme les doubles sont déjà utilisées dans la syntaxe, nous les simulons par les simples côtes.
- Taper un espace suivi du symbole de concaténation, suivi d'un espace, soit : & ,
- Désigner la zone de la valeur extraite entre crochets, soit : [Recup],
Comme cette information est directement située sur le
formulaire et non dans une table, nous ne devons pas l'encadrer de guillemets.
- Taper de nouveau un espace suivi du caractère de concaténation, suivi d'un nouvel espace,
- Inscrire alors une simple côte entre guillemets, soit : "'",
- Fermer la parenthèse de la fonction RechDom,
- Fermer la parenthèse de la fonction VraiFaux,
- Valider la syntaxe de la formule par la touche Entrée du clavier,
- Enregistrer les modifications (CTRL + S) et exécuter le formulaire (F5),
Désormais, quel que soit le client choisi avec la barre de navigation, au clic sur l'une de ses commandes, puis au clic sur l'un des détails de cette commande, la désignation est parfaitement restituée dans la zone de texte prévue à cet effet.
La syntaxe que nous avons construite pour récupérer cette information en fonction de la référence importée au clic par le
code VBA, est la suivante :
=VraiFaux([Recup]=""; ""; RechDom("[produit_nom]"; "Produits"; "[produit_ref]='" & [Recup] & "'"))
Nous aurions aussi pu récupérer le prix. Pour cela, il aurait suffi de concaténer une nouvelle recherche avec la
fonction RechDom. Mais alors, elle aurait dû agir sur le
champ produit_prix.
Pour parachever l'application, il convient de masquer la
zone Recup. Pour cela, il suffit de régler sa
propriété Visible Ã
Non, dans l'
onglet Format de sa
feuille de propriétés.