IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBA Access Discussion :

Comment accéder à un variable d'une autre application Access


Sujet :

VBA Access

  1. #1
    Membre à l'essai Avatar de shishi666
    Inscrit en
    Avril 2013
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Avril 2013
    Messages : 19
    Points : 10
    Points
    10
    Par défaut Comment accéder à un variable d'une autre application Access
    Bonjour a toutes et tous,

    j'essaye de créer une boite à outils Access permettant d'automatiser des modification dans une autre application Access.

    Je vais essayer de résumer le contexte :

    Ma boite à outils comporte :
    • 1 formulaire Boite à outils
    • 1 second formulaire Controles sources
    • 1 module Erreurs (permettant la gestion des erreurs)
    • 1 module GestionFichier (permettant à l'utilisateur de sélectionner l'application Access a modifier)
    • 1 module BoiteAOutils (comportant les fonctions modifiant l'autre application Access)
    • Il n'y a aucune table.


    L'application à modifier comporte :
    • Des tables liées en odbc à une base de données Postgres.
    • Des formulaires
    • Des modules



    Et voici ce que je cherche à faire : l'utilisateur ouvre la boite à outils, sélectionne l'application Access à modifier (l'application s'ouvre bien et ma boite à outil affiche tous les formulaire de l'application à modifier), ensuite l'utilisateur sélectionne les formulaire qu'ils souhaitent modifier et la modification à effectuer (dans mon cas il s'agit de faire un copier/coller d'un contrôle présent dans le formulaire "Controles sources" de ma boite à outils dans les formulaires (sélectionnés par l'utilisateur) de l'application à modifier.

    Mon problème c'est que je souhaiterais depuis le module "BoiteAOutils" (de ma boite à outils) récupérer ou accéder à une variable présente dans un module de l'application à modifier.

    Auriez vous la solution pour que ma boite à outils accéder ou récupère une variable d'une autre application?

    J'espère avoir était suffisamment précis dans mes explications, n'hésitez pas si vous avez besoin d'informations complémentaires ou de code.

    Merci par avance

    Cordialement

    Shishi

  2. #2
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Développeur VBA/C#/VB.Net/Power Platform
    Inscrit en
    Juillet 2007
    Messages
    14 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur VBA/C#/VB.Net/Power Platform
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 593
    Points : 34 250
    Points
    34 250
    Par défaut
    Salut,

    je peux te proposer de passer par une table de paramètres :
    https://jpcheck.developpez.com/tutor...es-initiation/

    Tu auras besoin d'une table liée pour lire les informations
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  3. #3
    Membre éclairé
    Homme Profil pro
    Regisseur
    Inscrit en
    Octobre 2006
    Messages
    475
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Regisseur
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Octobre 2006
    Messages : 475
    Points : 850
    Points
    850
    Par défaut
    Bonjour
    il y a ça dans ma contribution :
    https://www.developpez.net/forums/d1...ndancesplusv2/

    sinon, dans ton appli "boite à outils", dans un module standard:

    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
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    Option Compare Database
    Option Explicit
    '### Variables ###
     
    Public DetVar
     
    Public As VariantPublic Sub SearchCodeModule3(ByVal Quoi As String, tout As Boolean, DeuxFois As Boolean)
    'Tout=True recherche dans tout le module, sinon seulement dans la partie Déclaration (pour le variables)
    'le 3° argument sert pour enchainer une fois la sub avec "Public" puis avec "Dim" ,tout en conservant les données lors du 2° passage
        Dim VBProj As VBIDE.VBProject
        Dim VBComp As VBIDE.VBComponent
        Dim CodeMod As VBIDE.CodeModule
        Dim FindWhat As String
        Dim SL As Long    ' start line
        Dim EL As Long    ' end line
        Dim SC As Long    ' start column
        Dim EC As Long    ' end column
        Dim Found As Boolean
        Dim i As Integer, h As Long
     
        i = 1
     
    '    NomProjet = VBE.VBProjects.Item(i).Name
     
        If DeuxFois Then
            '    ReDim Preserve DetVarPublic(1 To 4, 1 To 1) As String
        Else
            ReDim DetVarPublic(1 To 4, 1 To 1) As String
     
     
            DetVarPublic(1, 1) = "Module"
            DetVarPublic(2, 1) = "type de variable"
     
            DetVarPublic(3, 1) = "déclaration"
            DetVarPublic(4, 1) = "ligne"
        End If
     
     
        Set VBProj = VBE.VBProjects.Item(NomProjet)
     
        For Each VBComp In VBProj.VBComponents
     
            If VBComp.Type <> 2 _
               And VBComp.Name <> "modLibTgl" And VBComp.Name <> IIf(ExistForm("DépendancesPlus2"), "DépendancesPlus2", "a") Then
     
                Set CodeMod = VBComp.CodeModule
     
                FindWhat = Quoi
     
                With CodeMod
                    SL = 1
                    If tout Then
                        EL = .CountOfLines
                    Else
                        EL = .CountOfDeclarationLines    'cherche seulement dans la partie Déclaration du module
                    End If
                    SC = 1
                    EC = 255
                    Found = .Find(target:=FindWhat, StartLine:=SL, StartColumn:=SC, _
                                  EndLine:=EL, EndColumn:=EC, _
                                  wholeword:=True, MatchCase:=False, patternsearch:=False)
     
                    Do Until Found = False
                        If Left(LTrim(VBComp.CodeModule.Lines(SL, 1)), 1) <> "'" Then      'pour eviter les lignes commentées
                            '                        Debug.Print "Found at: Line: " & CStr(SL) & " Column: " & CStr(SC) & " dans le module " & VBComp.Name & " ligne " & VBComp.CodeModule.Lines(SL, 1)
     
                            ReDim Preserve DetVarPublic(1 To 4, 1 To UBound(DetVarPublic, 2) + 1)
     
                            DetVarPublic(1, UBound(DetVarPublic, 2)) = VBComp.Name
     
                            Select Case Left(LTrim(VBComp.CodeModule.Lines(SL, 1)), 3)
                            Case "Dim"
                                DetVarPublic(2, UBound(DetVarPublic, 2)) = "Variables niveau module"
                            Case "Global"
                                DetVarPublic(2, UBound(DetVarPublic, 2)) = "Public (pour toute l'application)"
                            Case Else
     
     
                                '                        If Left(LTrim(VBComp.CodeModule.Lines(SL, 1)), 3) = "Dim" Then
                                '                            DetVarPublic(2, UBound(DetVarPublic, 2)) = "Variables niveau module"
                                '                        Else
     
                                If Mid(LTrim(VBComp.CodeModule.Lines(SL, 1)), 8, 5) = "Const" Then DetVarPublic(2, UBound(DetVarPublic, 2)) = "Constantes"
                                If InStr(1, LTrim(VBComp.CodeModule.Lines(SL, 1)), "Declare Function") > 0 Then DetVarPublic(2, UBound(DetVarPublic, 2)) = "API"
                                If InStr(1, LTrim(VBComp.CodeModule.Lines(SL, 1)), "Declare Sub") > 0 Then DetVarPublic(2, UBound(DetVarPublic, 2)) = "API"
     
                                If Mid(LTrim(VBComp.CodeModule.Lines(SL, 1)), 8, 4) = "Enum" Then DetVarPublic(2, UBound(DetVarPublic, 2)) = "Enumération"
     
                                Select Case Quoi
     
                                Case "Public"
                                    'commence à 8 pour Public
                                    If Mid(LTrim(VBComp.CodeModule.Lines(SL, 1)), 8, 8) <> "Function" And Mid(LTrim(VBComp.CodeModule.Lines(SL, 1)), 8, 5) <> "Const" _
                                       And Mid(LTrim(VBComp.CodeModule.Lines(SL, 1)), 8, 7) <> "Declare" And Mid(LTrim(VBComp.CodeModule.Lines(SL, 1)), 8, 4) <> "Enum" Then
                                        DetVarPublic(2, UBound(DetVarPublic, 2)) = "Public (pour toute l'application)"
                                    End If
     
                                Case "Private"
                                    'commence à 9 pour Public
                                    If Mid(LTrim(VBComp.CodeModule.Lines(SL, 1)), 9, 8) <> "Function" And Mid(LTrim(VBComp.CodeModule.Lines(SL, 1)), 9, 5) <> "Const" _
                                       And Mid(LTrim(VBComp.CodeModule.Lines(SL, 1)), 9, 7) <> "Declare" And Mid(LTrim(VBComp.CodeModule.Lines(SL, 1)), 9, 4) <> "Enum" Then
                                        DetVarPublic(2, UBound(DetVarPublic, 2)) = "Variables niveau module"
                                    End If
     
                                Case "Global"
                                    DetVarPublic(2, UBound(DetVarPublic, 2)) = "Public (pour toute l'application)"
     
                                End Select
     
                            End Select
     
     
                            If Mid(LTrim(VBComp.CodeModule.Lines(SL, 1)), 1, 20) = "Application.TempVars" Then DetVarPublic(2, UBound(DetVarPublic, 2)) = "TempVars"
                            h = IIf(InStr(1, LTrim(VBComp.CodeModule.Lines(SL, 1)), Chr(39), 1) > 0, InStr(1, LTrim(VBComp.CodeModule.Lines(SL, 1)), Chr(39), 1), Len(LTrim(VBComp.CodeModule.Lines(SL, 1))))    '29/08/17
     
                            DetVarPublic(3, UBound(DetVarPublic, 2)) = Left(LTrim(VBComp.CodeModule.Lines(SL, 1)), h)
     
                            DetVarPublic(4, UBound(DetVarPublic, 2)) = SL
                        End If
     
                        If tout Then
                            EL = .CountOfLines
                        Else
                            EL = .CountOfDeclarationLines
                        End If
                        SC = EC + 1
                        EC = 255
     
                        Found = .Find(target:=FindWhat, StartLine:=SL, StartColumn:=SC, _
                                      EndLine:=EL, EndColumn:=EC, _
                                      wholeword:=True, MatchCase:=False, patternsearch:=False)
     
                    Loop
     
                End With
            End If
            i = i + 1
        Next VBComp
     
    End Sub
    et tu appelles la sub ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
           SearchCodeModule3 "Public", False, False
            SearchCodeModule3 "Global", False, True
            SearchCodeModule3 "Dim", False, True
            SearchCodeModule3 "Private", False, True
            SearchCodeModule3 "Application.TempVars.Add", True, True
    Les résultats seront dans le tableau "DetVarPublic"
    y'a plus qu'a ….

    cdlt

  4. #4
    Membre à l'essai Avatar de shishi666
    Inscrit en
    Avril 2013
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Avril 2013
    Messages : 19
    Points : 10
    Points
    10
    Par défaut
    Bonjour,

    merci beaucoup pour vos réponses Jean Philippe André et Thierry Pallier,

    n'ayant actuellement pas la disponibilité de tester vos solutions, je reviens vers vous dès que ce sera fait.

    Bonne journée

    Shishi

  5. #5
    Membre à l'essai Avatar de shishi666
    Inscrit en
    Avril 2013
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Avril 2013
    Messages : 19
    Points : 10
    Points
    10
    Par défaut
    Bonjour,

    Tout d'abord Thierry j'ai copié/collé ta procédure dans un module de ma boite à outils, puis j'ai essayé de l'appeler mais j'ai obtenu une erreur sur la ligne de déclaration de la procédure.

    Ensuite Jean-Philippe André je ne suis pas certain que ta solution corresponde à mes besoins (je me suis surement mal exprimé). En faite Dans l'application Access choisit par l'utilisateur (celle qu'il souhaite modifier), a l'ouverture d'un formulaire de cette application une variable de type "Control_lié" (un type que j'ai créé) se charge. Et j'aimerais accéder à cette variable depuis ma boite à outils. Et si j'ai mal compris ta solution Jean-Philippe et qu'elle correspond ça m'ennui un peu de devoir modifier toutes les applications avant d'utiliser ma boite à outils dessus.

    J'espère avoir été plus clair si ce n'était pas le cas précédemment, auriez vous une piste si possible sans modification des application sur lesquelles je souhaite utiliser la "boite à outils"

    Merci par avance

    Shishi

  6. #6
    Membre éclairé
    Homme Profil pro
    Regisseur
    Inscrit en
    Octobre 2006
    Messages
    475
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Regisseur
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Octobre 2006
    Messages : 475
    Points : 850
    Points
    850
    Par défaut
    Bonjour shishi666.

    Ce n'est pas toujours simple d'extraire une partie du code d'une application un peu complexe.

    Le code qui suit fonctionne bien ,si ton outil est référencé dans l'appli à verifier.
    Apparement ce n'est peut etre pas ce que tu désires. Dans ce cas, place un point d'arret (ligne 24)et regarde ce qu'il y a dans VBE.VBProjects.Item


    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
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    Option Compare Database
    Option Explicit
    '### Variables ###
     
    Public DetVar 'ne sert pas
    Public DetVarPublic As Variant
    Public NomProjet As Variant
     
    Public Sub SearchCodeModule3(ByVal Quoi As String, tout As Boolean, DeuxFois As Boolean)
    'Tout=True recherche dans tout le module, sinon seulement dans la partie Déclaration (pour les variables)
    'le 3° argument sert pour enchainer une fois la sub avec "Public" puis avec "Dim" ,tout en conservant les données lors du 2° passage
        Dim VBProj As VBIDE.VBProject
        Dim VBComp As VBIDE.VBComponent
        Dim CodeMod As VBIDE.CodeModule
        Dim FindWhat As String
        Dim SL As Long    ' start line
        Dim EL As Long    ' end line
        Dim SC As Long    ' start column
        Dim EC As Long    ' end column
        Dim Found As Boolean
        Dim i As Integer, h As Long
     
        i = 1
     
        NomProjet = VBE.VBProjects.Item(i).Name
     
        If DeuxFois Then
     
        Else
            ReDim DetVarPublic(1 To 4, 1 To 1) As String
     
     
            DetVarPublic(1, 1) = "Module"
            DetVarPublic(2, 1) = "type de variable"
     
            DetVarPublic(3, 1) = "déclaration"
            DetVarPublic(4, 1) = "ligne"
        End If
     
     
        Set VBProj = VBE.VBProjects.Item(NomProjet)
     
        For Each VBComp In VBProj.VBComponents
     
            If VBComp.Type <> 2 Then
     
                Set CodeMod = VBComp.CodeModule
     
                FindWhat = Quoi
     
                With CodeMod
                    SL = 1
                    If tout Then
                        EL = .CountOfLines
                    Else
                        EL = .CountOfDeclarationLines    'cherche seulement dans la partie Déclaration du module
                    End If
                    SC = 1
                    EC = 255
                    Found = .Find(Target:=FindWhat, StartLine:=SL, StartColumn:=SC, _
                                  EndLine:=EL, EndColumn:=EC, _
                                  wholeword:=True, MatchCase:=False, patternsearch:=False)
     
                    Do Until Found = False
                        If Left(LTrim(VBComp.CodeModule.Lines(SL, 1)), 1) <> "'" Then      'pour eviter les lignes commentées
                            '                        Debug.Print "Found at: Line: " & CStr(SL) & " Column: " & CStr(SC) & " dans le module " & VBComp.Name & " ligne " & VBComp.CodeModule.Lines(SL, 1)
     
                            ReDim Preserve DetVarPublic(1 To 4, 1 To UBound(DetVarPublic, 2) + 1)
     
                            DetVarPublic(1, UBound(DetVarPublic, 2)) = VBComp.Name
     
                            Select Case Left(LTrim(VBComp.CodeModule.Lines(SL, 1)), 3)
                            Case "Dim"
                                DetVarPublic(2, UBound(DetVarPublic, 2)) = "Variables niveau module"
                            Case "Global"
                                DetVarPublic(2, UBound(DetVarPublic, 2)) = "Public (pour toute l'application)"
                            Case Else
     
     
                                If Mid(LTrim(VBComp.CodeModule.Lines(SL, 1)), 8, 5) = "Const" Then DetVarPublic(2, UBound(DetVarPublic, 2)) = "Constantes"
                                If InStr(1, LTrim(VBComp.CodeModule.Lines(SL, 1)), "Declare Function") > 0 Then DetVarPublic(2, UBound(DetVarPublic, 2)) = "API"
                                If InStr(1, LTrim(VBComp.CodeModule.Lines(SL, 1)), "Declare Sub") > 0 Then DetVarPublic(2, UBound(DetVarPublic, 2)) = "API"
     
                                If Mid(LTrim(VBComp.CodeModule.Lines(SL, 1)), 8, 4) = "Enum" Then DetVarPublic(2, UBound(DetVarPublic, 2)) = "Enumération"
     
                                Select Case Quoi
     
                                Case "Public"
                                    'commence à 8 pour Public
                                    If Mid(LTrim(VBComp.CodeModule.Lines(SL, 1)), 8, 8) <> "Function" And Mid(LTrim(VBComp.CodeModule.Lines(SL, 1)), 8, 5) <> "Const" _
                                       And Mid(LTrim(VBComp.CodeModule.Lines(SL, 1)), 8, 7) <> "Declare" And Mid(LTrim(VBComp.CodeModule.Lines(SL, 1)), 8, 4) <> "Enum" Then
                                        DetVarPublic(2, UBound(DetVarPublic, 2)) = "Public (pour toute l'application)"
                                    End If
     
                                Case "Private"
                                    'commence à 9 pour Public
                                    If Mid(LTrim(VBComp.CodeModule.Lines(SL, 1)), 9, 8) <> "Function" And Mid(LTrim(VBComp.CodeModule.Lines(SL, 1)), 9, 5) <> "Const" _
                                       And Mid(LTrim(VBComp.CodeModule.Lines(SL, 1)), 9, 7) <> "Declare" And Mid(LTrim(VBComp.CodeModule.Lines(SL, 1)), 9, 4) <> "Enum" Then
                                        DetVarPublic(2, UBound(DetVarPublic, 2)) = "Variables niveau module"
                                    End If
     
                                Case "Global"
                                    DetVarPublic(2, UBound(DetVarPublic, 2)) = "Public (pour toute l'application)"
     
                                End Select
     
                            End Select
     
     
                            If Mid(LTrim(VBComp.CodeModule.Lines(SL, 1)), 1, 20) = "Application.TempVars" Then DetVarPublic(2, UBound(DetVarPublic, 2)) = "TempVars"
                            h = IIf(InStr(1, LTrim(VBComp.CodeModule.Lines(SL, 1)), Chr(39), 1) > 0, InStr(1, LTrim(VBComp.CodeModule.Lines(SL, 1)), Chr(39), 1), Len(LTrim(VBComp.CodeModule.Lines(SL, 1))))    '29/08/17
     
                            DetVarPublic(3, UBound(DetVarPublic, 2)) = Left(LTrim(VBComp.CodeModule.Lines(SL, 1)), h)
     
                            DetVarPublic(4, UBound(DetVarPublic, 2)) = SL
                        End If
     
                        If tout Then
                            EL = .CountOfLines
                        Else
                            EL = .CountOfDeclarationLines
                        End If
                        SC = EC + 1
                        EC = 255
     
                        Found = .Find(Target:=FindWhat, StartLine:=SL, StartColumn:=SC, _
                                      EndLine:=EL, EndColumn:=EC, _
                                      wholeword:=True, MatchCase:=False, patternsearch:=False)
     
                    Loop
     
                End With
            End If
            i = i + 1
        Next VBComp
     
    End Sub
     
    Sub Thierry()
    '    NomProjet = "Gestion pdm"  '"C:\*****\*****.accdb"
        SearchCodeModule3 "Public", False, False
        SearchCodeModule3 "Global", False, True
        SearchCodeModule3 "Dim", False, True
        SearchCodeModule3 "Private", False, True
        SearchCodeModule3 "Application.TempVars.Add", True, True
    End Sub
    J'avoue que je n'ais jamais essayé sans référencer 2 projets ensemble.
    Peut dire comment tu fais ?

    Cdlt

  7. #7
    Membre à l'essai Avatar de shishi666
    Inscrit en
    Avril 2013
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Avril 2013
    Messages : 19
    Points : 10
    Points
    10
    Par défaut
    Bonjour Thierry,

    merci pour ta réponse, je vais tester ce que tu me conseil et reviens vers toi si problème ou erreur.

    peux tu m'expliquer ce que tu entends par référencer à la fois dans cette phrase :
    Le code qui suit fonctionne bien ,si ton outil est référencé dans l'appli à verifier.
    et dans celle-ci :
    J'avoue que je n'ais jamais essayé sans référencer 2 projets ensemble.
    Est-ce que tu entends par la que chaque application connais le nom et l'emplacement de l'autre?

    Shishi

  8. #8
    Membre éclairé
    Homme Profil pro
    Regisseur
    Inscrit en
    Octobre 2006
    Messages
    475
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Regisseur
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Octobre 2006
    Messages : 475
    Points : 850
    Points
    850
    Par défaut
    Bonjour.

    N'étant pas un pro du dev, dis moi comment tu fais pour "voir" tous les formulaires de l'appli à modifier ?

    Perso (et beaucoup d'autres ), je fais l'inverse,c à d, à partir de l'application principale, on fais référence (fenetre vba, outils,référence,parcourir ... le fichier accde que tu souhaites).
    C'est ce que l'on appelle un fichier "bibliothèque" . Celà fonctionne (en grande partie) comme un complément accda.
    As tu jeter un oeil sur ma contribution ( DependancesPlus V2) ?

  9. #9
    Membre à l'essai Avatar de shishi666
    Inscrit en
    Avril 2013
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Avril 2013
    Messages : 19
    Points : 10
    Points
    10
    Par défaut
    J'ai survolé ta contribution dès que j'aurais plus de temps je m'y plongerais plus sérieusement.

    Concernant ma façon de faire pour par exemple lister tous les formulaire d'une autre application voici le processus :

    depuis ma boite à outils j'ai un bouton "Ouvrir une base Access" :
    Nom : ouvrir.png
Affichages : 236
Taille : 14,8 Ko

    voici le code sur le clique du bouton :

    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
     
    Private Sub BTN_Ouvrir_Fichier_Click()
    On Error GoTo Erreur_BTN_Ouvrir_Fichier_Click
    Dim CheminFichier As String
     
    Call ChoisirFichier(Application.hWndAccessApp, "Parcourir", "Fichier Access", "accdb")
     
    If Not App Is Nothing Then
        App.Visible = False
     
        On Error GoTo Erreur_FermerFichier
     
        Me.Controls(NOM_CONTROL_NOM_BASE).Caption = RecupererNomFichier
     
        BasculerAffichageFormulaire Me, True
     
        InitialiserBoiteAOutils Me
    End If
     
    Exit Sub
    Erreur_FermerFichier:
        Call FermerFichier
    Erreur_BTN_Ouvrir_Fichier_Click:
        Call GestionErreur(Err, "BTN_Ouvrir_Fichier_Click - Fenêtre : " & NOM_CLAIR_FENETRE, "")
    End Sub
    Puis voici le code de la procédure "ChoisirFichier" :
    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
     
    Public Sub ChoisirFichier(Handle As Long, _
                              Titre As String, _
                              Optional TitreFiltre As String, _
                              Optional TypeFichier As String)
     
    On Error GoTo Erreur_ChoisirFichier
    Dim sFiltre As String
     
    'Construction du filtre en fonction des arguments spécifiés
    If Len(TitreFiltre) > 0 And Len(TypeFichier) > 0 Then
        sFiltre = TitreFiltre & " (" & TypeFichier & ")" & Chr$(0) & "*." & TypeFichier & Chr$(0)
    End If
     
    sFiltre = sFiltre & "Tous (*.*)" & Chr$(0) & "*.*" & Chr$(0)
     
    'Configuration de la boîte de dialogue
    With StructFile
        'Initialisation de la grosseur de la structure
        .lStructSize = Len(StructFile)
        'Identification du handle de la fenêtre
        .hwndOwner = Handle
        'Application du filtre
        .lpstrFilter = sFiltre
        'Initialisation du fichier '0' x 254
        .lpstrFile = String$(254, vbNullChar)
        'Taille maximale du fichier
        .nMaxFile = 254
        'Initialisation du nom du fichier '0' x 254
        .lpstrFileTitle = String$(254, vbNullChar)
        'Taille maximale du nom du fichier
        .nMaxFileTitle = 254
        'Titre de la boîte de dialogue
        .lpstrTitle = Titre
        'Option de la boite de dialogue
        .flags = OFN_HIDEREADONLY
    End With
     
    'Si un fichier est sélectionné
    If (GetOpenFileName(StructFile)) Then
        OuvrirFichier RecupererCheminFichier
    End If
     
    Exit Sub
    Erreur_ChoisirFichier:
        Call GestionErreur(Err, "ChoisirFichier", "")
    End Sub
    Et enfin le code de la procédure OuvrirFichier :
    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
     
    Public Sub OuvrirFichier(CheminFichier As String)
    On Error GoTo Erreur_OuvrirFichier
    'Dim objAccess As Access.Application
    Dim lngRet As Long
     
    If Len(Dir(CheminFichier)) > 0 Then
        Set App = New Access.Application
        With App
            lngRet = apiSetForegroundWindow(.hWndAccessApp)
            lngRet = apiShowWindow(.hWndAccessApp, SW_MAXIMIZE)
            'le premier appel à  ShowWindow semble rester sans effet
            lngRet = apiShowWindow(.hWndAccessApp, SW_MAXIMIZE)
            .OpenCurrentDatabase CheminFichier
        End With
    End If
     
    Exit Sub
    Erreur_OuvrirFichier:
        Select Case Err.Number
            Case 7866:
                ' MDB ouverte en mode exclusif
                MsgBox "L'application Access choisie " & vbCrLf & strMDB & _
                    vbCrLf & "est déjà ouverte en mode exclusif.  " & vbCrLf _
                    & vbCrLf & "Refermez l'application et essayez à nouveau.", _
                    vbExclamation + vbOKOnly, "Could not open database."
     
            Case Else:
                Call GestionErreur(Err, "OuvrirFichier", "")
        End Select
    End Sub
    Après tout ceci ma variable App correspond à l'application choisie puis ouverte.

    Voici enfin la réponse finale à ta question comment lister les formulaire de l'application ouverte :
    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
     
    Public Sub ChargerFormulaires(Fenetre As Form)
    On Error GoTo Erreur_ChargerFormulaires
    Dim obj As Object
     
    Fenetre.Controls(NOM_CONTROL_LISTE_FORMULAIRE).RowSource = ""
     
    For Each obj In App.CurrentProject.AllForms
        If (Not IsInArray(FormulairesAExclure, obj.Name)) Then
            If InStr(obj.Name, "sous_form_") <> 1 Then
                Fenetre.Controls(NOM_CONTROL_LISTE_FORMULAIRE).AddItem (obj.Name)
            End If
        End If
    Next obj
     
    Exit Sub
    Erreur_ChargerFormulaires:
        Call FermerFichier
        Call GestionErreur(Err, "ChargerFormulaires", "")
    End Sub
    avec ceci ma liste contenant les formulaires est remplie.

    Nom : bes_exemple.png
Affichages : 237
Taille : 26,5 Ko

    J'espère avoir répondu à ta question n'hésite pas si des choses te paraisse obscures ou pas claires.

    Shishi

  10. #10
    Membre à l'essai Avatar de shishi666
    Inscrit en
    Avril 2013
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Avril 2013
    Messages : 19
    Points : 10
    Points
    10
    Par défaut
    Je suis entrain de tester ton code Thierry et j'obtiens une erreur incompatibilité de type sur la ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ReDim Preserve DetVarPublic(1 To 4, 1 To UBound(DetVarPublic, 2) + 1)
    J'ai essayé de mettre un point d’arrêt ligne 24 et dans VBE.VBProjects.Item il y a mon application Access.

    Shishi

    Petite modification :

    Le code fonctionne bien actuellement mais j'avoue que l'utilisation de ta foncion Thierry est obscure pour moi.
    Par exemple j'appelle la procédure comme tu me l'as indiquée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SearchCodeModule3 "Public", False, False
    SearchCodeModule3 "Global", False, True
    SearchCodeModule3 "Dim", False, True
    SearchCodeModule3 "Private", False, True
    SearchCodeModule3 "Application.TempVars.Add", True, True
    ensuite que faire ? J'ai mis un point d'arrêt sur le dernier appel et j'ai exécuté le code jusqu'a la fin de la procédure "SearchCodeModule3" puis en regardant les variables locales je n'arrive pas a m'y retrouver, ni a retrouver une variable public "test" que j'ai déclarée dans mon formulaire.

    Merci par avance pour ton aide

    Shishi

  11. #11
    Membre éclairé
    Homme Profil pro
    Regisseur
    Inscrit en
    Octobre 2006
    Messages
    475
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Regisseur
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Octobre 2006
    Messages : 475
    Points : 850
    Points
    850
    Par défaut
    Je ne sais pas comment tu exploites les résultats après coup.

    Ici, ils sont dans un tableau (DetVarPublic), qui est déclaré Public donc accessible partout.
    Dans mon appli, je met ces résultats dans un treeview.

    colonne 1: nom du module
    colonne 2: type de variable
    colonne 3: déclaration de la variable (ex: Dim MaVar As ...) dans le module de la colonne 1
    colonne 4 :numéro de la ligne de code dans le module.

    Cdlt

Discussions similaires

  1. Récupérer variable d'une autre application
    Par Supernatural dans le forum Langage
    Réponses: 2
    Dernier message: 20/12/2017, 11h20
  2. Comment accéder ma servlet depuis une autre machine?
    Par Aldian dans le forum Wildfly/JBoss
    Réponses: 1
    Dernier message: 10/09/2010, 16h48
  3. Réponses: 2
    Dernier message: 28/11/2006, 15h20
  4. Comment remplir les champs d'une autre application ?
    Par rico32fr dans le forum C++Builder
    Réponses: 6
    Dernier message: 19/06/2006, 08h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo