VBA中的时序延迟

时间:2011-08-05 17:43:07

标签: vba timer wait pause timedelay

我希望我的代码延迟1秒。下面是我试图延迟的代码。我认为它会轮询操作系统的日期和时间,并等到时间匹配。我有延迟的问题。我认为它不会轮询与等待时间匹配的时间,它只是坐在那里并冻结。它只会冻结我运行代码的大约5%的时间。我想知道Application.Wait以及是否有办法检查轮询时间是否大于等待时间。

   newHour = Hour(Now())
   newMinute = Minute(Now())
   newSecond = Second(Now()) + 1
   waitTime = TimeSerial(newHour, newMinute, newSecond)
   Application.Wait waitTime

13 个答案:

答案 0 :(得分:36)

如果您使用的是Excel VBA,则可以使用以下内容。

Application.Wait(Now + TimeValue("0:00:01"))

(时间字符串应该看起来像H:MM:SS。)

答案 1 :(得分:23)

我将这个小功能用于VBA。

Public Function Pause(NumberOfSeconds As Variant)
    On Error GoTo Error_GoTo

    Dim PauseTime As Variant
    Dim Start As Variant
    Dim Elapsed As Variant

    PauseTime = NumberOfSeconds
    Start = Timer
    Elapsed = 0
    Do While Timer < Start + PauseTime
        Elapsed = Elapsed + 1
        If Timer = 0 Then
            ' Crossing midnight
            PauseTime = PauseTime - Elapsed
            Start = 0
            Elapsed = 0
        End If
        DoEvents
    Loop

Exit_GoTo:
    On Error GoTo 0
    Exit Function
Error_GoTo:
    Debug.Print Err.Number, Err.Description, Erl
    GoTo Exit_GoTo
End Function

答案 2 :(得分:11)

您可以在模块中复制它:

Sub WaitFor(NumOfSeconds As Long)
Dim SngSec as Long
SngSec=Timer + NumOfSeconds

Do while timer < sngsec
DoEvents
Loop

End sub

并且只要您想应用暂停写:

Call WaitFor(1)

我希望有所帮助!

答案 3 :(得分:6)

您是否尝试过睡眠?

有一个例子HERE(复制如下):

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Private Sub Form_Activate()    

frmSplash.Show
DoEvents
Sleep 1000
Unload Me
frmProfiles.Show

End Sub

请注意,它可能会冻结应用程序所选的时间。

答案 4 :(得分:2)

只要项目具有Microsoft Excel XX.X对象reference included,Access就可以始终使用Excel过程:

Call Excel.Application.Wait(DateAdd("s",10,Now()))

答案 5 :(得分:2)

Steve Mallorys的另一个变种回答,我特别需要excel在等待时运行并做一些事情,1秒钟太长了。

MySimpleProcessor<String> stringProcessor;             // will accept and return strings
MySimpleProcessor<Integer> intProcessor;               // will accept and return integers
MySimpleProcessor<AnotherComparable> anotherProcessor; // will operate on some other type

答案 6 :(得分:2)

计时器功能也适用于Access 2007,Access 2010,Access 2013,Access 2016,Access 2007开发人员,Access 2010开发人员,Access 2013开发人员。插入此代码以暂停一段时间的时间

T0 = Timer
Do
    Delay = Timer - T0
Loop Until Delay = 1 'Change this value to pause time in second

答案 7 :(得分:1)

您的代码仅创建没有日期的时间。如果你的假设是正确的,当它运行应用程序时。等待实际已经到达那个时间的时间它将等待24小时。我还担心多次调用now()(可能会有所不同?)我会将代码更改为

 application.wait DateAdd("s", 1, Now)

答案 8 :(得分:1)

我使用了Steve Mallory的答案,但是我很害怕计时器永远不会或者至少有时不会进入86400而且0(零)锐利(MS Access 2013)。所以我修改了代码。我将午夜条件更改为“如果计时器&gt; = 86399然后” 并添加了循环“Exit Do”的中断,如下所示:

Public Function Pause(NumberOfSeconds As Variant)
    On Error GoTo Error_GoTo

    Dim PauseTime As Variant
    Dim Start As Variant
    Dim Elapsed As Variant

    PauseTime = NumberOfSeconds
    Start = Timer
    Elapsed = 0
    Do While Timer < Start + PauseTime
        Elapsed = Elapsed + 1
        If Timer >= 86399
            ' Crossing midnight
            ' PauseTime = PauseTime - Elapsed
            ' Start = 0
            ' Elapsed = 0
            Exit Do
        End If
        DoEvents
    Loop

Exit_GoTo:
    On Error GoTo 0
    Exit Function
Error_GoTo:
    Debug.Print Err.Number, Err.Description, Erl
    GoTo Exit_GoTo
End Function

答案 9 :(得分:0)

在Windows计时器上返回百分之一秒...大多数人只是使用秒,因为在Macintosh平台上计时器返回整数。

答案 10 :(得分:0)

有了应有的信誉并感谢Steve Mallroy。

我在Word中遇到了午夜问题,下面的代码对我有用

Public Function Pause(NumberOfSeconds As Variant)
 '   On Error GoTo Error_GoTo

    Dim PauseTime, Start
    Dim objWord As Word.Document

    'PauseTime = 10 ' Set duration in seconds
    PauseTime = NumberOfSeconds
    Start = Timer ' Set start time.

    If Start + PauseTime > 86399 Then 'playing safe hence 86399

    Start = 0

    Do While Timer > 1
        DoEvents ' Yield to other processes.
    Loop

    End If

    Do While Timer < Start + PauseTime
        DoEvents ' Yield to other processes.
    Loop

End Function

答案 11 :(得分:0)

对于MS Access:启动具有Me.TimerInterval设置和Form_Timer事件处理程序的隐藏表单。将您要延迟的代码放入Form_Timer例程中-每次执行后退出例程。

例如:

where()

“您的代码在这里”将在打开表单30秒后执行,并在以后每次执行30秒后执行。

完成后关闭隐藏的表单。

答案 12 :(得分:0)

接受的答案中对午夜的处理是错误的。它测试 Timer = 0,这几乎永远不会发生。它应该改为测试 Timer < Start。另一个答案尝试更正 Timer >= 86399,但该测试也可能在速度较慢的计算机上失败。

下面的代码正确处理午夜(比 Timer < Start 稍微复杂一点)。它也是一个子函数,而不是函数,因为它不返回值,而变量是单个的,因为它们不需要是变体。

Public Sub pPause(nPauseTime As Single)

' Pause for nPauseTime seconds.

Dim nStartTime As Single, nEndTime As Single, _
    nNowTime As Single, nElapsedTime As Single

nStartTime = Timer()
nEndTime = nStartTime + nPauseTime

Do While nNowTime < nEndTime
    nNowTime = Timer()
    If (nNowTime < nStartTime) Then     ' Crossed midnight.
        nEndTime = nEndTime - nElapsedTime
        nStartTime = 0
      End If
    nElapsedTime = nNowTime - nStartTime
    DoEvents    ' Yield to other processes.
  Loop

End Sub