【发布时间】:2017-03-15 00:37:06
【问题描述】:
问题:我遇到的问题是,如果我尝试从另一个工作簿关闭工作簿,代码将停止运行。
这个问题已经在一些帖子中暴露了,但似乎没有解决方案。
我想要做什么:
我在工作簿 WB1.xlsm 中有一个名为“Code1”的代码,它通过以下方式打开 WB2
Workbooks.Open("WB2.xlsm").RunAutoMacros(xlAutoOpen)-
Auto_Open 代码表单 WB2 现在正在运行,我在 WB2 中执行我的操作(复制数据),然后目标是将这些数据粘贴到 WB3 中并关闭 WB1,因此我在 Auto_Open 代码末尾执行以下操作在跳入 WB3 之前从 WB2:
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)问题是代码在关闭 WB1 后停止(在上面您可以看到关闭它的不同尝试,但它们都失败了......)
问题:实际上是否可以从另一个工作簿关闭工作簿而不会看到代码被停止?
【问题讨论】:
-
如果我没记错的话,您正在关闭运行代码的工作簿?
-
你有 code (A) 正在运行 code (B),所以当你说“整个代码”时,你是指 A 还是乙?那个代码在WB1中吗?
wbk.Close位于循环中,该循环迭代ApplicationWorkbooks集合中的所有工作簿,其中包括包含当前正在执行该循环的代码的工作簿(即ThisWorkbook) - 关闭包含执行代码的文件将停止该代码,就是这样。所以请edit 澄清你的意思,我们没有看你的屏幕,也无法读心。 -
这是正常行为。因为 WB2 的自动运行是在 WB1 中打开 WB2 的子程序的上下文中。如果您在 WB2 的自动运行中关闭 WB1,您会立即终止该上下文,从而立即停止运行。 VBA 不能多线程!
-
FWIW 一个关闭其他工作簿的
Auto_Open宏是一个非常非常糟糕的主意。 -
你应该重新考虑你的设计。如果我曾经打开一个 Excel 文件并关闭了我正在处理的所有其他文件,我会删除它并且不再使用它。那是恶意软件 - 不是宏。