如何从Workbook B调用Workbook A的Workbook_Open函数?

3
我的情况是我正在尝试从工作簿B打开工作簿A并运行Workbook_Open子程序。使用Workbooks.Open("c:\myworkbook.xls")的问题在于,在Workbook_Open子程序运行之前,我需要在Workbook A中插入数据。
我有两个想法,但都不太喜欢,所以我想知道是否有更好的方法。我的两个想法如下。
选项1:禁用宏打开工作簿A,插入数据,保存并关闭工作簿,然后启用宏重新打开它。我不希望这样做的原因是:我正在处理一个具有相当多格式的.xls文件(基本上我正在模拟人类如何使用它数千次),多次保存文件可能会导致文件损坏。此外,两次打开工作簿需要很长时间,对我来说似乎并不高效。其中一个重点是速度和效率以最快的周转时间为重点。
选项2:将Workbook_Open代码复制为模块中的公共子程序。这是两个选项中更理想的选择,但问题是我不一定有权限执行此操作,而且这样做将涉及大量的审批程序和注意事项等。
是否有办法做到这样的事情:
Workbooks("Workbook A").Application.Run (Workbooks("Workbook A").Workbook_Open)

你能否用在工作簿B中定义的UDFs替换工作簿A中的值? - Chel
2
你可以考虑将一个小的Public Sub注入到Workbook A的ThisWorkbook模块中 - 你可以从那里调用Private Workbook_Open。http://www.cpearson.com/excel/vbe.aspx - Tim Williams
2个回答

4

来自工作簿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

See:http://www.cpearson.com/excel/vbe.aspx


好的方法。我注意到如果变量被定义为对象,则对可扩展性的引用是不必要的。 - brettdj

1

Workbook_Open是一个私有子程序。您无法直接调用它。

我可以提供第三个选项:将Workbook_open中的代码复制到Workbook B中的一个子程序中。然后,您可以调用它并使其成为公共的,以便在模拟中使用。

此外,如果担心损坏问题,请创建Workbook A的副本用于测试。然后,如果它被损坏,原始文件仍将可用。


我本来就担心这个问题。我可能会选择那条路线,虽然它很复杂,但我认为它会成功。我绝对不会使用我们的黄金副本进行所有这些测试! - Soulfire
“Workbook_Open” 可以重新定义为公共子程序,对吗?(虽然我不会这样做,只是为了论证) - RubberDuck
1
@RubberDuck,我很震惊地发现你是正确的。但这将问题恢复到使用OP的选项2更改代码。 - Degustaf
1
真的是令人毛骨悚然的信息。我知道。 - RubberDuck

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接