首页 > 解决方案 > VBA Excel:宏应在计时器到期后启动

问题描述

我正在使用 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 Loop
代码块 1
调用 start_time #Waiting 应该在这里应用
代码块 2
结束 For 循环

我现在的问题是计时器从 start_time 开始,但代码块 2 也开始了。我想要我的计时器,当我的计时器显示“00:00:00”时,代码块 2 应该启动。

在论坛上,我刚刚找到了解决方案,要么设置计时器,要么等到代码继续执行,但不能像我想要的那样工作。有人对此有解决方案吗?

谢谢

标签: excelvbatimer

解决方案


我找到了一个不干净的解决方案,但它确实有效。希望它可以帮助你。
我创建了一个函数,它是一个布尔值,当计时器为 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,则代码将继续。


推荐阅读