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.
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
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.
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