【问题标题】:how do you view macro code in access?你如何查看访问中的宏代码?
【发布时间】:2010-11-23 14:48:49
【问题描述】:

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

【问题讨论】:

    标签: ms-access


    【解决方案1】:

    打开 Access 数据库,您将看到表、查询、报表、模块和宏。
    这包含可用于按顺序调用常见 MS-Access 操作的宏。

    对于自定义 VBA 宏,请按 ALT+F11。

    【讨论】:

    • 如果 ALT+F11 不起作用,请尝试在打开数据库时按住 SHIFT。当前数据库的启动选项中可能未选中“使用访问特殊键”。
    • 如果导航窗格中没有对象的右键菜单(例如右键单击宏并选择设计视图),那么启动选项“允许默认快捷菜单”可能是在文件 -> 选项 -> 当前数据库中未选中。这是在 Access 2010 中,我猜 2007 和 2013 在类似的地方有这个选项。
    【解决方案2】:

    您可以尝试以下 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
    

    【讨论】:

    • 你知道,当我测试它时,我得到的结果不包括宏中的命令,而只是一个集合元属性。当我现在运行它时,它可以工作。你的回答比我的好,所以+1。
    【解决方案3】:

    编辑: 根据 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,这可以通过编程方式完成:这令人沮丧,因为您没有指定 WHERE 到做这个。在某个窗口?在访问?如何?在哪里?请针对那些试图弄清楚某些宏的作用的非 Access 用户具体说明。
    • 您可以将代码粘贴到 Access 数据库中的公共模块中。但坦率地说,如果你对 Access 了解不多,你真的不应该做这样的事情,因为你没有能力去做。
    【解决方案4】:

    这对我有用:我能够找到调用特定查询的宏。顺便说一句,知道如何在 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 碰巧将 XML 的那部分拆分为输出文件中的两个“cmets”时会出现一些误报
    【解决方案5】:

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

    【讨论】:

    • 答案不正确。单击“创建”功能区上的“宏”会创建一个新的空白宏。单击“在此数据库中”下的宏会将“RunMacro”调用添加到新的空白宏(函数/子例程调用的宏等效项)。
    • 点击宏后,它应该会带来一个名为“设计”的新标签,点击动作目录,这样如果动作目录面板已经关闭,它就可以从屏幕右侧出现
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-06
    • 1970-01-01
    • 2020-12-13
    • 2015-04-19
    • 2013-01-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多