VBA中的时序延迟

Lag*_*ter 17 vba timedelay timer wait pause

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

   newHour = Hour(Now())
   newMinute = Minute(Now())
   newSecond = Second(Now()) + 1
   waitTime = TimeSerial(newHour, newMinute, newSecond)
   Application.Wait waitTime
Run Code Online (Sandbox Code Playgroud)

The*_*ler 36

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

Application.Wait(Now + TimeValue("0:00:01"))
Run Code Online (Sandbox Code Playgroud)

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

  • 标签上写着VBA,它不包括Excel.MS Access中没有等待,也可能是许多使用VBA的其他应用程序. (7认同)
  • 我认为答案的基调应该归咎于评论的否定性. (4认同)
  • 无论哪种方式,OP仍然使用Wait方法,因此他可以访问它,不管他在哪里,他有`Application.Wait`并且这比那些更高的投票答案简单得多了 (3认同)
  • 哇,你是对的,我道歉.我不知道为什么我在想Excel.也许是因为我从Excel帮助中识别了原始代码.好吧无论如何,希望看到这一点的任何人都会发现它至少在Excel中实现起来很简单.我不知道为什么他们没有在Access中实现它..但你是对的我也遇到了这个问题. (2认同)
  • 我并不是居高临下,只是对复杂方法的一般批评,而不是研究已经存在的方法。节省大量时间和精力。 (2认同)

Ste*_*ory 24

我将这个小功能用于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
Run Code Online (Sandbox Code Playgroud)

  • 计时器在午夜变为0(并且永远不会超过86400).因此,如果此函数在午夜左右执行,它将永久执行或直到用户中断.(学得很难.) (5认同)

Fin*_*ist 12

您可以在模块中复制它:

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

Do while timer < sngsec
DoEvents
Loop

End sub
Run Code Online (Sandbox Code Playgroud)

每当你想应用暂停写:

Call WaitFor(1)
Run Code Online (Sandbox Code Playgroud)

我希望有所帮助!


Tia*_*oso 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
Run Code Online (Sandbox Code Playgroud)

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

  • 这可能是其他所有实现的内幕.适用于Win32 API的+1. (2认同)

小智 5

只要项目包含 Microsoft Excel XX.X 对象引用,Access 就始终可以使用 Excel 过程:

Call Excel.Application.Wait(DateAdd("s",10,Now()))
Run Code Online (Sandbox Code Playgroud)