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 :

Dans une base de données, comment savoir si un champ d'une table est utilisé par une fonction ou une sub? [AC-2010]


Sujet :

VBA Access

  1. #1
    Membre actif
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    335
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 335
    Points : 229
    Points
    229
    Par défaut Dans une base de données, comment savoir si un champ d'une table est utilisé par une fonction ou une sub?
    Bonjour,

    Tout est dans le titre

    J'ai une base de données avec pas mal de codes vba et beaucoup de tables. En vue de l'optimiser, je voudrais savoir si certains champs de certaines tables sont utilisés, ou pas, par un des codes existants (Sub ou Fonction). Il est probable que certains champs ne soient là que pour stocker des "données documentaires" (servant juste à rendre plus explicite d'autres champs pour l'utilisateur mais n'étant jamais utilisé dans un code vba).
    Comment puis-je faire cela sans devoir repasser en revue ligne par ligne tous les codes existants?

    Si vous avez des suggestions, n'hésitez pas!! car pour le moment, je relis tout ligne par ligne (ou quasiment) ...

    Encore bonne année à tous et toutes

  2. #2
    Expert éminent

    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    3 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 840
    Points : 7 974
    Points
    7 974
    Par défaut
    Bonjour,

    Tu peux commencer par utiliser la fonction de recherche CTRL+F dans l'éditeur VBA.

    Cordialement.
    Mandresy
    "Je ne sais qu'une chose, c'est que je ne sais rien" Socrate

    N'oublions pas de mettre quand on a trouvé notre bonheur. Soyons sympa pour les futurs heureux.

    Merci, c'est toujours sympa de recevoir des de votre part

  3. #3
    Membre actif
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    335
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 335
    Points : 229
    Points
    229
    Par défaut
    Bonjour Madefemere,

    Oui je l'utilise déjà :-) Mais en pratique il faut que j'aille voir dans toutes les tables le nom des champs existants, puis les rechercher dans l'editeur vba et ainsi de suite... Lourd et long même si je ne vois pas d'alternative pour l'instant...
    Je rechercherai plus une méthode "automatisée" si ça peut exister...

    Merci pour ta suggestion

  4. #4
    Expert confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Juin 2012
    Messages
    3 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : retraité
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juin 2012
    Messages : 3 183
    Points : 5 515
    Points
    5 515
    Par défaut
    Bonjour,

    Je ne sais pas si cela va tout trouver, mais ce ne doit pas en être loin.
    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
    Option Compare Database
    Option Explicit
     
    Private Sub UtilisationsChamps()
        Dim tdf As Object, sNomChamp As String, k As Integer
        For Each tdf In CurrentDb.TableDefs
            If Left(tdf.Name, 4) <> "MSys" Then ' Don't enumerate the system tables
                For k = 0 To tdf.Fields.Count - 1
                    sNomChamp = tdf.Fields(k).Name
                    Debug.Print "=== Table: " & tdf.Name & " === Champ: " & sNomChamp
                    FindWordInModules sNomChamp
                    FindIntoQueries sNomChamp
                    FindIntoForm sNomChamp
                    Debug.Print
                Next k
            End If
        Next tdf
    End Sub
     
    Public Sub FindWordInModules(ByVal sTxt As String)
        'Dim objComponent As VBComponent
        ' VBComponent requires reference to Microsoft Visual Basic
        ' for Applications Extensibility; use late binding instead:
        '--- http://www.cpearson.com/excel/vbe.aspx
        Dim objComponent As Object
        Dim CodeMod As Object
        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
        Debug.Print "--- MODULES ---"
        For Each objComponent In Application.VBE.ActiveVBProject.VBComponents
            Set CodeMod = objComponent.CodeModule
            With CodeMod
                SL = 1
                EL = .CountOfLines
                SC = 1
                EC = 255
                Found = .Find(Target:=sTxt, StartLine:=SL, StartColumn:=SC, _
                                EndLine:=EL, EndColumn:=EC, _
                                wholeword:=False, MatchCase:=False, patternsearch:=False)
                Do Until Found = False
                    Debug.Print objComponent.Name & ", ligne " & CStr(SL) & ", colonne " & CStr(SC)
                    EL = .CountOfLines
                    SC = EC + 1
                    EC = 255
                    Found = .Find(Target:=sTxt, StartLine:=SL, StartColumn:=SC, _
                                    EndLine:=EL, EndColumn:=EC, _
                                    wholeword:=False, MatchCase:=False, patternsearch:=False)
                Loop
            End With
        Next objComponent
    End Sub
     
    Public Sub FindIntoQueries(ByVal sTxt As String)
        Dim Qry As Object
        Debug.Print "--- QUERIES ---"
        For Each Qry In CurrentDb.QueryDefs
            If InStr(Qry.sql, sTxt) > 0 Then
                Debug.Print "--- " & Qry.Name
                Debug.Print Qry.sql
            End If
        Next Qry
    End Sub
     
    Public Sub FindIntoForm(ByVal sTxt As String)
        Dim Frm As Object, sNom As String, sSource As String
        Debug.Print "--- FORMS ---"
        For Each Frm In CurrentProject.AllForms
                sNom = Frm.Name
                DoCmd.OpenForm sNom, acDesign
                sSource = Forms(sNom).RecordSource
            If InStr(sSource, sTxt) > 0 Then
                Debug.Print "--- " & Frm.Name,
                Debug.Print sSource
            End If
                FindIntoControl Forms(sNom), sTxt
                DoCmd.Close acForm, sNom
        Next Frm
    End Sub
     
    Public Sub FindIntoControl(Frm As Form, ByVal sTxt As String)
        Dim Ctl As Control
        On Error Resume Next
        For Each Ctl In Frm.Controls
            If Ctl.ControlType = acListBox Or Ctl.ControlType = acComboBox Then
                If InStr(Ctl.RowSource, sTxt) > 0 Then
                    Debug.Print "--- " & Frm.Name & "." & Ctl.Name
                    Debug.Print Ctl.RowSource
                End If
            End If
        Next Ctl
    End Sub
    Vu la quantité d'infos produite, il faudrait aménager cela pour le sortir sur un fichier texte (plutôt que des Debug.Print).

    Cordialement.

  5. #5
    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 256
    Points
    34 256
    Par défaut
    Salut,

    à noter que si tu passes par l'index de tes champs plutôt que par leur nom "en dur", ca sera impossible
    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

  6. #6
    Membre actif
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    335
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 335
    Points : 229
    Points
    229
    Par défaut
    Bonjour EricDgn, Jean-Philippe,

    @ EricDgn: Je vais juste dire Waouh!! Ca semble tout à fait être ce à quoi je pensais!!
    Je vais décortiquer le code et le tester (après avoir renvoyé la sortie vers un fichier texte comme tu le suggères).

    @ Jean-Philippe: Je crois que je comprends ce que tu veux dire car le code d'EricDgn se base sur une recherche de string.
    Une recherche qui serait basée sur les index des champs devrait au préalable chercher aussi si le recordset lié à ce champ (d'index y) corresponds à la table que l'on "étudie" (= il y a autant que champs Fields(2) que de table dans la base)
    Est-ce bien cela?

    En tout cas un tout tout grand merci!!!

    Cordialement et très bon weekend!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 15/11/2012, 15h54
  2. Réponses: 0
    Dernier message: 17/04/2012, 10h38
  3. Réponses: 1
    Dernier message: 10/04/2012, 09h28
  4. Réponses: 7
    Dernier message: 11/03/2011, 16h22
  5. Réponses: 3
    Dernier message: 20/09/2010, 14h55

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