У меня есть база данных Microsoft Access, и там есть макрос. Как просмотреть код макроса?
Как вы просматриваете макрокоманду в доступе?
Ответ 1
Откройте базу данных Access, вы увидите таблицу, запрос, отчет, модуль и макрос.
Он содержит макросы, которые могут использоваться для вызова общих действий MS-Access в последовательности.
Для настраиваемого макроса VBA нажмите ALT + F11.
Ответ 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
Ответ 3
EDIT: По словам Майкла Диллона, SaveAsText сохраняет команды в макросе, не переходя в VBA. Я не знаю, что произошло, когда я протестировал это, но в полученном файле не появился полезный текст.
Итак, сегодня я узнал что-то новое!
ОРИГИНАЛЬНАЯ ПОЧТА: Чтобы развернуть вопрос, я задавался вопросом, есть ли способ получить содержимое макроса из кода, и не кажется, что есть (по крайней мере, нет в A2003, это то, что я запускаю).
Есть две коллекции, через которые вы можете получить доступ к сохраненным макросам:
CurrentDB.Containers("Scripts").Documents
CurrentProject.AllMacros
Свойства, которые Intellisense идентифицирует для двух коллекций, довольно различны, потому что коллекции имеют разные типы. Первый (т.е. Традиционный, pre-A2000 способ) осуществляется через коллекцию документов, а методы/свойства/члены всех документов одинаковы, то есть не специфичны для макросов.
Аналогично, коллекции All... коллекции 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 для каждого макросложного для баз данных с большим количеством макросов, но не слишком обременительным для обычного приложения, которое должно У меня больше нескольких макросов.
Ответ 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
Ответ 5
Ответ от User2666082 верный! Он открывает окно создания макроса, но вам не нужно его создавать. Справа вы видите "Каталог действий", а в разделе "В этой базе данных" вы можете найти все ваши макросы в вашей базе данных.
Вы можете редактировать их оттуда, дважды щелкнув по макросу.
Ответ 6
В Access 2010 перейдите на вкладку "Создать" на ленте. Нажмите "Макро". Панель "Каталог действий" должна появиться в правой части экрана. Под ним есть раздел под названием "В этой базе данных". Нажатие на одно из имен макросов должно отображать его код.