bonjour,

A la recherche d'un sous-formulaire précis et pour éviter de me perdre dans le méandre des onglets, des pages et des sous-formulaires, voici une fonction VBA qui retourne une instance du formulaire recherché.

Elle retourne aussi l'éventuel page de l'onglet du sous-formulaire (pour simplifier aussi les écritures) si on veut activer la page en question (Niveau N-2 par rapport au form retourné).

Code
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
 
'---------------------------------------------------------------------------------------
' Procédure    : GetFormByName  [Function]
' Retour       : Form
' Version      : 1.01
' Auteur       : PhilBen
' Création/Maj : Le samedi 17 mai 2008 à 18:48
' Objet        : Recherche par son nom, un formulaire ouvert :
'              :  - soit comme formulaire principale
'              :  - soit comme sous-formulaire quelque soit le niveau de profondeur
'              :    des controles onglets et sous-formulaire
'              : Retourne une instance sur le premier formulaire trouvé
'              : Retourne aussi l'éventuelle instance du controle page de l'onglet
' Usage        : Simplification des écritures de code VBA pour toutes les actions
'              : liées aux sous-formulaires
' Historique   : v1.01 : correction bug si formulaire principal
'---------------------------------------------------------------------------------------
Public Function GetFormByName(ByVal sNom As String, _
                              Optional ByRef oPage As Control = Nothing) As Form
   Dim oAO As AccessObject
   With CurrentProject
      If .AllForms(sNom).IsLoaded Then
         Set GetFormByName = Forms(sNom) 'v1.01
      Else
         For Each oAO In .AllForms
            If oAO.IsLoaded Then
               Set GetFormByName = GetFormByNameSub(Forms(oAO.Name).Controls, _
                                   sNom, oPage)
               If Not GetFormByName Is Nothing Then Exit For
            End If
         Next oAO
      End If
   End With
End Function
'---------------------------------------------------------------------------------------
' Procédure    : GetFormByNameSub  [Function]
' Retour       : Form
' Version      : 1.01
' Auteur       : PhilBen
' Création/Maj : Le samedi 17 mai 2008 à 18:59
' Objet        : Fonction récursive de recherche du formulaire
' Historique   :
'---------------------------------------------------------------------------------------
Private Function GetFormByNameSub(ByRef oCtrls As Object, ByVal sFormNom As String, _
                                  ByRef oPg As Control) As Form
   Dim oC As Control
   Dim oP As Page
   For Each oC In oCtrls
      If oC.ControlType = acSubform Then
         If oC.SourceObject = sFormNom Then
            Set GetFormByNameSub = oC.Form
         Else
            Set GetFormByNameSub = GetFormByNameSub(oC.Form.Controls, sFormNom, oPg)
         End If
      ElseIf oC.ControlType = acTabCtl Then
         For Each oP In oC.Pages
            Set oPg = oP
            Set GetFormByNameSub = GetFormByNameSub(oP.Controls, sFormNom, oPg)
            If Not GetFormByNameSub Is Nothing Then Exit For
         Next oP
      End If
      If Not GetFormByNameSub Is Nothing Then Exit For
   Next oC
End Function
Exemple d'utilisation
Sur mes pages d'onglet, j'ai une page de recherche avec affichage des données récoltés dans un listbox.
Si l'utilisateur souhaite voir une fiche complète pour édition ou autre qui se trouve sur une autre page de l'onglet , il double-clique sur la ligne souhaitée du listbox.
Par VBA, je recherche le sous-formulaire correspondant, j'active la page de l'onglet pour donner le focus et j'appelle une fonction public du formulaire unique pour afficher la fiche correspondante.
Code de la fonction sur double_clique du ListBox
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
 
Private Sub LbPrest_DblClick(Cancel As Integer)
   Dim oFo As Form
   Dim oPg As Control
   If Not IsNull(Me.LbPrest) Then
      Set oFo = GetFormByName  ("SF_GestionPrests_TPrests", oPg)
      oPg.Parent = oPg.PageIndex 'Active la page du formulaire
      oFo.UpdatePosition Me.LbPrest 'Appel la fonction public pour filtrer
   End If
   Set oFo = Nothing
   Set oPg = Nothing
End Sub
Si vous avez plus simple, ça m'intéresse !

Philippe