我有一个Microsoft Access数据库,那里有一个宏。如何查看宏的代码?
答案 0 :(得分:19)
打开Access数据库,您将看到Table,Query,Report,Module&宏。
它包含可用于在序列中调用常见MS-Access操作的宏。
对于自定义VBA宏,请按ALT + F11。
答案 1 :(得分:8)
您可以尝试使用以下VBA代码直接导出宏内容,而无需先将其转换为VBA。与表,表单,报表和模块不同,宏位于名为Scripts的容器中。但它们在那里,可以使用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
答案 2 :(得分:5)
编辑: 根据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,并且您必须为每个宏单击“确定” - 对于具有大量宏的数据库来说很乏味,但对于普通应用程序来说不是太繁重,没有几个宏。
答案 3 :(得分:0)
这对我有用:我能找到一个叫做特定查询的宏。顺便说一句,知道如何在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
答案 4 :(得分:-1)
在Access 2010中,转到功能区上的“创建”选项卡。单击宏。 “操作目录”面板应出现在屏幕右侧。在下面,有一个标题为“在此数据库中”的部分。单击其中一个宏名称应显示其代码。