如何通过 Workbook.Close 语句触发 OnTime 事件?
How to Fire OnTime Event by a Workbook.Close Statement?
看来,如果 OnTime 事件是由程序化 MyBook.Close 语句注册的,则 OnTime 永远不会运行。
这段代码工作正常:
Sub TestOnTime()
Application.OnTime Now + TimeValue("00:00:05"), "MySub"
End Sub
Sub MySub()
Debug.Print "hello"
End Sub
运行 测试时间。 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
模块 1:
Sub MySub()
Debug.Print "hello"
End Sub
- 手动关闭另一个工作簿以触发 oApp_WorkbookBeforeClose。
- MySub 按预期执行。
但是这段代码失败了。 OnTime 事件从不运行。
第 1 本书
本工作簿:
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
模块 1:
Sub MySub()
Debug.Print "hello"
End Sub
第 2 本书
模块 1:
Sub Test()
ThisWorkbook.Close
End Sub
- 运行
Test
结束第 2 册。
- 第 1 本书 oApp_WorkbookBeforeClose
按预期执行。
- 但是第 1 册 MySub 事件从未运行过。
为什么?
如果由 Workbook_BeforeClose 事件注册,为什么 OnTime 不执行?正在关闭的书中没有代码 运行。 OnTime 对其他事件没有问题(例如,以编程方式打开工作簿)。不知何故,以编程方式关闭工作簿 会中断 OnTime。为什么?
由于第 2 册即将结束,您应该在第 2 册而不是第 1 册中包含 Application.OnTime 过程
另外,我认为那些书应该保存一次,而不是新书。
Sub test()
Application.OnTime Now + TimeValue("00:00:05"), "Book 1.xlsm!MySub"
ThisWorkbook.Close
End Sub
编辑 7 月 6 日 -
您正在关闭工作簿,然后您在 5 秒后尝试 运行 同一工作簿中的宏 MySub
。同一工作簿中的宏不会 运行 一旦书关闭。应用程序将重新打开文件以 运行 宏。如果您想在关闭 Thisworkbook
5 秒后关闭 Book2,那么 --
在本手册中
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Application.OnTime Now + TimeValue("00:00:05"), "Book2.xlsm!Test"
End Sub
因此,在关闭 Thisworkbook
后,Book2 中名为“Test”的宏将 运行 并关闭该工作簿。
看来,如果 OnTime 事件是由程序化 MyBook.Close 语句注册的,则 OnTime 永远不会运行。
这段代码工作正常:
Sub TestOnTime()
Application.OnTime Now + TimeValue("00:00:05"), "MySub"
End Sub
Sub MySub()
Debug.Print "hello"
End Sub
运行 测试时间。 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
模块 1:
Sub MySub()
Debug.Print "hello"
End Sub
- 手动关闭另一个工作簿以触发 oApp_WorkbookBeforeClose。
- MySub 按预期执行。
但是这段代码失败了。 OnTime 事件从不运行。
第 1 本书
本工作簿:
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
模块 1:
Sub MySub()
Debug.Print "hello"
End Sub
第 2 本书
模块 1:
Sub Test()
ThisWorkbook.Close
End Sub
- 运行
Test
结束第 2 册。 - 第 1 本书 oApp_WorkbookBeforeClose 按预期执行。
- 但是第 1 册 MySub 事件从未运行过。
为什么?
如果由 Workbook_BeforeClose 事件注册,为什么 OnTime 不执行?正在关闭的书中没有代码 运行。 OnTime 对其他事件没有问题(例如,以编程方式打开工作簿)。不知何故,以编程方式关闭工作簿 会中断 OnTime。为什么?
由于第 2 册即将结束,您应该在第 2 册而不是第 1 册中包含 Application.OnTime 过程
另外,我认为那些书应该保存一次,而不是新书。
Sub test()
Application.OnTime Now + TimeValue("00:00:05"), "Book 1.xlsm!MySub"
ThisWorkbook.Close
End Sub
编辑 7 月 6 日 -
您正在关闭工作簿,然后您在 5 秒后尝试 运行 同一工作簿中的宏 MySub
。同一工作簿中的宏不会 运行 一旦书关闭。应用程序将重新打开文件以 运行 宏。如果您想在关闭 Thisworkbook
5 秒后关闭 Book2,那么 --
在本手册中
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Application.OnTime Now + TimeValue("00:00:05"), "Book2.xlsm!Test"
End Sub
因此,在关闭 Thisworkbook
后,Book2 中名为“Test”的宏将 运行 并关闭该工作簿。