首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Excel VBA宏帐户工作簿未完全执行

Excel VBA宏帐户工作簿未完全执行
EN

Stack Overflow用户
提问于 2016-07-07 04:35:21
回答 1查看 183关注 0票数 0

我有6个文件,每个文件一个接一个地执行宏。包含VBA代码的第一个文件(主文件)将打开其余5个文件,并启动VBA连锁反应。第二个文件执行宏作业,并启动第三个文件的作业,直到第六个文件。

然后,第六个文件引用第一个文件的宏(master),它应该关闭所有5个工作簿(除了这个1stone)。第六个工作簿的代码如下所示:

代码语言:javascript
复制
Application.DisplayAlerts = False

ThisWorkbook.RefreshAll
Workbooks("6th_file.xlsm").SaveAs Filename:= _
"[URL]6th_file_htm.htm" 

Application.Run ("refresh_tool.xlsm!CloseAll.CloseAll")

然后它会转到:

代码语言:javascript
复制
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让它变得简单,但已经尝试了几种方法,最后以上面的代码结束。

有谁能帮帮忙吗?

EN

回答 1

Stack Overflow用户

发布于 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中:

代码语言:javascript
复制
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中:

代码语言:javascript
复制
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“。只需在第一次打开代码后执行调用:

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38233310

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档