web-dev-qa-db-fra.com

comment voyez-vous le code macro dans l'accès?

J'ai une base de données Microsoft Access et il y a une macro là-bas. Comment afficher le code de la macro?

Ouvrez la base de données Access, vous verrez Table, Query, Report, Module & Macro.
Il contient les macros qui peuvent être utilisées pour appeler des actions MS-Access courantes dans une séquence.

Pour une macro VBA personnalisée, appuyez sur ALT + F11.

20
shahkalpesh

Vous pouvez essayer le code VBA suivant pour exporter directement le contenu des macros sans les convertir au préalable en VBA. Contrairement aux tables, formulaires, rapports et modules, les macros se trouvent dans un conteneur appelé Scripts. Mais ils sont là et peuvent être exportés et importés à l'aide de SaveAsText et LoadFromText

Option Compare Database

Option Explicit

Public Sub ExportDatabaseObjects()
On Error GoTo Err_ExportDatabaseObjects

    Dim db As Database
    Dim d As Document
    Dim c As Container
    Dim sExportLocation As String

    Set db = CurrentDb()

    sExportLocation = "C:\SomeFolder\"
    Set c = db.Containers("Scripts")
    For Each d In c.Documents
        Application.SaveAsText acMacro, d.Name, sExportLocation & "Macro_" & d.Name & ".txt"
    Next d

Un autre objet à utiliser est le suivant:

  For Each obj In Access.Application.CurrentProject.AllMacros
    Access.Application.SaveAsText acMacro, obj.Name, strFilePath & "\Macro_" & obj.Name & ".txt"
  Next
9
Michael Dillon

EDIT: Selon la réponse de Michael Dillon, SaveAsText enregistre les commandes dans une macro sans avoir à passer par la conversion en VBA. Je ne sais pas ce qui s'est passé lorsque j'ai testé cela, mais cela n'a pas produit de texte utile dans le fichier résultant.

J'ai donc appris quelque chose de nouveau aujourd'hui!

ORIGINAL POST: Pour développer la question, je me suis demandé s'il y avait un moyen de récupérer le contenu d'une macro à partir du code, et il ne semble pas qu'il y en ait (du moins pas dans A2003, ce que j'exécute).

Il existe deux collections à travers lesquelles vous pouvez accéder aux macros stockées:

  CurrentDB.Containers("Scripts").Documents
  CurrentProject.AllMacros

Les propriétés qu'Intellisense identifie pour les deux collections sont assez différentes, car les collections sont de types différents. La première (c'est-à-dire traditionnelle, manière antérieure à A2000) se fait via une collection de documents, et les méthodes/propriétés/membres de tous les documents sont les mêmes, c'est-à-dire non spécifiques aux macros.

De même, les collections All ... de CurrentProject renvoient des collections où les éléments individuels sont de type Access Object. Le résultat est qu'Intellisense vous donne des méthodes/propriétés/membres qui peuvent ne pas exister pour le document/objet particulier.

Pour autant que je sache, il n'y a aucun moyen de récupérer par programme le contenu d'une macro.

Cela serait logique, car les macros ne sont pas très utiles à quiconque aurait la capacité d'écrire du code pour les examiner par programme.

Mais si vous voulez juste évaluer ce que font les macros, une alternative serait de les convertir en VBA, ce qui peut être fait par programme ainsi:

  Dim varItem As Variant
  Dim strMacroName As String

  For Each varItem In CurrentProject.AllMacros
    strMacroName = varItem.Name
    'Debug.Print strMacroName
    DoCmd.SelectObject acMacro, strMacroName, True
    DoCmd.RunCommand acCmdConvertMacrosToVisualBasic
    Application.SaveAsText acModule, "Converted Macro- " & strMacroName, _
      CurrentProject.Path & "\" & "Converted Macro- " & strMacroName & ".txt"
  Next varItem

Ensuite, vous pouvez utiliser les fichiers texte résultants pour tout ce que vous devez faire.

Notez que cela doit être exécuté de manière interactive dans Access car il utilise DoCmd.RunCommand, et vous devez cliquer sur OK pour chaque macro - fastidieux pour les bases de données avec beaucoup de macros, mais pas trop onéreux pour une application normale, qui ne devrait pas avoir plus qu'une poignée de macros.

6
David-W-Fenton

Cela a fait l'affaire pour moi: j'ai pu trouver la macro appelée une requête particulière. Par ailleurs, la raison pour laquelle quelqu'un qui sait coder en VBA voudrait écrire quelque chose comme ça, c'est quand il a hérité de quelque chose de macro écrit par quelqu'un qui ne sait pas coder en VBA.

Function utlFindQueryInMacro
       ( strMacroNameLike As String
       , strQueryName As String
       ) As String 
    ' (c) 2012 Doug Den Hoed 
    ' NOTE: requires reference to Microsoft Scripting Library
    Dim varItem As Variant
    Dim strMacroName As String
    Dim oFSO As New FileSystemObject
    Dim oFS   
    Dim strFileContents As String
    Dim strMacroNames As String
    For Each varItem In CurrentProject.AllMacros
    strMacroName = varItem.Name
    If Len(strMacroName) = 0 _
    Or InStr(strMacroName, strMacroNameLike) > 0 Then
        'Debug.Print "*** MACRO *** "; strMacroName
        Application.SaveAsText acMacro, strMacroName, "c:\temp.txt"
        Set oFS = oFSO.OpenTextFile("c:\temp.txt")
        strFileContents = ""
        Do Until oFS.AtEndOfStream
            strFileContents = strFileContents & oFS.ReadLine
        Loop
        Set oFS = Nothing
        Set oFSO = Nothing
        Kill "c:\temp.txt"
        'Debug.Print strFileContents
        If InStr(strFileContents, strQueryName)     0 Then
            strMacroNames = strMacroNames & strMacroName & ", "
        End If
    End If
    Next varItem
    MsgBox strMacroNames
    utlFindQueryInMacro = strMacroNames
 End Function
1
Doug Den Hoed