作为数据迁移过程的一部分,我需要一个脚本/宏来访问源位置中的所有文件,并检查相互链接的文档,以便在迁移后(已经完成)重新建立这些链接。除了直接链接,如果文件有一个试图访问另一个文件的宏,那么该链接也应该在迁移后恢复(需要一个解决方案)。
基本上,有没有办法从另一个脚本/宏访问文件中宏的内容(检查第一个宏尝试访问的文档,以便它在迁移后工作)?
答案 0 :(得分:0)
是。您可以通过编程 Visual Basic编辑器(VBE)本身来实际读取模块(或任何VBA项目组件)的内容。您可以按照以下步骤执行此操作。
Microsoft Visual Basic for Applications Extensibility 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项目对象模型在开发人员宏设置下进行此操作。
您可以在开发人员标签>下找到。代码>宏安全。
当然项目应该解锁。