IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Voir le flux RSS

informer

MS-Access - VBA : Comprendre l'appel aux sous-formulaires. Concept du CONTENEUR

Noter ce billet
par , 21/11/2021 à 02h58 (5529 Affichages)
La notion de CONTENEUR de formulaire

La subtilité avec les sous-formulaires c'est la notion de CONTENEUR de FORMULAIRE. Et au contraire des autres contrôles, il n'existe pas dans la liste des objets ActivX.
Le CONTENEUR est généré automatiquement quand le formulaire est placé dans un autre formulaire par Drag & Drop.

Et pour ajouter à la confusion, le nom du CONTENEUR est par défaut le même que celui du formulaire placé par Drag & Drop dans le formulaire père.
Mais il est tout a fait possible de renommer le CONTENEUR via sa propriété NAME (NOM) dans l'onglet AUTRE.

Le CONTENEUR permet l'instanciation du formulaire associé via l'OBJET SOURCE, propriété dans l'onglet DATA (DONNÉES)

Par conséquent, pour accéder aux contrôles du formulaire instancié dans le CONTENEUR, il faut d'abord appeler le CONTENEUR puis ensuite cibler les éléments du formulaire en partant toujours du formulaire père.

Il faut bien comprendre que le CONTENEUR est un contrôle du formulaire père.

Imaginons un formulaire qui affichent 2 sous-formulaires

Le formulaire frmMain affiche les formulaires
  1. frmEntreprise (feuille de données)
  2. frmFacture liées à l'entreprise sélectionnée (feuille de données)


Comme indiqué plus haut, les sous-formulaires frmEntreprise & frmFactures sont placés dans des CONTENEURS ayant par défaut le même nom que le formulaire suite au Drag & Drop des sous-formulaires dans le formulaire père ici les CONTENEURS ont respectivement le nom de:
  • frmEntreprise
  • frmFacture


Pour éviter toute confusion entre les formulaires et les CONTENEURS , j'utilise le préfixe ctnrpour les identifier.
Les CONTENEURS via la propriété NOM dans l'onglet AUTRE sont renommés respectivement :
  • ctnrEntreprise
  • ctnrFacture


Pour rappel, quand on clique sur une ligne du formulaire frmEntreprise, le formulaire frmFacture affiche les facture de l'entreprise courante sélectionnée dans frmEntreprise.

N.B.:
La solution proposée n'est donc la création d'un champ dans frmMain faisant référence à un champ du formulaire Entreprise qui est ensuite associé via champ père/fils du CONTENEUR du formulaire frmFactures)

La solution étudiée est de modifier le RECORDSOURCE du formulaire frmFacture .

Comment accéder aux sous-formulaires par l'exemple
Bien se rappeler qu'un CONTENEUR est un CONTRÔLE et non un formulaire.

Donc l'action de cliquer sur le formulaire frmEntreprise dans le CONTENEUR ctrEntreprise doit modifier le RECORDSOURCE du formulaire frmFacture dans le CONTENEUR ctrFacture.

Bien garder en tête qu'il faut le "chemin entier" depuis le formulaire père (frmMain) jusqu'au formulaire cible (frmFacture)

L'appel du père depuis frmEntreprise peut se faire de plusieurs façons

  • forms("frmMain")
  • forms![frmMain]
  • Me.parent


Maintenant il faut modifier le RECORDSOURCE de frmFacture

Pour appeler le CONTENEUR, plusieurs solutions
  • .CONTROLS("ctnrFacture")
  • ![ctnrFacture]

en raison de l'équivalence entre ![ ] Et .CONTROLS("")

Mais le RECORDSOURCE est une propriété du formulaire, il faut donc "pointer" l'instance de frmFacture par .FORM d'ou
FROM.RECORDSOURCE = "LaSource"

On obtient la commande complète suivante:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
forms("frmMain").form.controls("ctnrFacture").form.recordsource = "MaSource"
forms("frmMain").form.controls("ctnrFacture").form.requery 'pour rafraichir les données
Mais en raison de l'équivalence de ![ ] avec .CONTROLS(""), il est possible d'écrire :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
Forms("frmMain").form![ctnrFacture].form.recordsource = "MaSource"
Il est possible de simplifier cette écriture car comme la COLLECTION CONTROLS est la collection par défaut de l'objet formulaire (Form) , .Form n'est pas nécessaire pour appeler .CONTROLS(" ")
Mais attention, cela n'est valable que pour CONTROLS. D'où la commande suivante:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
Forms("frmMain")![ctnrFacture].form.recordsource = "MaSource"

Par extension

Pour modifier une propriété d'un champ (couleur de fond par exemple), la commande serait toujours par principe de l'équivalence entre ![ ] et .CONTROLS(" ") et l'appel à la collection CONTROLS par défaut
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
lngWhite = RGB(255, 255, 255)
Forms("frmMain")![ctnrFacture]![textChamp].BackColor = lngWhite

Envoyer le billet « MS-Access  - VBA : Comprendre l'appel aux sous-formulaires. Concept du CONTENEUR » dans le blog Viadeo Envoyer le billet « MS-Access  - VBA : Comprendre l'appel aux sous-formulaires. Concept du CONTENEUR » dans le blog Twitter Envoyer le billet « MS-Access  - VBA : Comprendre l'appel aux sous-formulaires. Concept du CONTENEUR » dans le blog Google Envoyer le billet « MS-Access  - VBA : Comprendre l'appel aux sous-formulaires. Concept du CONTENEUR » dans le blog Facebook Envoyer le billet « MS-Access  - VBA : Comprendre l'appel aux sous-formulaires. Concept du CONTENEUR » dans le blog Digg Envoyer le billet « MS-Access  - VBA : Comprendre l'appel aux sous-formulaires. Concept du CONTENEUR » dans le blog Delicious Envoyer le billet « MS-Access  - VBA : Comprendre l'appel aux sous-formulaires. Concept du CONTENEUR » dans le blog MySpace Envoyer le billet « MS-Access  - VBA : Comprendre l'appel aux sous-formulaires. Concept du CONTENEUR » dans le blog Yahoo

Mis à jour Aujourd'hui à 08h22 par informer

Catégories
Sans catégorie