我正在使用Application.Ontime事件从单元格中提取时间字段,并计划在该时间运行一个子例程。MyApplication.Ontime事件在Workbook_BeforeSave事件上运行。因此,如果用户**(更改所需时间+保存工作簿)**多次,则会创建多个Application.Ontime事件。从理论上讲,我可以用一个唯一的时间变量来跟踪每个事件。但是有没有一种方法可以检查/解析/取消未决事件呢?
Private Sub Workbook_BeforeSave
SendTime = Sheets("Email").Range("B9")
Application.OnTime SendTime, "SendEmail"
End Sub
Private Sub Workbook_BeforeClose
Application.OnTime SendTime, "SendEmail", , False
End Sub
因此,如果我:
将B 9更改为12:01,保存工作簿
将B 9更改为12:03,保存工作簿
将B 9更改为12:05,保存工作簿
将B 9更改为12:07,保存工作簿
等等
我最终会触发多个事件。我只想激发一个事件(最近安排的事件)
如何取消Workbook_BeforeClose事件上的所有挂起事件(或至少枚举它们)?
5条答案
按热度按时间hof1towb1#
我不认为你可以遍历所有的未决事件,或者在一个shabang中取消它们。我建议设置一个模块级别或全局布尔值来指示是否触发事件。所以你会得到这样的结果:
编辑:
将其添加到工作表模块的顶部,其中包含包含您所需的日期/时间值的范围:
这是一个标准模块:
osh3o9ms2#
每次调用Application.Ontime时,保存事件设置为运行的时间(可以将其保存在工作表或模块作用域的动态数组中)
每次触发事件时,请删除相应的已保存时间
要取消所有挂起的事件,请在schedule = false的情况下调用Application.Ontime,遍历剩余的已保存时间
gr8qqesn3#
我想我可能有一个有效的解决方案,基于已经给出的一些建议。
简而言之,我们创建了一个全局数组,每次用户点击
save
时,SendTime都会写入该数组。这有助于跟踪我们所有的计划时间。当工作簿关闭时,我们循环遍历数组并删除所有计划的时间。
我测试了这个,它似乎在Excel 2003上工作。让我知道你进展如何。
kmb7vmvb4#
或者你可以创建一些单元格(如abacus),例如:
如果使用application.ontime:
如果我不想数的话
g6ll5ycj5#
我不知道我是否错过了什么,但为什么不在开始新的呼叫之前取消一个呼叫呢?
SendTime
是全局变量这会导致在任何给定时间只运行一个Call--如果我对这个问题的理解是正确的,那就是期望的行为。