0

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

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

4

1 回答 1

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 中单击您放入冷库的工作表,然后单击另一个工作表,然后关闭工作簿。您应该看到 2 条消息,第一条来自关闭前的事件,显示您解剖工作表的时间,而下一条则由 windows deactivate 事件触发。

于 2013-08-26T12:46:43.260 回答