2017-06-11 46 views
0

這裏是場景。我有多個Excel工作簿,可以相互複製和粘貼數據。所以這個宏的工作原理是從一個工作簿open.copy.close然後open.paste.close到另一個。我正在創建一個函數來在文件關閉時自動運行宏。如何讓vba代碼只在活動工作簿上運行自動關閉?

這是問題所在,當我單擊工作簿1中的宏按鈕時,它應該從工作簿2打開.copy.close。但是,由於在工作簿2中關閉文件功能時會自動運行,所以會出現錯誤(2個宏不能同時運行)任何解決方案?我正在尋找解決方案,只有在文件關閉時自動運行宏如果它是一個活躍的工作簿。以下是我現在有:

Workbook 1 
Sub workbook_beforeclose(cancel As Boolean) 
Application.Run "Sheet1.UpdateYellowTabs_Click" 

End Sub 

Workbook 2 
Sub Workbook_BeforeClose(Cancel As Boolean) 
Workbook.BeforeClose 
Application.Run "Sheet12.UpdateGreen_Click" 
End Sub 

如何編寫它在工作簿中的代碼只能使這個運行,只有當打開/關閉受宏觀時,它的主動/人類用戶和關閉不?

謝謝!

回答

0

嗯,我不確定要從中理解你的最終目標,但我可以回答「技術」問題。從技術上講,如果要檢查一個給定的工作簿處於活動狀態:If Application.ActiveWorkbook Is Me

Private Sub Workbook_BeforeClose(Cancel As Boolean) 
    If Not Application.ActiveWorkbook Is Me Then Exit Sub ' <-- add this test 

    '''''''''''''''''''''''''' 
    ' Whatever code goes here 
    '''''''''''''''''''''''''' 
End Sub 

編輯

但問題是,調用wb2.close將使執行過程中的工作簿wb2「激活」一個宏。所以這種方法不起作用。另一種方法是在關閉工作簿之前禁用事件;以便事件Workbook_BeforeClose不會觸發。之後,您可以根據需要啓用事件。代碼如下所示:

' ... open wb2 and do the work with it 
Application.EnableEvents = False 
wb2.Close False 
Application.EnableEvents = True 

通知,如果你已經在當前的宏觀,這是通常建議,那麼就沒有必要了這個額外的代碼的開頭已被禁用的事件。

+0

嗨,我試過你的代碼,它實質上是我想要做的。但是,它不起作用。我希望它能夠在例程'workbook_beforeclose'上運行,只有當包含它的工作簿是'活動工作簿'時。我是否需要激活和停用工作簿,以便宏知道哪個是哪個? – Carmen

+0

@Carmen,本質上,這個想法是,如果你通過'wb1'的代碼關閉'wb2',通過激活'wb1',找到一種在關閉'wb2'前關閉它的方法。像'wb1.Activate:wb2.close'。 –

+0

我瞭解它的技術部分,並從此開始嘗試使用它。我已經分別激活了wb1和wb2,並按照建議插入了'wb1.activate:wb2.close',但它仍然不起作用。是否將代碼添加到工作簿代碼或我的模塊/工作表中? '子Workbook_BeforeClose(取消正如布爾) 如果不Application.ActiveWorkbook是我,然後退出子 Application.Run「Sheet12.UpdateGreen_Click」 結束Sub'我得到這個錯誤,我應該是每個工作簿定義後,即使激活和停用。 – Carmen

相關問題