Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :
Sujets que vous pourriez aussi aimer :
Envoyer des données sur un autre formulaire
Dans une précédente
astuce VBA Access , nous avons appris Ã
parcourir tous les contrôles d'un formulaire par le
code . Ici, nous allons voir qu'il est aussi possible de
parcourir tous les contrôles d'un autre formulaire . L'objectif est simple. Il consiste à intervenir à distance pour les faire
communiquer , par exemple en transmettant des informations à exploiter à l'ouverture.
Sur l'exemple illustré par la capture, l'utilisateur clique sur un
bouton nommé
Lister à partir d'un
formulaire . Et aussitôt, l'
énumération des contrôles de type Zone de texte débute dans une zone de saisie multiligne sur la gauche du formulaire. Il s'agit bien des
noms des contrôles d'un autre formulaire . A l'issue de l'énumération, cet autre formulaire s'ouvre. Et dans une étiquette (contrôle Label), il restitue l'information transmise par le premier formulaire, par le biais d'une petite zone de texte placée sous les boutons.
Base de données Access à télécharger
Pour la mise en place de cette astuce, nous suggérons d'oeuvrer à partir d'une
base de données existante et hébergeant ces
deux formulaires .
Télécharger le fichier compressé controles-autre-formulaire.rar en cliquant sur ce lien ,
Le décompresser dans le dossier de votre choix,
Double cliquer sur le fichier réceptionné pour l'ouvrir dans Access ,
Puis, cliquer sur le bouton Activer le contenu du bandeau de sécurité,
Dans le volet de navigation sur la gauche, cliquer droit sur le formulaire fInscription ,
Dans le menu contextuel qui apparaît, choisir le mode Création ,
Sur le formulaire en conception, cliquer sur l'étiquette portant l'intitulé test ,
En consultant sa
feuille de propriétés , vous remarquez qu'elle est nommée
reception . C'est elle qui doit récupérer l'information transmise depuis le
formulaire fParcourir . Et c'est lui qui doit être en mesure de parcourir tous les contrôles de ce
formulaire fInscription .
Code VBA associé au bouton
Ces traitements doivent intervenir au clic sur un bouton du premier formulaire.
Fermer le formulaire fInscription en cliquant sur la croix de son onglet,
Dans le volet de navigation, cliquer droit sur le formulaire fParcourir ,
Dans le menu contextuel, choisir de l'ouvrir en mode Création ,
Sur le formulaire en conception, cliquer sur le bouton Lister ,
Activer l'onglet Evénement de sa feuille de propriétés ,
Cliquer sur le petit bouton associé à son événement Au clic ,
Dans la boîte de dialogue qui suit, choisir le générateur de code et valider par Ok,
Nous basculons ainsi dans l'
éditeur VBA Access , entre les bornes de la
procédure événementielle lister_Click . Son code se déclenchera
au clic sur le bouton nommé
lister .
Déclarations et affectations des variables VBA
Nous devons commencer par initialiser le code en déclarant les
variables VBA nécessaires au traitement, dont des
variables objets pour
piloter un autre formulaire et les
contrôles de ce dernier.
Dans les bornes de la procédure, ajouter les déclarations et affectations suivantes :
...
Dim interface As Form: Dim controle As Control
Dim nomForm As String: Dim debut
nomForm = "fInscription"
listeCtrl.Value = ""
...
Nous déclarons l'
objet interface de
type formulaire (As Form) et l'
objet contrôle de
type contrôle de formulaire (As Control). Ensuite, la
variable nomForm doit stocker le
nom du formulaire à atteindre. La
variable debut sera utilisée pour gérer les intervalles de temps et restituer les
noms des contrôles parcourus de façon progressive.
Puis, nous mémorisons le
nom du formulaire (fInscription) Ã piloter dans la
variable nomForm et nous vidons le potentiel contenu de la zone de saisie multiligne nommée
listeCtrl .
Ouvrir un autre formulaire Access
Pour
atteindre les contrôles d'un
autre formulaire par le
code VBA , celui-ci doit d'abord être ouvert en
mode conception . C'est alors que nous pourrons entreprendre la
boucle permettant de
parcourir chacun de ses contrôles .
A la suite du code, ajouter l'instruction VBA suivante :
...
DoCmd.OpenForm nomForm, acDesign, , , , acHidden
...
Nous exploitons la
méthode OpenForm du précieux
objet DoCmd . En premier paramètre, nous lui transmettons le
nom du formulaire à atteindre grâce à la
variable nomForm . En deuxième paramètre, nous lui indiquons d'accéder à ce formulaire en
mode conception (acDesign). Puis, nous ignorons le troisième ainsi que le quatrième et le cinquième paramètres. C'est ainsi que nous atteignons directement le sixième qui concerne le
mode d'affichage . Avec la
valeur acHidden , nous demandons de ne
pas afficher le formulaire à l'écran. C'est ainsi que le traitement sera transparent pour l'utilisateur.
Parcourir un autre formulaire
Désormais, pour
parcourir tous les contrôles de l'
autre formulaire par le
code , nous devons commencer par
initialiser la variable devant représenter ce formulaire. C'est ainsi qu'elle héritera des
propriétés et
méthodes pour le piloter et notamment pour
accéder à ses contrôles , comme les zones de texte qu'il héberge.
Toujours à la suite du code VBA, ajouter les instructions suivantes :
...
Set interface = Forms(nomForm)
For Each controle In interface.Controls
Next controle
...
Grâce à la collection Forms en mentionnant le formulaire à atteindre avec le nom de variable nomForm, nous initialisons (Set) notre objet nommé interface. C'est désormais lui qui désigne et pilote cet autre formulaire.
Puis, nous enclenchons une
boucle For Each pour
parcourir tous les contrôles du formulaire . En effet, grâce à l'initialisation précédente, notre
objet interface propose la
propriété Controls qui renvoie la
collection de tous les contrôles que le formulaire héberge.
Filtrer les contrôles
Nous souhaitons seulement recueillir les noms des zones de texte. Nous devons donc tester une condition sur le type de chaque contrôle parcouru.
...
If controle.ControlType = acTextBox Then
debut = Timer
While Timer < debut + 0.2
DoEvents
Wend
listeCtrl.Value = listeCtrl.Value & "<br />" & controle.Name
End If
...
C'est la
propriété ControlType d'un objet de
type Control qui renseigne sur sa nature. Si le contrôle en cours d'analyse par la boucle est bien une
zone de texte (acTextBox), nous poursuivons le traitement. En d'autres termes, cela signifie que tous les autres, comme les étiquettes et les boutons, sont ignorés. Ensuite, nous prélevons le temps qu'il est à la milliseconde près dans la
variable debut et cela, grâce à la
fonction Timer . Nous engageons une nouvelle
boucle interne de
type While , pour poursuivre son traitement tant qu'un critère est vérifié. Ici, elle temporise (DoEvents) tant que le temps écoulé depuis le prélèvement, n'a pas dépassé les deux dixièmes de secondes. C'est alors que nous restituons le
nom du contrôle en cours (Propriété Name) dans la
zone de texte multiligne sous le nom précédent, grâce à la balise Html dédiée (<br />).
Enregistrer les modifications (CTRL + S) et revenir sur le formulaire en conception (ALT + Tab),
L'enregistrer à son tour et l'exécuter par exemple avec la touche F5 du clavier,
Puis, cliquer sur le bouton Lister ,
Comme vous pouvez l'apprécier, tous les
noms des zones de texte de cet
autre formulaire , sont restitués à intervalles de temps réguliers dans cette zone de saisie multiligne.
Transmettre une donnée entre formulaires
Nous n'en avons pour autant pas terminé. L'un des objectifs de cette petite astuce est de démontrer comment
passer un paramètre à un
autre formulaire . Nous avions d'ailleurs déjà démontré la technique pour l'
application d'évaluation par QCM en VBA . L'objectif était de
transmettre le nom du questionnaire choisi par l'utilisateur pour que l'évaluation démarre automatiquement en fonction de ce choix sur un formulaire dédié.
Cependant, cette
transmission d'informations se réalise exclusivement par le biais des étiquettes (Contrôles Label) dont il est possible de
modifier les propriétés par le
code VBA , comme le contenu. Et nous l'avons découvert en préambule de cette formation, sur le
formulaire à appeler , l'étiquette cible se nomme
reception . Nous devons donc coder après l'
instruction conditionnelle qui rejette les étiquettes.
Après l'instruction conditionnelle (Après le End If), ajouter la ligne VBA suivante :
If controle.Name = "reception" Then controle.Caption = "Information réceptionnée : " & Now & " : " & Me.liaison.Value
Grâce à la
propriété Name , nous évaluons le
nom du contrôle en cours d'analyse par la boucle. S'il est bien nommé
reception , nous agissons sur sa
propriété Caption pour influer sur l'
intitulé de son étiquette . Nous y ajoutons l'information sur l'heure précise de transmission que nous concaténons avec la donnée saisie dans la zone de texte nommée
liaison sur le
formulaire appelant . Elle est située sous les deux boutons sur la droite du formulaire. En
VBA , c'est l'
objet Me qui désigne l'objet actif au moment de l'exécution du
code , le
formulaire fParcourir en l'occurrence ici.
Il est à noter que si nous avions souhaité atteindre l'étiquette reception directement, donc sans passer par une boucle, nous aurions utilisé le code suivant :
Forms("fInscription").reception.Caption = "Le texte à inscrire"
Fermer et rouvrir le formulaire
Quelques réglages restent à faire. Une fois la restitution séquencée des noms terminée sur le
formulaire fParcourir , nous devons commander l'
ouverture du formulaire fInscrption pour que l'utilisateur constate que la donnée a bien été transmise.
Après la boucle (Next contrôle), ajouter les instructions VBA suivantes :
...
DoCmd.Close acForm, nomForm, acSaveYes
Set controle = Nothing
Set interface = Nothing
DoCmd.OpenForm nomForm, acNormal
...
L'
objet DoCmd est de retour. Tout d'abord, grâce à la
méthode Close , nous fermons le formulaire dont nous passons le nom en deuxième paramètre, tout en l'enregistrant grâce à l'
attribut acSaveYes en troisième argument. Bien sûr, nous précisons qu'il s'agit d'un
objet de type formulaire (acForm) en premier paramètre. Ensuite, nous détruisons les
variables objets en les réinitialisant Ã
Nothing . C'est ainsi que nous les purgeons proprement de la mémoire. Puis, nous exploitons la
méthode OpenForm de l'
objet DoCmd pour
ouvrir le formulaire fInscription , cette fois dans une vue normale.
Enregistrer les modifications et basculer sur le formulaire,
Modifier le texte dans la petite zone de saisie en bas à droite,
Puis, cliquer sur le bouton Lister ,
Comme vous pouvez le constater, une fois la restitution des noms de contrôles terminée, le
second formulaire est appelé et affiché. Et il récolte parfaitement l'information transmise dynamiquement par le biais de la petite zone de texte.
Le
code VBA complet que nous avons construit est le suivant :
Private Sub lister_Click()
Dim interface As Form: Dim controle As Control
Dim nomForm As String: Dim debut
nomForm = "fInscription"
listeCtrl.Value = ""
DoCmd.OpenForm nomForm, acDesign, , , , acHidden
Set interface = Forms(nomForm)
For Each controle In interface.Controls
If controle.ControlType = acTextBox Then
debut = Timer
While Timer < debut + 0.2
DoEvents
Wend
listeCtrl.Value = listeCtrl.Value & "<br />" & controle.Name
End If
If controle.Name = "reception" Then controle.Caption = "Information réceptionnée : " & Now & " : " & Me.liaison.Value
Next controle
DoCmd.Close acForm, nomForm, acSaveYes
Set controle = Nothing
Set interface = Nothing
DoCmd.OpenForm nomForm, acNormal
End Sub