如何从另一个宏/脚本访问文件中的宏的内容?

时间:2018-01-04 04:28:55

标签: vba excel-vba vbe excel

作为数据迁移过程的一部分,我需要一个脚本/宏来访问源位置中的所有文件,并检查相互链接的文档,以便在迁移后(已经完成)重新建立这些链接。除了直接链接,如果文件有一个试图访问另一个文件的宏,那么该链接也应该在迁移后恢复(需要一个解决方案)。

基本上,有没有办法从另一个脚本/宏访问文件中宏的内容(检查第一个宏尝试访问的文档,以便它在迁移后工作)?

1 个答案:

答案 0 :(得分:0)

是。您可以通过编程 Visual Basic编辑器(VBE)本身来实际读取模块(或任何VBA项目组件)的内容。您可以按照以下步骤执行此操作。

  1. 添加对 VBA可扩展性库的引用
      

    Microsoft Visual Basic for Applications Extensibility 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
    
  4. 不确定这是否能解答您的具体问题,但希望这可以帮助您入门。
    顺便说一下,重要勾选信任访问VBA项目对象模型开发人员宏设置下进行此操作。

    enter image description here

    您可以在开发人员标签>下找到。代码>宏安全
    当然项目应该解锁