Как получить доступ к содержимому макроса в файле из другого макроса / скрипта?
Как часть процесса переноса данных, мне нужен скрипт / макрос для доступа ко всем файлам в исходном расположении и проверки наличия связанных документов, чтобы эти ссылки могли быть восстановлены после перенастройки (уже выполнено). Помимо прямых ссылок, если в файле есть макрос, пытающийся получить доступ к другому файлу, эта ссылка также должна быть восстановлена после перенастройки (для этого нужно решение).
Таким образом, в принципе, есть ли способ доступа к содержимому макроса в файле из другого скрипта / макроса (чтобы проверить документы, к которым пытается обратиться первый макрос, чтобы он работал даже после миграции)?
1 ответ
Да. Фактически вы можете прочитать содержимое модуля (или любого компонента проекта VBA), запрограммировав сам редактор Visual Basic (VBE). Вы можете сделать это, выполнив следующие шаги.
- Добавить ссылку на библиотеку VBA Extensibility
Microsoft Visual Basic для приложений расширяемость 5.3
После успешного завершения вы можете написать код для извлечения строк кода из другого модуля или проекта в другой книге. Примерно ниже, который печатает коды, найденные в стандартном модуле:
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
Вы можете использовать
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.
И, конечно, проект должен быть разблокирован.