【问题标题】:VBA Excel: Macro should start after timer expiresVBA Excel:宏应在计时器到期后启动
【发布时间】: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 “阻塞”。

标签: excel vba timer


【解决方案1】:

我找到了一个不干净的解决方案,但它确实有效。希望它可以帮助你。
我创建了一个函数,它是一个布尔值,当定时器为 0 时变为 false。

Public Function Check_Time() As Boolean
    If Sheets("Timer_Tabular").Range("Timer_Position").Value = 0 Then
        Check_Time = False
    Else
        Check_Time = True
    End If
End Function

代码结构如下:

#Code before the waiting
Dim Waiting as Boolean
Waiting = True

'Wait until timer is zero
 Do While Waiting
    If Check_Time() = True Then
    'Enables working on excel while doing nothing.
       DoEvents
    ElseIf Check_Time() = False Then
       Waiting = False
       Exit Do
    End If
 Loop
#Code Block, which is executed after waiting time.

因此,此时宏在 while 循环内被捕获,当计时器为 0 时,while 循环中断。DoEvents “解冻” excel 屏幕。
最终结果是:宏代码停止运行,但定时器继续运行。如果计时器为 0,则代码将继续。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多