首页 > 解决方案 > 如何通过 Workbook.Close 语句触发 OnTime 事件?

问题描述

看来,如果 OnTime 事件由程序化 MyBook.Close 语句注册,则 OnTime 永远不会运行。

此代码工作正常:

Sub TestOnTime()
          Application.OnTime Now + TimeValue("00:00:05"), "MySub"
End Sub


Sub MySub()
          Debug.Print "hello"
End Sub

运行 TestOnTime。MySub 将按预期执行。


这段代码运行良好:

本工作簿:

Dim WithEvents oApp As Application


Private Sub Workbook_Open()
          Set oApp = Application
End Sub


Private Sub oApp_WorkbookBeforeClose(ByVal Wb As Workbook, Cancel As Boolean)
          Application.OnTime Now + TimeValue("00:00:05"), "MySub"
End Sub

模块一:

Sub MySub()
          Debug.Print "hello"
End Sub
  1. 手动关闭另一个工作簿以触发 oApp_WorkbookBeforeClose。
  2. MySub 按预期执行。

但是这段代码失败了。OnTime 事件永远不会运行。

第一册

本工作簿:

Dim WithEvents oApp As Application


Private Sub Workbook_Open()
          Set oApp = Application
End Sub


Private Sub oApp_WorkbookBeforeClose(ByVal Wb As Workbook, Cancel As Boolean)
          Application.OnTime Now + TimeValue("00:00:05"), "MySub"
End Sub

模块一:

Sub MySub()
          Debug.Print "hello"
End Sub

书 2

模块一:

Sub Test()
          ThisWorkbook.Close
End Sub
  1. 运行Test以关闭 Book 2。
  2. Book 1 oApp_WorkbookBeforeClose 按预期执行。
  3. 但是 Book 1 MySub 事件永远不会运行。

为什么?

如果通过 Workbook_BeforeClose 事件注册,为什么 OnTime 不执行?即将关闭的书中没有代码正在运行。OnTime 对其他事件没有问题(例如,以编程方式打开工作簿)。不知何故,以编程方式关闭工作簿会破坏 OnTime。为什么?

标签: excelvbaontime

解决方案


由于第 2 册即将关闭,您应该在第 2 册中而不是在第 1 册中包含 Application.OnTime 过程

另外,我认为那些书应该保存一次,而不是新书。

Sub test()
Application.OnTime Now + TimeValue("00:00:05"), "Book 1.xlsm!MySub"
ThisWorkbook.Close
End Sub

编辑 7 月 6 日 -

您正在关闭工作簿,然后尝试MySub在 5 秒后在同一工作簿中运行宏。关闭工作簿后,同一工作簿中的宏将不会运行。应用程序将重新打开文件以运行宏。如果您想在关闭 5 秒后关闭 Book2,Thisworkbook那么 --

在本工作簿中

Private Sub Workbook_BeforeClose(Cancel As Boolean)
Application.OnTime Now + TimeValue("00:00:05"), "Book2.xlsm!Test"
End Sub

因此,在关闭之后Thisworkbook,Book2 中名为“Test”的宏将运行并关闭该工作簿。


推荐阅读