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