如何从工作簿 B 调用工作簿 A 上的 Workbook_Open?

How can I call Workbook_Open on Workbook A from Workbook B?

我的情况是我试图从工作簿 B 和 运行 Workbook_Open 子例程打开工作簿 A。仅使用 Workbooks.Open("c:\myworkbook.xls") 的问题是我需要在 Workbook_Open 子例程 运行s.

之前在工作簿 A 中植入数据

我有两个想法,我都不是特别喜欢,所以我想知道是否有更好的方法。我的两个想法如下。

选项 1:在禁用宏的情况下打开工作簿 A,植入数据,保存并关闭工作簿,然后在启用宏的情况下重新打开它。我不想这样做的原因这样做是:我正在处理一个具有大量格式的 .xls 文件(基本上我是在模拟人类如何使用它数千次)并且保存文件数千次可能会导致文件损坏。此外,这需要花费大量时间来打开工作簿两次,而且对我来说似乎效率不高。重点之一是速度和效率以及最快的周转时间。

选项 2:将 Workbook_Open 代码复制为模块中其他地方的 public 子例程。 这是两者中更可取的一个,但是问题是我不一定有权执行此操作,这样做会涉及大量繁文缛节、危险信号等。

有没有办法做这样的事情:

Workbooks("Workbook A").Application.Run (Workbooks("Workbook A").Workbook_Open)

Workbook_Open 是私人潜艇。不能直接调用。

我可以提供选项 3:将代码从 Workbook_open 复制到工作簿 B 中的子文件中。然后您可以调用它 public 并且您可以调用它进行模拟。

此外,如果担心损坏,请创建工作簿 A 的副本以用于测试。然后如果它损坏了,原来的仍然可用。

来自工作簿 B:

'add vb reference to "Microsoft Visual Basic For Applications Extensibility 5.3"
Sub Tester()

    Dim wb As Workbook
    Dim VBProj As VBIDE.VBProject
    Dim VBComp As VBIDE.VBComponent
    Dim CodeMod As VBIDE.CodeModule
    Dim LineNum As Long

    Set wb = Workbooks("BookA.xlsm")
    Set VBProj = wb.VBProject
    Set VBComp = VBProj.VBComponents("ThisWorkbook")
    Set CodeMod = VBComp.CodeModule

    With CodeMod
        LineNum = .CountOfLines + 1
        .InsertLines LineNum, "Public Sub Blah()"
        LineNum = LineNum + 1
        .InsertLines LineNum, "   Workbook_Open"
        LineNum = LineNum + 1
        .InsertLines LineNum, "End Sub"
    End With

    Application.Run "BookA.xlsm!ThisWorkbook.Blah"

End Sub

参见:http://www.cpearson.com/excel/vbe.aspx