Как искать файлы кода VBA

Я только начал работу с новой компанией, где предыдущие разработчики создали множество автоматизированных задач. Конечно, практически нет документации, и у меня не было возможности работать с предыдущим разработчиком, поэтому теперь я пытаюсь просеять все эти процессы, которые ищут тот, который изменяет некоторые определенные файлы.

Я написал все хранимые procs в SQL и использовал инструмент поиска и не нашел то, что искал, поэтому теперь мне интересно, нужен ли мне этот процесс в одной из многочисленных баз данных Access, которые используются, С SQL Server было легко написать приложение С# для script процессов, чтобы я мог их просматривать, но с Access это похоже на то, что я ограничился открытием каждого db в отдельности для поиска файлов кода.

Есть ли способ программного поиска файлов VBA?

Ответы

Ответ 1

Если ваш интерес заключается в поиске модулей кода в файле базы данных Access, вы можете использовать объектную модель VBE. В этом примере выполняется поиск слова во всех модулях ActiveVBProject текущей базы данных. Если база данных содержит более одного VBProject, вы можете перечислить коллекцию VBProjects и поочередно искать проекты по имени:

For Each objComponent In Application.VBE.VBProjects(ProjName).VBComponents

Или, если вы предпочитаете ссылаться на проект по номеру, а не по имени, просто знайте, что нумерация начинается с 1, а не из 0.

Public Sub findWordInModules(ByVal pSearchWord As String)
    'Dim objComponent As VBComponent
    ' VBComponent requires reference to Microsoft Visual Basic
    ' for Applications Extensibility; use late binding instead:
    Dim objComponent As Object
    Dim strMessage As String
    Dim strModuleList As String

    strModuleList = vbNullString
    For Each objComponent In Application.VBE.ActiveVBProject.VBComponents
        If objComponent.CodeModule.Find(pSearchWord, 1, 1, -1, -1) = True Then
            strModuleList = strModuleList & "; " & objComponent.Name
        End If
    Next objComponent
    strMessage = "Text '" & pSearchWord & "' found in "
    If Len(strModuleList) > 0 Then
        strMessage = strMessage & "modules: " & Mid(strModuleList, 3)
    Else
        strMessage = strMessage & "no modules"
    End If
    Debug.Print strMessage
End Sub

Просмотрите раздел справки Access для этого метода Find; вы можете предпочесть различные варианты, чем я использовал.

Если вы хотите настроить таргетинг на несколько файлов db и искать модули в каждом, вы можете автоматизировать это с помощью метода OpenDatabase. Я оставлю детали этой части вам.

Ответ 2

Лучше всего загрузить бесплатную MZ-Tools для VBA и использовать их функцию поиска/замены.

Start FindНайти результаты

Edit

MZ-Tools для VBA больше не доступен. Платная версия работает с более новыми офисными установками.

Ответ 3

Другой вариант, не упомянутый ранее, - просто распечатать код проекта из контекстного меню в редакторе VBA. Шаги, приведенные ниже, могут быть изменены в зависимости от доступных приложений, но результат будет таким же - текст с возможностью поиска.

В редакторе VBA щелкните правой кнопкой мыши имя проекта и нажмите "Печать" в появившемся контекстном меню. Убедитесь, что установлен "Код", и нажмите "ОК". Принтер можно изменить из меню "Настройка...", доступного в последнем диалоговом окне.

Правый клик Флажок

На стороне примечания - автономные модули, SQL, таблицы и т.д. доступны для печати из "Документального документа базы данных" в группе "Анализ" вкладки "DATABASE TOOLS".

Очень полезно, для сортировки и выделения базового SQL запросов Access.

Database Documenter