2013-08-26 118 views
0

想要在關閉Excel工作表窗口時執行少量自定義代碼。使用VBA的Excel工作表關閉按鈕事件

上午使用的是workbook_windowDeactivate。當控件調用函數時,VBA腳本變量中的值被破壞。這是VBA的正常行爲嗎?有沒有辦法將變量中的值零售到執行「workbook_windowDeactivate」?

+0

你是什麼意思的損壞?請發佈事件處理程序的代碼 –

回答

0

如果將變量作爲靜態或全局變量存儲在標準模塊中,excel將跟蹤它們,除非必須重置項目。例如在一個模塊中,我有:

Public TimeLastDeactivatedSheet1 As Date 

Sub showTime() 
MsgBox CStr(TimeLastDeactivatedSheet1) 
End Sub 

在的ThisWorkbook代碼,我有:

Private Sub Workbook_WindowDeactivate(ByVal Wn As Window) 
    TimeLastDeactivatedSheet1 = Now 
End Sub 

你可以檢驗一下正在運行showTime() sub recoreded。

Private Sub Worksheet_Deactivate() 
    TimeLastDeactivatedSheet1 = Now 
End Sub 

當然,如果你想保持變量閉幕後,當您關閉該項目使復位工作簿:這取決於你想如何共同努力,把代碼中的另一個位置將是表對象你將需要存儲他們,例如在工作表或文本文件上。您可以使用Workbook_BeforeClose事件處理程序執行此操作。

編輯:

可能最容易做一個例子。把代碼在標準模塊的頂部一行:

Public TimeLastDeactivatedSheet1 As Date 

將這個碼的片模塊中:

Private Sub Worksheet_Deactivate() 
    TimeLastDeactivatedSheet1 = Now 
End Sub 

將這個代碼的工作簿模塊中:

Private Sub Workbook_BeforeClose(Cancel As Boolean) 
    MsgBox ("This message is being sent by Workbook_BeforeClose on data stored by Worksheet_Deactivate. Time = " _ 
      & TimeLastDeactivatedSheet1) 
End Sub 

Private Sub Workbook_WindowDeactivate(ByVal Wn As Window) 
    TimeLastDeactivatedSheet1 = Now 
    Call MsgBox("This message is being set by Workbook_WindowDeactivate. Time = " & TimeLastDeactivatedSheet1) 
End Sub 

保存然後在Excel中單擊工作簿中的工作簿,然後單擊其他工作表,然後關閉工作簿。您應該看到2條消息,其中第一條來自before close事件,顯示您取消工作表的時間以及由窗口停用事件觸發的nextr。

+0

當控件達到Workbook_BeforeClose本身時,變量得到重置。已經設置了斷點並驗證了相同。 – Raja

+0

@Raja你有沒有在編輯答案中的代碼運氣? –

+0

問題與變量範圍。此前它是公開的。將範圍更改爲全局後,它可以正常工作。 – Raja

相關問題