2016-07-06 151 views
0

我有6個文件逐個執行宏。帶有VBA代碼的第一個文件(主文件)打開剩餘的5個文件並啓動VBA連鎖反應。第二個文件做宏工作並啓動第三個文件的工作,並且它一直到第六個文件。Excel VBA宏跨工作簿未完全執行

第6個文件然後引用第1個文件的宏(主),應該關閉所有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保持打開狀態)。

我試着先用Workbooks(「...」)使它變得簡單。關閉,但已經嘗試了幾件事情,結束了上面的代碼。

任何人都可以幫忙嗎?

+0

因此,關閉工作簿的代碼位於第一個工作簿中?在您的 Sub CloseAll()代碼中,第一個工作簿是首先關閉的工作簿!因此wb1.Close之外的代碼都不會運行。 – Absinthe

+4

我強烈建議不要在這種「連鎖反應」方法中使用它。將所有代碼放在單個工作簿中(不管是第1冊還是單獨的主代碼工作簿),然後從主文件夾中打開並關閉其他工作簿。 –

+0

@Absinthe,不,它不在wb1中,共有6個文件。 CloseAll()位於「refresh_tool.xlsm」中,也就是說,文件wb0。 – Mateusz

回答

1

這不起作用。您需要按照其他用戶的建議進行操作。

正在發生的事情是這樣的(濃縮到只有3個工作簿):

我)從refresh_tool運行宏開WB1

II)WB1開幕(在線程refresh_tool宏)

III )爲refresh_tool宏運行宏從WB1(螺紋)

ⅳ)從WB1宏正在運行(在線程WB1這是在螺紋refresh_tool)

v)的WB2開幕(在線程WB1這是在螺紋refresh_tool)

ⅵ)從WB2運行宏(在線程WB1宏這是在螺紋refresh_tool)

ⅶ)從WB2宏調用Close在refresh_tool宏(在線程WB2這是在線程WB1這是在線程refresh_tool)

八)從refresh_tool關閉宏啓動運行(在線程WB2這是在線程WB1這是在原thread for refresh_tool)

ix)關閉來自refresh_tool的宏關閉wb1

這是問題!!!!!!這將關閉wb1的線程,這將終止刷新工具中關閉宏的運行。所以,它永遠不會超過第一關。即使您重新排序了工作簿的關閉方式,此時關閉宏仍將在所有工作簿的線程中運行。無論您關閉哪一個,都會結束該工作簿的線程,從而結束關閉宏。

您需要完成評論中建議的內容並運行來自一位主人的所有代碼。或者在工作簿中的每個宏的結束(和我會建議其他方式),靠近每個工作簿,如果你覺得你真的必須鏈接這些:

在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