我有6个文件,每个文件一个接一个地执行宏。包含VBA代码的第一个文件(主文件)将打开其余5个文件,并启动VBA连锁反应。第二个文件执行宏作业,并启动第三个文件的作业,直到第六个文件。
然后,第六个文件引用第一个文件的宏(master),它应该关闭所有5个工作簿(除了这个1stone)。第六个工作簿的代码如下所示:
Application.DisplayAlerts = False
ThisWorkbook.RefreshAll
Workbooks("6th_file.xlsm").SaveAs Filename:= _
"[URL]6th_file_htm.htm"
Application.Run ("refresh_tool.xlsm!CloseAll.CloseAll")然后它会转到:
Option Explicit
Sub CloseAll()
Dim wb1 As Workbook
Dim wb2 As Workbook
Dim wb3 As Workbook
Dim wb4 As Workbook
Dim wb5 As Workbook
Set wb1 = Workbooks("wb1.xlsm")
Set wb2 = Workbooks("wb2.xlsm")
Set wb3 = Workbooks("wb3.xlsm")
Set wb4 = Workbooks("wb4.xlsm")
Set wb5 = Workbooks("wb5.xlsm")
wb1.Close
wb2.Close
wb3.Close
wb4.Close
wb5.Close结果是,当在该链中运行时,只关闭第一个工作簿(refresh_tool、wb2、wb3、wb4和wb5保持打开状态)。
但是,当CloseAll()单独运行时,它会正常工作并关闭所有5个文件(只有refresh_tool保持打开状态)。
我一开始试着用Workbook(“...”).Close让它变得简单,但已经尝试了几种方法,最后以上面的代码结束。
有谁能帮帮忙吗?
发布于 2016-07-07 06:15:07
这行不通的。你需要按照其他用户的建议去做。
正在发生的事情是这样的(压缩为3个工作簿):
i)从refresh_tool运行宏以打开wb1
ii)打开wb1 (在refresh_tool宏的线程中)
iii)从wb1运行宏(在refresh_tool宏的线程中)
iv)来自wb1的宏正在运行(在wb1的线程中,在refresh_tool的线程中)
v)打开wb2 (在wb1的线程中,在refresh_tool的线程中)
vi)从wb2运行宏(对于wb1宏在线程中,对于refresh_tool在线程中)
vii)来自wb2的宏调用refresh_tool中的Close宏(在wb2的线程中,在wb1的线程中,在refresh_tool的线程中)
viii) refresh_tool的Close宏开始运行(在wb2的线程中,在wb1的线程中,在refresh_tool的原始线程中)
ix)关闭refresh_tool中的宏关闭wb1
这就是问题!这将关闭wb1的线程,从而结束刷新工具中close宏的运行。所以,它永远不会超过第一个关闭。即使您对工作簿的关闭方式进行了重新排序,此时所有工作簿的close宏仍将在线程中运行。无论您关闭哪一个,都会结束该工作簿的线程,从而结束close宏。
您需要按照注释中的建议进行操作,并从一个母版运行所有代码。或者(我建议以另一种方式),如果你真的觉得你必须链接这些,在工作簿中的每个宏的结尾处关闭每个工作簿:
在wb1中:
Public Sub openFileandRun()
Dim wb As Workbook
Set wb = Workbooks.Open("filepath\wb2.xlsm")
Application.Run (wb.Name & "!openModule.openFileandRun")
Thisworkbook.Close SaveChanges:=False
End Sub在wb2中:
Public Sub openFileandRun()
Dim wb As Workbook
Set wb = Workbooks.Open("filepath\wb3.xlsm")
Application.Run (wb.Name & "!openModule.openFileandRun")
Thisworkbook.Close SaveChanges:=False
End Sub等。
显然,修改模块和子例程的名称以匹配您的名称。
编辑
或者,您可以只调用原始主文件中的"Close_All“。只需在第一次打开代码后执行调用:
Public Sub masterRun()
Dim wb As Workbook
Set wb = Workbooks.Open("filepath\wb1.xlsm")
'Do whatever you are doing to wb1.
Call CloseAll
End Subhttps://stackoverflow.com/questions/38233310
复制相似问题