如何让Application.OnTime指定的宏仅执行一次?避免重复触发
解决Worksheet_Activate重复设置OnTime导致宏多次执行的问题
核心思路是用全局变量记录已设置的定时时间,避免每次激活工作表时重复创建定时任务。
步骤1:声明全局变量
在Excel的标准模块(右键插入→模块)中添加以下代码,用来存储已设置的定时时间:
Public g_scheduledTime As Date
步骤2:修改Worksheet_Activate事件代码
在目标工作表的代码模块中,替换原有的OnTime设置代码为以下内容:
Private Sub Worksheet_Activate() Dim targetTime As Date targetTime = TimeValue("20:50:12") ' 仅在未设置过该定时、且当前时间早于目标时间时执行设置 If g_scheduledTime <> targetTime And Time < targetTime Then ' 先取消之前可能存在的无效定时(防止残留旧任务) On Error Resume Next Application.OnTime EarliestTime:=g_scheduledTime, Procedure:="MyMacro", Schedule:=False On Error GoTo 0 ' 保存当前定时时间并设置新任务 g_scheduledTime = targetTime Application.OnTime EarliestTime:=targetTime, Procedure:="MyMacro" End If End Sub
关键说明
- 全局变量
g_scheduledTime会在设置定时后记录目标时间,后续激活工作表时会对比该值,避免重复设置 - 加入
Time < targetTime判断,确保过了20:50:12后不会再创建新的定时任务 - 错误处理语句用来避免在没有已设置定时的情况下执行取消操作时抛出错误
内容的提问来源于stack exchange,提问作者Alan Tingey
相关产品推荐
相关产品推荐

