从另一个closures工作簿而不停止代码

问题:我遇到的问题是,如果我尝试closures另一个工作簿,则代码将停止运行。

这个问题已经在几篇文章中被曝光了,但似乎没有解决办法。

我在做什么:

  1. 我在工作簿WB1.xlsm中有一个名为“Code1”的代码,以下面的方式打开WB2 Workbooks.Open("WB2.xlsm").RunAutoMacros(xlAutoOpen)

  2. WB2的Auto_Open代码现在正在运行,我在WB2中执行我的工作(复制数据),然后目标是将这些数据粘贴到WB3中,并closuresWB1,所以我在从WB2开始的Auto_Open代码结束之前进行如下操作跳入WB3:

     For Each wbk In Workbooks If wbk.Name = "WB1.xlsm" Then 'wbk.Activate 'DoEvents 'ActiveWorkbook.Close False wbk.Close False 'Application.OnTime Now + TimeValue("00:00:01"), "wbk.Close" End If Next Workbooks.Open(PathTo_WB3).RunAutoMacros (xlAutoOpen) 

    问题是closuresWB1后代码停止(上面你可以看到不同的尝试closures它,但他们都失败了…)

问题:实际上是否可以在不看到代码被停止的情况下closures另一个工作簿?

我在工作簿WB1.xlsm中有一个名为“Code1”的代码,它打开了WB2

所以WB1是WB2的来电者。 这是一个黄金法则:

他打开一个文件,应该负责closures它。

这条黄金法则适用于编程中的许多许多事情,如果从中得出结论,将会遇到许多许多问题。

  • 创造物体的人应该负责摧毁它。
  • 谁分配资源,应该负责解除分配。

因此,您有一个名为WB1.xlsm的文件,其中包含正在运行的代码 – 就执行上下文而言,WB1是ThisWorkbook

所以ThisWorkbook这样做:

 Workbooks.Open("WB2.xlsm").RunAutoMacros xlAutoOpen 

这假设文件成功打开,并丢弃一个宝贵的对象引用,你实际上需要…糟糕。 将其更改为:

 With Workbooks.Open("WB2.xlsm") .RunAutoMacros xlAutoOpen .Close False End With 

现在WB2的automacros可以做任何他们喜欢的事情, 除了试图closuresWB1

所以WB2的automacro打开WB3 – 因此WB2也应该负责closuresWB3 ,因为它负责打开它 – 在WB2.xlsm您将有一个Workbook_BeforeClose处理程序来确保WB3和WB2一起closures。 不pipe怎么说 – 根本不清楚为什么你需要一个automacro来做到这一点,或者为什么WB1不能打开WB2和WB3。

只要记住你的执行上下文/ 调用堆栈 (调用源自WB1,所以直到执行返回到WB1,你有东西悬而未决),并记住,VBA代码居住在主机文档 – 如果你closures该文档,代码停止存在。

这是一个正常的行为。 因为WB2的自动运行是在WB1中打开WB2的子范围内的。 如果您在WB2的自动运行中closuresWB1,则立即停止立即停止运行的上下文。

解决方法可能是隐藏WB1而不是closures(例如最小化)。 并且在WB2中作为自动运行的最后一个动作运行WB1。 这仍然会中止WB2的自动运行,但没关系,因为这是最后一个动作。

确保使用OnTime方法调用WB2中的代码。 假设WB2中你想启动的例程叫做ContinueOpen:

 Sub OpenWB2AndDoStuff() Workbooks.Open("WB2.xlsm") Application.Ontime Now, "'" & ActiveWorkbook.FullName & "'!ContinueOpen" End Sub