Excel VBA:Application.OnTime未正确执行

Excel VBA:Application.OnTime未正确执行,excel,timer,ontime,vba,Excel,Timer,Ontime,Vba,我试图在很短的时间间隔内运行某个宏,例如从某个时间点到某个时间点的每秒钟。这意味着我需要一个起点和一个截止点。我无法使用工作簿\u Open()事件,因为在打开工作簿后的不同时间已经有其他宏触发 我用来每秒触发一次宏的基本行是以下psuedocode: Application.OnTime Now + TimeValue("00:00:01"), "Path to Macro" 从我目前的实验来看,我所做的任何尝试最终都有两个结果。在第一种情况下,它从我打开工作簿的那一刻开始运行,并以每秒一次

我试图在很短的时间间隔内运行某个宏,例如从某个时间点到某个时间点的每秒钟。这意味着我需要一个起点和一个截止点。我无法使用
工作簿\u Open()事件
,因为在打开工作簿后的不同时间已经有其他宏触发

我用来每秒触发一次宏的基本行是以下psuedocode:

Application.OnTime Now + TimeValue("00:00:01"), "Path to Macro"
从我目前的实验来看,我所做的任何尝试最终都有两个结果。在第一种情况下,它从我打开工作簿的那一刻开始运行,并以每秒一次的适当时间表运行。然而,第一个案例并不理想,因为我需要它在启动前等待一段时间。在第二种情况下,它在我希望它启动的时候运行——但它只运行了一次,这也是我不希望发生的

总结如下:


我需要一些类似代码行的东西,以便在工作簿打开15分钟后开始运行,并在3小时后停止。

从工作簿打开时还启动了哪些其他计时宏,为什么这些宏会产生干扰?听起来你在不必要地限制自己。以下是如何解决这个问题:

工作簿\u open应使用application.ontime调用常规函数do\u timed\u事件。do_timed_events函数应在每次运行时使用application.ontime重新添加自身。它还应该跟踪国家的情况。对于前几次运行,它应该执行其他特定任务,然后等待15分钟,然后开始执行每秒钟一次的任务

下面是一些伪代码:

private var do_timed_events_state as string
sub do_timed_events
   if do_timed_events_state = "" then
      do_task_1(arg1,arg2)
      do_timed_events_state = "task_2"
      Application.OnTime Now + TimeValue("00:00:01"), "do_timed_events"
   elseif do_timed_events_state = "task_2" then
      do_timed_events_state = "repeating_task"
      Application.OnTime Now + TimeValue("00:00:01"), "do_timed_events"
   elseif do_timed_events_state = "repeating_task" then
      Application.OnTime Now + TimeValue("00:00:01"), "do_timed_events"
   end if
end sub

在这个问题上,你可能会想出一个比我更好的设计。

非常感谢K.罗宾逊,这是一个很好的解决方案,我将在周末后实施,但它似乎很有意义。我必须说我完全忘记了使用一个调用自身的例程。我上次处理代码已经有一段时间了。再次感谢你。我喜欢这个网站!