【发布时间】:2021-01-19 17:33:29
【问题描述】:
我正在 Excel 上使用 Visual Basic 应用程序。我有一个宏,它应该在一段时间后执行。我想同时用计时器跟踪等待时间。 我创建了一个附加模块,其中具有以下功能:
Public Sub start_time()
Application.OnTime Now + TimeValue("00:00:01"), "next_moment"
End Sub
Public Sub end_time()
Application.OnTime Now + TimeValue("00:00:01"), "next_moment", , False
End Sub
Public Sub next_moment()
If Worksheets("Messwerte").Range("A1").Value = 0 Then Exit Sub
Worksheets("Messwerte").Range("A1").Value = Worksheets("Messwerte").Range("A1").Value - TimeValue("00:00:01")
start_time
End Sub
我在单元格 Worksheets("Messwerte").Range("A1").Value 中有我的计时器。 我的代码结构现在如下:
For循环
代码块 1
调用 start_time #Waiting 应该在这里应用
代码块 2
结束 For 循环
我现在的问题是计时器在 start_time 开始,但代码块 2 也开始了。我想要我的计时器,当我的计时器显示“00:00:00”时,代码块 2 应该启动。
在论坛上,我刚刚找到了解决方案,要么设置计时器,要么等到代码继续执行,但两者都不能像我想要的那样工作。 有人对此有解决方案吗?
谢谢
【问题讨论】:
-
OnTime的一个优点是它是“非阻塞的”(在您等待它触发时可能会发生其他事情)不幸的是,这意味着您的代码不会等待进程完成- 它调用start_time,然后立即继续。 -
要解决这个问题,您需要缓存循环的状态(例如,将计数器存储在全局或静态变量中)并有一个可调用的入口点,当计时器计时时可以调用该入口点以继续循环过期。没有看到实际的循环代码很难提出具体的建议。
-
我以前从未使用过 OnTime,所以请注意它可能与 Application.Wait 有相同的怪癖,即:等待 1 秒,具体取决于它的毫秒数被触发,将从(非常接近)0 开始等待,最多 1 秒。详情见How to pause。有关更精细的控制,请参阅该链接中的“睡眠”。另外,我认为 Wait 和 Sleep 都 do “阻塞”。