我希望我的代码延迟1秒。下面是我试图延迟的代码。我认为它会轮询操作系统的日期和时间,并等到时间匹配。我有延迟的问题。我认为它不会轮询与等待时间匹配的时间,它只是坐在那里并冻结。它只会冻结我运行代码的大约5%的时间。我想知道Application.Wait以及是否有办法检查轮询时间是否大于等待时间。
newHour = Hour(Now())
newMinute = Minute(Now())
newSecond = Second(Now()) + 1
waitTime = TimeSerial(newHour, newMinute, newSecond)
Application.Wait waitTime
答案 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