Excel VBA宏在工作簿中未完全执行

时间:2016-07-06 20:35:21

标签: excel vba excel-vba macros

我有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保持打开状态)。

我尝试使用工作簿(" ...")尽量简单。关闭,但已经尝试了几件事,最后得到了上面的代码。

有人可以帮忙吗?

1 个答案:

答案 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