【发布时间】:2010-11-23 14:48:49
【问题描述】:
我有一个 Microsoft Access 数据库,那里有一个宏。如何查看宏的代码?
【问题讨论】:
标签: ms-access
我有一个 Microsoft Access 数据库,那里有一个宏。如何查看宏的代码?
【问题讨论】:
标签: ms-access
打开 Access 数据库,您将看到表、查询、报表、模块和宏。
这包含可用于按顺序调用常见 MS-Access 操作的宏。
对于自定义 VBA 宏,请按 ALT+F11。
【讨论】:
您可以尝试以下 VBA 代码直接导出宏内容,而无需先将其转换为 VBA。与表格、表单、报告和模块不同,宏位于称为脚本的容器中。但它们在那里,可以使用 SaveAsText 和 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
另一种使用的对象如下:
For Each obj In Access.Application.CurrentProject.AllMacros
Access.Application.SaveAsText acMacro, obj.Name, strFilePath & "\Macro_" & obj.Name & ".txt"
Next
【讨论】:
编辑: 根据 Michael Dillon 的回答,SaveAsText 确实将命令保存在宏中,而无需转换为 VBA。我不知道测试时发生了什么,但它没有在结果文件中生成有用的文本。
所以,我今天学到了一些新东西!
原帖: 为了扩展这个问题,我想知道是否有办法从代码中检索宏的内容,但似乎没有(至少在我正在运行的 A2003 中没有)。
您可以通过两个集合访问存储的宏:
CurrentDB.Containers("Scripts").Documents
CurrentProject.AllMacros
Intellisense 为这两个集合识别的属性相当不同,因为这些集合属于不同的类型。第一种(即传统的 A2000 之前的方式)是通过文档集合,所有文档的方法/属性/成员都是相同的,即不特定于宏。
同样,CurrentProject 的 All... 集合返回单个项的类型为 Access Object 的集合。结果是 Intellisense 为您提供特定文档/对象可能不存在的方法/属性/成员。
据我所知,没有办法以编程方式检索宏的内容。
这是有道理的,因为对于能够编写代码以编程方式检查它们的人来说,宏并没有多大用处。
但是,如果您只想评估宏的作用,另一种方法是将它们转换为 VBA,这可以通过编程方式完成:
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
然后您可以将生成的文本文件用于您需要做的任何事情。
请注意,这必须在 Access 中以交互方式运行,因为它使用 DoCmd.RunCommand,并且您必须为每个宏单击“确定”——对于具有大量宏的数据库来说很乏味,但对于普通应用程序来说不会太繁琐,这应该'只有几个宏。
【讨论】:
这对我有用:我能够找到调用特定查询的宏。顺便说一句,知道如何在 VBA 中编码的人想要编写这样的东西的原因是,当他们继承了不知道如何在 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
【讨论】:
在 Access 2010 中,转到功能区上的“创建”选项卡。单击宏。 “操作目录”面板应出现在屏幕右侧。在下面,有一个标题为“在此数据库中”的部分。单击其中一个宏名称应显示其代码。
【讨论】: