Bonjour à toutes et tous.

J'ai un souci bizarre avec l'utilisation de Screen

Contexte :
Sous Access 2010 (mais je suppose que c'est pareil pour les autres versions)
Dans la hiérarchie suivante :
F_MENU_GENERAL
Tabs_MENU_GENERAL
Tab_CONCEPTION
SF_MENU_GENERAL_CONCEPTION
Tabs_MENU_GENERAL_CONCEPTION
Tab_LISTE_DOCUMENTS
SSF_MENU_GENERAL_CONCEPTION_LISTE_DOCUMENTS
txtProcessName
Parenthèse pour ceux qui se prendraient encore la tête avec ça, et pour bien préciser que mon problème n'est pas là, les onglets sont "Transparents" lorsqu'il s'agit d'atteindre un contrôle, le chemin de mon contrôle est donc
  • "En dur" :
  • [F_MENU_GENERAL]![SF_MENU_GENERAL_CONCEPTION]![SSF_MENU_GENERAL_CONCEPTION_LISTE_DOCUMENTS]!txtProcessName

    Ou, bien que plus longue, ma syntaxe favorite (parce qu'elle permet d'utiliser des variables partout) :
  • Forms("F_MENU_GENERAL").Form("SF_MENU_GENERAL_CONCEPTION").Form("SSF_MENU_GENERAL_CONCEPTION_LISTE_DOCUMENTS").Controls("txtProcessName")


Donc, dans le contexte cité plus haut, j'ai donc un système de navigation avec un formulaire principal qui contient des sous formulaires dans un premier jeu d'onglets, chaque onglet contenant son propre jeu d'onglets avec dans chacun de ces dernier un sous-sous formulaire du formulaire principal...
Ça va ? j'ai perdu personne ? donc on continue !

L'un de ces sous-sous formulaire (SSF_MENU_GENERAL_CONCEPTION_LISTE_DOCUMENTS) est de type "Formulaires continus" et contient de nombreux champs.

Faisons hyper simple pour l'exemple : je souhaite qu'en sélectionnant n'importe quel contrôle d'un enregistrement apparaisse un message me donnant le nom du process contenu dans txtProcessName de l'enregistrement en cours.

Afin d'éviter de lever l'événement On_Clic de chaque contrôle, j'opte pour Current du formulaire.
Le problème avec Current, c'est qu'il se déclenche au chargement du formulaire, au déchargement et Dieu sait quand encore.
Il me faut donc situer à quel moment je le traite.

Ca donne :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
Private Sub Form_Current()
 
    If Screen.ActiveControl.Parent.Name = "SSF_MENU_GENERAL_CONCEPTION_LISTE_RECETTE" Then
        MsgBox Me.txtProcessId.Value
    End If
 
Sortie:
End Sub
Ce qui me donne :
Citation Envoyé par Cet abruti d'Access
Erreur d'exécution '2474'

L'expression entrée requiert que le contrôle se trouve dans la fenêtre active.
Alors moi, bon élève, dans ma fenêtre exécution juste après l'erreur :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
 
? Screen.ActiveControl.Parent.name
SSF_MENU_GENERAL_CONCEPTION_LISTE_RECETTES
 
? screen.ActiveControl.name
txtProcessName
 
? Screen.ActiveForm.Name
F_MENU_GENERAL
Et là, moi je bugue...
Le premier test renvoie le bon formulaire
Le second test renvoie le bon contrôle
Le troisième test renvoie... Le premier formulaire de la hiérarchie

En tout cas, je ne comprends pas pour quoi les 2 premiers fonctionnent et que dans le contexte ça ne va plus...

Je cherche donc :
  • Soit la solution et l'explication pour fonctionner avec Screen
  • Soit une solution sans Screen et sans lever On_Clic sur tous les contrôles


Merci d'avance à qui saura me donner une piste valable !