如何在Workbook B上的Workbook A上调用Workbook_Open?

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

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

选项1:在禁用macros的情况下打开工作簿A,放置数据,保存并closures工作簿,然后使用启用的macros重新打开工作簿。 我宁愿不这样做的原因是:我正在处理一个具有相当数量的格式的.xls文件(基本上我正在模拟一个人将如何使用它几千次),并保存文件数千次可能导致文件损坏。 另外,这需要花费相当多的时间来打开工作簿两次,对我来说这似乎并不高效。 其中一个重点是速度和效率,最快的周转时间。

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

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

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

Workbook_Open是一个私人小组。 你不能直接调用它。

我可以提供选项3:将Workbook_open的代码复制到工作簿B中的一个子集中。然后您可以调用它,这个工具将是公开的,您可以将其称为模拟。

此外,如果腐败是一个问题,请创build工作簿A的副本以用于testing。 然后,如果它被损坏,原来仍然可用。

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