不完全执行Excel Excel VBAmacros的工作簿
我有6个文件逐个执行macros。 带有VBA代码的第一个文件(主文件)打开剩余的5个文件并启动VBA连锁反应。 第二个文件做macros工作并启动第三个文件的工作,并且一直到第六个文件。
然后第6个文件引用第1个文件的macros(master),它应该closures所有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
结果是,在该链中运行时,只closures第一个工作簿(refresh_tool,wb2,wb3,wb4和wb5保持打开状态)。
但是,当CloseAll()单独运行时,它可以正常工作并closures所有5个文件(只有refresh_tool保持打开状态)。
我试着先用Workbooks(“…”)来简化它,closures,但是已经尝试了几件事情,结束了上面的代码。
任何人都可以帮忙吗?
这是不行的。 您需要按照其他用户的build议进行操作。
发生了什么事情(仅限于3个工作簿):
i)从refresh_tool运行macros来打开wb1
ii)wb1打开(在refresh_toolmacros的线程中)
iii)从wb1运行macros(在refresh_toolmacros的线程中)
iv)来自wb1的macros正在运行(在用于refresh_tool的线程中的wb1的线程中)
v)wb2打开(在线程中处于线程中,处于refresh_tool中的wb1)
vi)从wb2运行macros(在线程中的wb1macros,在线程中为refresh_tool)
vii)wb2中的macros调用refresh_tool中的macros(在wb2的线程中,wb1中的线程中是refresh_tool)
viii)从refresh_tool开始运行closuresmacros(在wb2的线程中,wb1的线程在refresh_tool的原始线程中)
ix)从refresh_toolclosuresmacrosclosureswb1
这就是问题!!!!!! 这将closureswb1的线程,这将终止刷新工具中closuresmacros的运行。 所以,它从来没有超过第一关。 即使您重新sorting了工作簿的closures方式,此时closures的macros也将在所有工作簿的线程中运行。 无论你closures哪一个结束该工作簿的线程,结束closuresmacros。
你需要做的是在评论中提出的build议,并运行一个主人的所有代码。 或者(我会推荐其他方式),closures工作簿中每个macros的末尾的每个工作簿,如果你觉得你真的必须链接这些:
在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 Sub