Appeler le nom de champ d'un sous-formulaire

Fermé
Tessel75 - 24 oct. 2021 à 00:33
 Tessel75 - 27 oct. 2021 à 15:20
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.

Configuration: Windows / Firefox 93.0

4 réponses

yg_be Messages postés 22730 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 26 avril 2024 1 477
24 oct. 2021 à 21:24
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
Me
, pas
Screen
.
Le plus souvent, Me donne le contexte, aucun besoin d'utiliser son nom.
0
Merci de ta réponse, tu mets justement le doigt sur le point qui pose question.
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 "
0
yg_be Messages postés 22730 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 26 avril 2024 1 477 > Tessel75
26 oct. 2021 à 07:59
Où se trouve le bouton qui ne sert qu'à cela, et où se trouve le contrôle sur lequel tu cliques?
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"?
0
yg_be Messages postés 22730 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 26 avril 2024 1 477 > Tessel75
26 oct. 2021 à 08:09
Pourrait-on imaginer que le passage de la feuille de données au mode Formulaire se fasse, simplement sur le dernier sous-formulaire pour lequel on est passé en mode Feuile de données?
0
yg_be Messages postés 22730 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 26 avril 2024 1 477 > Tessel75
26 oct. 2021 à 08:22
Pourrais-tu partager ton fichier, que je teste sur quelque-chose de représentatif?
0
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.
0
yg_be Messages postés 22730 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 26 avril 2024 1 477
26 oct. 2021 à 14:57
je n'ai évidement pas besoin de tes données, du moment que je peux tester.
0
yg_be Messages postés 22730 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 26 avril 2024 1 477
26 oct. 2021 à 15:00
Pourrait-on imaginer que le passage de la feuille de données au mode Formulaire se fasse, simplement sur le dernier sous-formulaire pour lequel on est passé en mode Feuile de données?

où se trouve le contrôle sur lequel tu cliques? "un des contrôles visibles", mais où?
0
yg_be Messages postés 22730 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 26 avril 2024 1 477 > yg_be Messages postés 22730 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 26 avril 2024
26 oct. 2021 à 15:41
Pourrait-on faire ce travail pour tous les sous-formulaires, plutôt que celui "sur lequel on est"?
0
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".
0
yg_be Messages postés 22730 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 26 avril 2024 1 477
26 oct. 2021 à 23:00
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.
0
ç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
0