如何从工作簿B中调用Workbook_Open on Workbook A?

时间:2015-01-09 21:34:29

标签: excel vba excel-vba events

我的情况是我正在尝试从工作簿B打开工作簿A并运行Workbook_Open子例程。仅使用Workbooks.Open("c:\myworkbook.xls")的问题是我需要在Workbook_Open子例程运行之前在工作簿A中植入数据。

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

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

选项2:将Workbook_Open代码复制为模块中其他位置的公共子例程。这两者中更为理想,但问题是我不一定有权执行此操作这样做会涉及大量的繁文缛节,红旗等等。

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

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

2 个答案:

答案 0 :(得分:3)

从工作簿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

答案 1 :(得分:1)

Workbook_Open是一个私人子。你不能直接打电话。

我可以提供选项3:将代码从Workbook_open复制到工作簿B中的子代码中。然后,您可以将其称为公开,并且可以将其调用以进行模拟。

此外,如果需要考虑损坏,请创建工作簿A的副本以用于测试。然后,如果它被破坏,原件仍然可用。