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 :

Documenter requêtes via VBA (champs calculés, critères, regroupements)


Sujet :

VBA Access

  1. #1
    Membre averti
    Femme Profil pro
    Directeur de projet
    Inscrit en
    Mars 2016
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2016
    Messages : 55
    Par défaut Documenter requêtes via VBA (champs calculés, critères, regroupements)
    Bonjour!

    Je suis en train d'adapter un code me permettant de documenter une base de données.
    J'ai créé une première table qui documente les tables/champs/types de champs.
    Une deuxième table documente les requêtes (nom/noms des champs/types de champs/champs source) :

    Nom : Capture.PNG
Affichages : 192
Taille : 5,6 Ko

    Avec ce 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
    Public Sub EnrichirReqDico()
    On Error Resume Next
    Dim oDb As DAO.Database
    Dim oQdf As DAO.QueryDef
    Dim oFld As DAO.Field
    Set oDb = CurrentDb
    'Lance la création de la table dico si besoin
    CreerRequeteDico oDb
    'Explore chaque table
    For Each oQdf In oDb.QueryDefs
        'Alors explore chaque champ
        For Each oFld In oQdf.Fields
          'Enrichit la table du dictionnaire
          oDb.Execute "INSERT INTO NOMREQUETEDICO VALUES (" & _
                MAJTexte(oQdf.Name) & "," & _
                MAJTexte(oFld.Name) & "," & _
                MAJTexte(TypeFr(oFld.Type)) & "," & _
                MAJTexte(oFld.SourceField) & "," & _
                MAJTexte(oQdf.SQL) & ")"
        Next oFld
    Next oQdf
     
    'libère les objets
    Set oFld = Nothing
    Set oQdf = Nothing
    Set oDb = Nothing
     
    End Sub
    J'aurais aimé pour chaque champ de chaque requête renseigner :
    - une colonne avec la formule du champ pour les champs calculés
    - une colonne avec les critères de la requête pour ce champ
    - une colonne avec les regroupements (somme, expression, compte, regroupement...)

    Je ne sais pas si je suis très claire, il me manque un peu du jargon access/vba !

    Savez-vous s'il est aussi possible de faire la même chose avec les formulaires? du genre :
    - Nom du formulaire
    - Nom du contrôle
    - Type de contrôle
    - Source des données du contrôle
    - Procédures événementielles du contrôle

    Sachant que la documentation automatique prévue dans access ne convient pas (), complètement illisible...

    Merci d'avance

  2. #2
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 682
    Par défaut
    Salut,

    on peut bien evidemment descendre loin dans la granularite des informations que tu souhaites faire remonter

    Par exemple, avec la requete suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT MSysObjects.Name, MSysQueries.*
    FROM MSysObjects INNER JOIN MSysQueries ON MSysObjects.Id = MSysQueries.ObjectId;

    On arrive a recuperer par exemple la liste des requetes pour chaque bout de formulaire =]
    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 :
    Migrer les applications VBA Access et VBA Excel vers la Power Platform
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

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

    Coffrets disponibles de mes ouvrages : https://www.editions-eni.fr/jean-philippe-andre
    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 averti
    Femme Profil pro
    Directeur de projet
    Inscrit en
    Mars 2016
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2016
    Messages : 55
    Par défaut
    Merci, ultra-simple et efficace, c'est tout juste ce que je cherchais!
    J'avais utilisé à la base une méthode différente pour documenter les tables, et j'ai essayé de la reproduire et de l'adapter pour documenter mes formulaires (nom, type, liste des controles, propriétés des contrôles)

    Mais il me semble que j'ai un problème au niveau de la déclaration de la variable oCtl en tant que contrôle de formulaire...L'exécution me retourne "Erreur d'exécution 438 propriété ou méthode non gérée par cet objet"

    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
    'Procédure principale
    Public Sub EnrichirFrmDico()
    'On Error Resume Next
    Dim oDb As DAO.Database
    Dim oFrm As AccessObject
    Dim oCtl As Control
    Dim oPrp As Property
     
    Set oDb = CurrentDb
     
    For Each oFrm In CurrentProject.AllForms
        For Each oCtl In oFrm.Controls
             For Each oPrp In oCtl.Properties
     
          'Enrichit la table du dictionnaire
          CurrentDb.Execute "INSERT INTO NOMFORMDICO VALUES (" & _
                MAJTexte(oFrm.Name) & "," & _
                MAJTexte(oFrm.Type) & "," & _
                MAJTexte(oFrm.Properties("Name")) & "," & _
                MAJTexte(oCtl.Name) & "," & _
                MAJTexte(oPrp.Name) & "," & _
                MAJTexte(oPrp.Value) & ")"
            Next oPrp
        Next oCtl
    Next oFrm
     
    'libère les objets
    Set oDb = Nothing
    Set oFrm = Nothing
    Set oCtl = Nothing
    Set oPrp = Nothing
     
    End Sub
    Par ailleurs, comment est-il possible de récupérer le code des procédures événementielles de chaque formulaire?

    Merci d'avance et bonne journée!

  4. #4
    Membre averti
    Femme Profil pro
    Directeur de projet
    Inscrit en
    Mars 2016
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2016
    Messages : 55
    Par défaut Récupérer code évenementiel VBA pour chaque contrôle de formulaire
    Salut!

    J'ai finalement trouvé la solution pour ma documentation de formulaires (des problèmes de déclaration de variables, je n'y connais pas grand chose donc j'avais sans doute mélangé des variables "incompatibles"...), en modifiant mon code comme cela :

    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
    Public Sub EnrichirFrmDico()
    On Error Resume Next
    Dim oDb As DAO.Database
    Dim oFrm As Access.Form
    Dim oCtl As Access.Control
    Dim oPrp As Property
     
    Set oDb = CurrentDb
     
    'Lance la création de la table dico si besoin
    CreerRequeteDico oDb
     
    'Explore chaque formulaire
    For Each oFrm In Access.Forms
        For Each oCtl In oFrm.Controls
                 For Each oPrp In oCtl.Properties
        Set oDb = CurrentDb
              'Enrichit la table du dictionnaire
                Dim str As String
                str = "INSERT INTO NOMFORMDICO VALUES (" & _
                MAJTexte(oFrm.Name) & "," & _
                MAJTexte(oCtl.Name) & "," & _
                MAJTexte(oCtl.ControlType) & "," & _
                MAJTexte(oPrp.Name) & "," & _
                MAJTexte(oPrp.Value) & ")"
                DoCmd.RunSQL (str)
     
            Next oPrp
        Next oCtl
    Next oFrm
     
    'libère les objets
    Set oDb = Nothing
    Set oFrm = Nothing
    Set oCtl = Nothing
    Set oPrp = Nothing
     
    End Sub

    Maintenant, j'essaye de rendre le tout plus complet en récupérant le code VBA exécuté sur événement dans l'ensemble des formulaires. J'ai créé une procédure dans un module à part :

    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
    Public Sub EnrichirFormModDico()
     
    On Error Resume Next
     
    Dim dbs As Database
    Dim doc As Document
    Dim frm As Form
     
    Dim lngCount As Long
    Dim lngCountDecl As Long
    Dim lngI As Long
    Dim strProcName As String
    Dim astrProcNames() As String
    Dim intI As Integer
    Dim strMsg As String
    Dim lngR As Long
    Dim oStartLine As Long
    Dim oCountLines As Long
    Dim strProcBody As String
     
    Set dbs = CurrentDb
     
    DoCmd.RunSQL "DELETE * FROM NOMFORMMODDICO;"
     
    With dbs.Containers!Forms
        For Each doc In .Documents
            DoCmd.OpenForm doc.Name, acDesign, , , , acHidden
            Set frm = Forms(doc.Name)
     
            ' Set form properties.
            With frm
                lngCount = frm.Module.CountOfLines
                lngCountDecl = frm.Module.CountOfDeclarationLines
                ' Determine name of first procedure.
                strProcName = frm.Module.ProcOfLine(lngCountDecl + 1, lngR)
                ' Initialize counter variable.
                intI = 0
     
                For lngI = lngCountDecl + 1 To lngCount
     
                    ' Compare procedure name with ProcOfLine property value.
                    If strProcName <> frm.Module.ProcOfLine(lngI, lngR) Then
                        ' Increment counter.
                        intI = intI + 1
     
                        'Determine procedure name
                        strProcName = frm.Module.ProcOfLine(lngI, lngR)
     
                        'Determine procedure string for strProcName
                        oStartLine = frm.Module.ProcStartLine(strProcName, vbext_pk_Proc)
                        oCountLines = frm.Module.ProcCountLines(strProcName, vbext_pk_Proc)
                        strProcBody = frm.Module.Lines(oStartLine, oCountLines)
     
                        'Remplir la table NOMFORMMODDICO
                        Dim str As String
     
                        str = "INSERT INTO NOMFORMMODDICO VALUES (" & _
                        MAJTexte(doc.Name) & "," & _
                        MAJTexte(frm.Module.Name) & "," & _
                        MAJTexte(strProcName) & "," & _
                        MAJTexte(strProcBody) & ")"
     
                        DoCmd.RunSQL (str)
     
                    End If
                Next lngI
    End With
     
    Set frm = Nothing
    DoCmd.Close acForm, doc.Name
     
    Next doc
    End With
    Set dbs = Nothing
     
    End Sub
    Après ajustement, l'ensemble marche très bien , sauf pour récupérer le contenu de la procédure ("strProcBody")...Le problème semble être la ponctuation du contenu de la procédure qui perturbe l'instruction sql d'ajout dans la table NOMFORMMODDICO...

    Y a-t-il un moyen pour insérer via ma procédure ce contenu ponctué?

    Merci à vous!
    Bonne journée

Discussions similaires

  1. Exporter 1 requête contenant des champs calculés vers Excel
    Par MaryR dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 08/09/2009, 19h54
  2. [AC-2007] Ouverture d'une requête via VBA
    Par Oliv'83 dans le forum VBA Access
    Réponses: 2
    Dernier message: 28/06/2009, 14h50
  3. Réponses: 4
    Dernier message: 07/01/2009, 15h25
  4. Critères avec opérateurs dans une requête avec des champs calculés
    Par lmollard dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 11/05/2008, 18h53
  5. Réponses: 2
    Dernier message: 02/07/2007, 19h44

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