как просмотреть код макроса в access?

У меня есть база данных Microsoft Access и там есть макрос. Как просмотреть код макроса?

5 ответов


откройте базу данных Access, вы увидите таблицу, запрос, отчет, модуль и макрос.
Это содержит макросы, которые можно использовать для вызова общих действий MS-Access в последовательности.

для пользовательского макроса VBA нажмите ALT+F11.


вы можете попробовать следующий код 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

изменить: В соответствии с ответом Майкла Диллона SaveAsText сохраняет команды в макросе без необходимости преобразования в VBA. Я не знаю, что произошло, когда я проверил это, но он не произвел полезный текст в результирующем файле.

Итак, сегодня я узнал что-то новое!

ОРИГИНАЛЬНЫЙ ПОСТ: Чтобы расширить вопрос, я задался вопросом, есть ли способ получить содержимое макроса из кода, и он не кажется, что есть (по крайней мере, не в A2003, который то, что я запускаю).

есть две коллекции, через которые вы можете получить доступ к сохраненным макросам:

  CurrentDB.Containers("Scripts").Documents
  CurrentProject.AllMacros

свойства, которые Intellisense определяет для двух коллекций, довольно разные, потому что коллекции имеют разные типы. Первый (т. е. традиционный, pre-A2000 способ) - через коллекцию документов, а методы/свойства/члены всех документов одинаковы, т. е. не специфичны для макросов.

аналогично, все... сборники CurrentProject возвращает коллекции, в которых отдельные элементы имеют тип 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, и вы должны нажать OK для каждого макроса-утомительно для баз данных с большим количеством макросов, но не слишком обременительно для обычное приложение, которое не должно иметь более нескольких макросов.


это сделало трюк для меня: я смог найти, какой макрос вызвал конкретный запрос. Кстати, причина, по которой кто-то, кто знает, как кодировать в 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, перейдите на вкладку создание на ленте. Нажмите Кнопку Макрос. В правой части экрана должна появиться панель "каталог действий". Внизу есть раздел под названием " В этой базе данных."При нажатии на одно из имен макросов должен отображаться его код.