Как получить доступ к содержимому макроса в файле из другого макроса / скрипта?

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

Таким образом, в принципе, есть ли способ доступа к содержимому макроса в файле из другого скрипта / макроса (чтобы проверить документы, к которым пытается обратиться первый макрос, чтобы он работал даже после миграции)?

1 ответ

Решение

Да. Фактически вы можете прочитать содержимое модуля (или любого компонента проекта VBA), запрограммировав сам редактор Visual Basic (VBE). Вы можете сделать это, выполнив следующие шаги.

  1. Добавить ссылку на библиотеку VBA Extensibility

    Microsoft Visual Basic для приложений расширяемость 5.3

  2. После успешного завершения вы можете написать код для извлечения строк кода из другого модуля или проекта в другой книге. Примерно ниже, который печатает коды, найденные в стандартном модуле:

    Dim VBProj As VBIDE.VBProject
    Dim VBComp As VBIDE.VBComponent
    Dim VBCodeMod As VBIDE.CodeModule
    
    Dim wb As Workbook, i As Integer
    
    Set wb = ThisWorkbook '/* or any target workbook */
    '/* You can actually create a loop which opens all workbooks in a directory */
    
    Set VBProj = wb.VBProject
    
    '/* For simplicity sake, this prints all codes in a Standard Module */
    For Each VBComp In VBProj.VBComponents
        If VBComp.Type = vbext_ct_StdModule Then
            Set VBCodeMod = VBComp.CodeModule
            With VBCodeMod
                For i = 1 To .CountOfLines
                    '/* This prints the lines in the module */
                    Debug.Print .Lines(i, 1)
                    '/* You can transfer this instead somewhere */
                Next
            End With
        End If
    Next
    
  3. Вы можете использовать Find метод, если вам нужны только конкретные строки:

    Dim VBProj As VBIDE.VBProject
    Dim VBComp As VBIDE.VBComponent
    Dim VBCodeMod As VBIDE.CodeModule
    
    Dim wb As Workbook, IsFound As Boolean
    Dim StartLine As Long, EndLine As Long, StartCol As Long, EndCol As Long
    
    Set wb = ThisWorkbook
    Set VBProj = wb.VBProject
    
    For Each VBComp In VBProj.VBComponents
        If VBComp.Type = vbext_ct_StdModule Then
            Set VBCodeMod = VBComp.CodeModule
            With VBCodeMod
    
                StartLine = 1
                EndLine = .CountOfLines
                StartCol = 1
                EndCol = 255
    
                '/* Below finds a specific pattern, e.g. directory */
                '/* patternsearch argument set to true */
                IsFound = .Find("C:\*", StartLine, StartCol, _
                    EndLine, EndCol, False, False, True)
    
                Do Until IsFound = False
                    Debug.Print .Lines(StartLine, 1) '/* Prints the found pattern */
                    EndLine = .CountOfLines
                    StartCol = EndCol + 1
                    EndCol = 255
                    IsFound = .Find("C:\*", StartLine, StartCol, _
                        EndLine, EndCol, False, False, True)
                Loop
            End With
        End If
    Next
    

Не уверен, что это отвечает на ваш конкретный вопрос, но надеюсь, что это поможет вам начать.
Между прочим, чтобы сделать эту работу, важно установить флажок Доверительный доступ к объектной модели проекта VBA в разделе " Параметры макроса разработчика".

введите описание изображения здесь

Вы можете найти выше под вкладкой Разработчик> Код> Macro Security.
И, конечно, проект должен быть разблокирован.

Другие вопросы по тегам