你如何在访问中查看宏代码?

时间:2009-08-28 04:05:22

标签: ms-access

我有一个Microsoft Access数据库,那里有一个宏。如何查看宏的代码?

5 个答案:

答案 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中,转到功能区上的“创建”选项卡。单击宏。 “操作目录”面板应出现在屏幕右侧。在下面,有一个标题为“在此数据库中”的部分。单击其中一个宏名称应显示其代码。