使用VBA关闭Excel工作表的按钮事件

时间:2013-08-26 10:28:37

标签: vba excel-vba excel

想要在关闭Excel工作表的窗口时执行一些自定义代码。

我正在使用workbook_windowDeactivate。当控件调用函数时,VBA脚本变量中的值会被破坏。这是VBA的正常行为吗?在执行“workbook_windowDeactivate”之前,有没有办法将变量中的值进行零售?

1 个答案:

答案 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来测试正在重新录制的内容。放置代码的另一个地方是工作表对象,具体取决于您希望它如何工作:

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中保存工作簿,单击放入colde的工作表,然后单击另一个工作表,然后关闭工作簿。您应该看到2条消息,第一条来自关闭前事件,显示您取消工作表的时间和由Windows停用事件触发的nextr。