Appeler le nom de champ d'un sous-formulaire
Tessel75
-
Tessel75 -
Tessel75 -
Bonjour à tous,
Avec VBA , comment peut-on appeler le nom du champ contenant un sous-formulaire sur lequel on travaille?
Je m'explique: Pour connaitre le nom du formulaire principal, il suffit d'écrire :
==> NomFormulairePrincipal = Screen.ActiveForm.Name
Même chose pour le nom du contrôle sur lequel on est :
==> NomControle = Screen.ActiveControl.Name,
Mais quid du nom du sous-formulaire sur lequel on est?
J'aurais besoin de cette expression pour écrire une procédure valide pour tous les sous-formulaires, sans avoir à la réécrire chaque fois avec les différents noms des différents sous-formulaires.
Merci pour vos suggestions.
Avec VBA , comment peut-on appeler le nom du champ contenant un sous-formulaire sur lequel on travaille?
Je m'explique: Pour connaitre le nom du formulaire principal, il suffit d'écrire :
==> NomFormulairePrincipal = Screen.ActiveForm.Name
Même chose pour le nom du contrôle sur lequel on est :
==> NomControle = Screen.ActiveControl.Name,
Mais quid du nom du sous-formulaire sur lequel on est?
J'aurais besoin de cette expression pour écrire une procédure valide pour tous les sous-formulaires, sans avoir à la réécrire chaque fois avec les différents noms des différents sous-formulaires.
Merci pour vos suggestions.
Configuration: Windows / Firefox 93.0
A voir également:
- Appeler le nom de champ d'un sous-formulaire
- Whatsapp formulaire opposition - Guide
- Formulaire de réclamation facebook - Guide
- Appeler en privé - Guide
- Formulaire de reclamation instagram - Guide
- Dans le document à télécharger, trouvez les lettres situées derrière les rectangles pour reconstituer le nom du chat. comment s'appelle-t-il ? - Forum InDesign
4 réponses
yg_be
Messages postés
23541
Date d'inscription
Statut
Contributeur
Dernière intervention
Ambassadeur
1 584
bonjour,
peux-tu nous monter ton code VBA?
"sur lequel on travaille", "sur lequel on est", ce n'est pas très factuel.
Le plus souvent, j'utilise
Le plus souvent, Me donne le contexte, aucun besoin d'utiliser son nom.
peux-tu nous monter ton code VBA?
"sur lequel on travaille", "sur lequel on est", ce n'est pas très factuel.
Le plus souvent, j'utilise
Me, pas
Screen.
Le plus souvent, Me donne le contexte, aucun besoin d'utiliser son nom.
Bonjour,
Désolé mais je ne peux pas partager le fichier parce qu'il contient des infos très personnelles, en l'occurrence un carnet d'adresses et d'autres infos personnelles.
Pour ce qu'il en est de l'enchainement des sous-formulaires =>
La base est très petite; elle ne comporte que 3 tables et 1 seul formulaire. Le formulaire contient 2 onglets, chacun occupé de fait par un sous-formulaire. L'un d'eux ne présente pas de difficulté. L'autre, le carnet d'adresses nécessite que je puisse passer facilement de la présentation en mode formulaire à la présentation en mode Feuille de données, et inversement, et c'est là que j'ai besoin que la procédure sache reconnaitre quelle est la présentation active pour passer à l'autre mais sans le faire n'importe comment.
Pour ce qui est du bouton, il se trouve sur le sous-formulaire, mais ne se voit qu'en affichage en mode formulaire, il n'est pas apparent en mode Feuille de données; et c'est pour cela que je dois changer la façon de repasser en mode formulaire quand je suis en mode feuille de données. C'est là que j'ai choisis le click sur un des contrôles visibles dans ce mode, mais il ne faut pas que la procédure s’emmêle.
Désolé mais je ne peux pas partager le fichier parce qu'il contient des infos très personnelles, en l'occurrence un carnet d'adresses et d'autres infos personnelles.
Pour ce qu'il en est de l'enchainement des sous-formulaires =>
La base est très petite; elle ne comporte que 3 tables et 1 seul formulaire. Le formulaire contient 2 onglets, chacun occupé de fait par un sous-formulaire. L'un d'eux ne présente pas de difficulté. L'autre, le carnet d'adresses nécessite que je puisse passer facilement de la présentation en mode formulaire à la présentation en mode Feuille de données, et inversement, et c'est là que j'ai besoin que la procédure sache reconnaitre quelle est la présentation active pour passer à l'autre mais sans le faire n'importe comment.
Pour ce qui est du bouton, il se trouve sur le sous-formulaire, mais ne se voit qu'en affichage en mode formulaire, il n'est pas apparent en mode Feuille de données; et c'est pour cela que je dois changer la façon de repasser en mode formulaire quand je suis en mode feuille de données. C'est là que j'ai choisis le click sur un des contrôles visibles dans ce mode, mais il ne faut pas que la procédure s’emmêle.
Tu ne comprends pas.
Le formulaire principal est lui-même à onglets, et il est le seul qui apparait en tant que formulaire de plein titre. Il n'apparait qu'en mode Formulaire. De toutes façons, il ne peut apparaitre autrement parce qu'il ne contient aucune donnée, ni aucun champ autre que les onglets.
Après, seuls les onglets contiennent des formulaires, qui sont par la force des choses des sous-formulaires. Comme il y a plusieurs onglets, il y a plusieurs "Sous-Formulaires". Mais ils ne peuvent être vus en même temps, puisqu'ils dépendent des onglets.
Donc quand je parle du "Sous-formulaire sur lequel on est", je parle en fait, de l'onglet ouvert et du sous-formulaire qu'il contient.
Dans ces conditions, on ne peut pas parler de "tous les sous-formulaires", parce qu'il ne s'agit que d'un seul à la fois, correspondant à un onglet.
Quant au contrôle sur lequel on clique, il est forcément sur le sous-formulaire qui est apparent, et par définition ce contrôle est visible puisqu'on clique dessus, et qu'alors il se remet en mode "formulaire".
Le formulaire principal est lui-même à onglets, et il est le seul qui apparait en tant que formulaire de plein titre. Il n'apparait qu'en mode Formulaire. De toutes façons, il ne peut apparaitre autrement parce qu'il ne contient aucune donnée, ni aucun champ autre que les onglets.
Après, seuls les onglets contiennent des formulaires, qui sont par la force des choses des sous-formulaires. Comme il y a plusieurs onglets, il y a plusieurs "Sous-Formulaires". Mais ils ne peuvent être vus en même temps, puisqu'ils dépendent des onglets.
Donc quand je parle du "Sous-formulaire sur lequel on est", je parle en fait, de l'onglet ouvert et du sous-formulaire qu'il contient.
Dans ces conditions, on ne peut pas parler de "tous les sous-formulaires", parce qu'il ne s'agit que d'un seul à la fois, correspondant à un onglet.
Quant au contrôle sur lequel on clique, il est forcément sur le sous-formulaire qui est apparent, et par définition ce contrôle est visible puisqu'on clique dessus, et qu'alors il se remet en mode "formulaire".
Je me demandais s'il n'était pas plus simple d'agir sur tous les sous-formulaires, qu'ils soient visibles, ou pas.
Comment le contrôle fait-il appel au code? N'est-il pas possible de passer en paramètre l'identité du contrôle, qui permettrait de retrouver le sous-formulaire dont il fait partie?
Je testerai quand tu partageras un fichier représentatif.
Comment le contrôle fait-il appel au code? N'est-il pas possible de passer en paramètre l'identité du contrôle, qui permettrait de retrouver le sous-formulaire dont il fait partie?
Je testerai quand tu partageras un fichier représentatif.
ça y'est ! J'ai trouvé. Je donne la formule pour ceux qui aurait la même question. Il suffit d'appeler "Parent"
Ainsi pour connaitre le nom du formulaire ou sous-formulaire contenant le contrôle sur lequel est le pointeur, il d'écrire :
Screen.activeControl.Parent.name,
et on peut enchainer les "Parent". Ainsi, si on est avec un formulaire avec un sous-formulaire, l'expression :
Screen.activeControl.Parent.name . . . . ramènera le nom du sous-formulaire,
et l'expression:
Screen.activeControl.Parent.Parent.name . . . . ramènera le nom du formulaire principal.
Attention : Pour être plus exact, le nom ramener par Parent comme je l'indique ici, est nom du formulaire ou sous-formulaire qui contient le contrôle, mais il n'indique pas le nom du champ contenant le sous-formulaire. Donc pour appeler un tel contrôle il faut que le nom du contrôle soit le même que le nom du sous-formulaire.
Je n'ai pas testé, ce qui serait à faire, mais je suppose qu'on peut enchainer autant de "parent" qu'il y a de sous-formulaires imbriqués, jusqu'à atteindre celui dont on cherche le nom.
Je marque la question en résolue
Ainsi pour connaitre le nom du formulaire ou sous-formulaire contenant le contrôle sur lequel est le pointeur, il d'écrire :
Screen.activeControl.Parent.name,
et on peut enchainer les "Parent". Ainsi, si on est avec un formulaire avec un sous-formulaire, l'expression :
Screen.activeControl.Parent.name . . . . ramènera le nom du sous-formulaire,
et l'expression:
Screen.activeControl.Parent.Parent.name . . . . ramènera le nom du formulaire principal.
Attention : Pour être plus exact, le nom ramener par Parent comme je l'indique ici, est nom du formulaire ou sous-formulaire qui contient le contrôle, mais il n'indique pas le nom du champ contenant le sous-formulaire. Donc pour appeler un tel contrôle il faut que le nom du contrôle soit le même que le nom du sous-formulaire.
Je n'ai pas testé, ce qui serait à faire, mais je suppose qu'on peut enchainer autant de "parent" qu'il y a de sous-formulaires imbriqués, jusqu'à atteindre celui dont on cherche le nom.
Je marque la question en résolue
D'abord, si j'utilisais "Me! XXX", c'est que je serais sur une procédure Private Sub, mais justement je voudrais ne procédure "universelle", qui s'applique pour tous les formulaires sur lesquels je travaille, càd non pas une procédure Private Sub dans un module de classe, mais une procédure "Function" dans un module ordinaire qui demande de nommer les objets sur lesquels la procédure s'appliquera. Et c'est là que j'ai besoin d'appeler le nom du sous-formulaire.
Après je peux te donner le code, mais tu ne sera pas plus avancé. En l'occurrence, il s'agit d'un formulaire à onglets, dont chaque onglet contient un sous-formulaire que je veux afficher selon mon souhait en mode Formulaire ou en mode Feuille de données
Donc le code en question est très court :
Function Services_FeuilleDonneesVersSsFormulaire()
If Screen.ActiveForm!Services.Form.CurrentView = 2 Then DoCmd.RunCommand acCmdSubformFormView
End Function
Qui affiche le sous-formulaire "Services" en mode Formulaire depuis le mode Feuile de données
Et puis, il y a la procédure qui l'opération inverse:
Function Services_FeuilleDonneesVersSsFormulaire()
If Screen.ActiveForm!Services.Form.CurrentView = 1 Then DoCmd.RunCommand acCmdSubformDatasheet
End Function
Qui affiche le sous-formulaire "Services" en mode Formulaire depuis le mode Feuile de données
Je voudrais me passer d'appeler le sous-formulaire "Services" pour le remplacer par un nom générique.
Pour la 1ère procédure, j'y arrive parce qu'il faut cliquer sur un bouton qui ne sert qu'à cela, donc il n'y a pas trop de problème. Par contre pour le passage de la feuille de données au mode Formulaire, il faut cliquer sur un contrôle, donc je suis obligé de spécifier la condition "If xxxxx. CurrentView =2 "
Quand tu écris "sous-formulaire sur lequel on est", veux-tu dire "sous-formulaire visible dans le formulaire sur lequel on est, bien qu'on ne soit pas dans le sous-formulaire"?