Forum des développeurs  

Le forum de référence en programmation et développement. Articles, cours et tutoriels du débutant au chef de projet et DBA confirmé.
Précédent   Forum des développeurs > Hardware, Systèmes et Logiciels > Microsoft Office > Access > Contribuez

Contribuez Access : Vos contributions. Postez ici vos codes sources, conseils, astuces et autres propositions. Ce forum n'est pas un forum technique mais destiné aux contributions pour www.developpez.com

Réponse
 
Outils de la discussion
Vieux 17/05/2008, 19h25   #1 (permalink)
Membre Expert
 
Date d'inscription: avril 2006
Messages: 1 015
Par défaut [Source] Recherche d'un formulaire/sous-formulaire ouvert

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 :
 
'---------------------------------------------------------------------------------------
' 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 :
 
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

Dernière modification par philben ; 04/06/2008 à 06h51 Motif: léger lifting
philben est déconnecté   Envoyer un message privé Réponse avec citation
NEWS ACCESSF.A.Q AccessF.A.Q VBATutorielsSourcesOutilsLivresAccess TVAccess 2007

Réponse

Précédent   Forum des développeurs > Hardware, Systèmes et Logiciels > Microsoft Office > Access > Contribuez



Outils de la discussion

Règles de messages
Vous ne pouvez pas créer de nouvelles discussions
Vous ne pouvez pas envoyer des réponses
Vous ne pouvez pas envoyer des pièces jointes
Vous ne pouvez pas modifier vos messages

Les balises BB sont activées : oui
Les smileys sont activés : oui
La balise [IMG] est activée : oui
Le code HTML peut être employé : non
Trackbacks are non
Pingbacks are non
Refbacks are non
Navigation rapide


Fuseau horaire GMT +1. Il est actuellement 23h50.


Publiez vos articles, tutoriels et cours et rejoignez-nous dans l'équipe de rédaction du club d'entraide des développeurs francophones. Nous contacter
Copyright 2000-2008 www.developpez.com - Legal informations