我有6个文件一个接一个地执行宏。带有VBA代码的第一个文件(主文件)打开剩余的5个文件并启动VBA链式反应。第二个文件执行宏作业并启动第三个文件的作业,直到第6个文件。
第6个文件然后引用第一个文件的宏(master),它应该关闭所有5个工作簿(除了这个1stone)。第6个工作簿的代码如下所示:
from decorator import decorator
def _do_something(func, *args, **kw):
print "before call"
result = func(*args, **kw)
print "after call"
return result
def my_decor(f):
return decorator(_do_something, f)
class SomeService(ServiceBase):
@my_decor
@srpc(Integer, _returns=Integer)
def testf(first):
return first
然后转到:
Application.DisplayAlerts = False
ThisWorkbook.RefreshAll
Workbooks("6th_file.xlsm").SaveAs Filename:= _
"[URL]6th_file_htm.htm"
Application.Run ("refresh_tool.xlsm!CloseAll.CloseAll")
结果是当在该链中运行时,只关闭第一个工作簿(refresh_tool,wb2,wb3,wb4和wb5保持打开状态)。
但是,当CloseAll()单独运行时 - 它可以正常工作并关闭所有5个文件(只有refresh_tool保持打开状态)。
我尝试使用工作簿(" ...")尽量简单。关闭,但已经尝试了几件事,最后得到了上面的代码。
有人可以帮忙吗?
答案 0 :(得分:1)
这不会起作用。你需要按照其他用户的建议去做。
这是怎么回事(仅限于3本工作簿):
i)从refresh_tool运行宏以打开wb1
ii)wb1打开(在refresh_tool宏的线程中)
iii)从wb1运行宏(在thread_tool宏的线程中)
iv)来自wb1的宏正在运行(在wb1的线程中,它位于refresh_tool的线程中)
v)wb2打开(在wb1的线程中,它位于refresh_tool的线程中)
vi)从wb2运行宏(在线程中用于wb1宏,它位于refresh_tool的线程中)
vii)来自wb2的宏调用在refresh_tool中关闭宏(在wb2的线程中,在wb1的线程中,它位于refresh_tool的线程中)
viii)从refresh_tool开始运行关闭宏(在wb2的线程中,这是wb1的线程,它位于refresh_tool的原始线程中)
ix)关闭来自refresh_tool的宏关闭wb1
这就是问题!!!!!!这将关闭wb1的线程,该线程结束刷新工具中关闭宏的运行。所以,它永远不会超过第一次结束。即使您重新排序了工作簿的关闭方式,此时也会在所有工作簿的线程中运行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
等
显然,修复模块和子程序的名称以匹配你的名称。
<强> 修改 强>
或者,您可以拨打&#34; Close_All&#34;来自原始主文件。只需在第一次打开代码后进行调用:
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