formateur informatique

Contrôler un autre formulaire et envoyer des données

Accueil  >  Bureautique  >  Access  >  Access VBA  >  Contrôler un autre formulaire et envoyer des données
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    Vidéos astuces Instagram
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.

Lister tous les noms de contrôle d-un autre formulaire Access

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,
Trouver les noms des contrôles d-un autre formulaire en VBA Access

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,
Transmettre des données entre formulaires Access

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


 
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