Ответы:
Используйте метод ожидания :
Application.Wait Now + #0:00:01#
или (для Excel 2010 и новее):
Application.Wait Now + #12:00:01 AM#
Application.Wait(Now + #0:00:01#)
чище : Ура!
Application.Wait (Now + TimeValue("0:00:01"))
Application.wait(now + 1e-5)
секунду, Application.wait(now + 0.5e-5)
полсекунды и т. Д.
Добавьте это в свой модуль
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Или для 64-битных систем используйте:
Public Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr)
Назовите это в своем макросе так:
Sub Macro1()
'
' Macro1 Macro
'
Do
Calculate
Sleep (1000) ' delay 1 second
Loop
End Sub
Sleep()
позволяет указать время ожидания менее 1 секунды. Application.Wait
иногда бывает слишком гранулированным.
Public Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr)
Вместо того, чтобы использовать:
Application.Wait(Now + #0:00:01#)
я предпочитаю:
Application.Wait(Now + TimeValue("00:00:01"))
потому что после этого читать намного легче.
у меня это работает безупречно. вставьте любой код до или после цикла «делать до». В вашем случае поместите 5 строк (time1 = & time2 = & "do until" loop) в конец внутри цикла do
sub whatever()
Dim time1, time2
time1 = Now
time2 = Now + TimeValue("0:00:01")
Do Until time1 >= time2
DoEvents
time1 = Now()
Loop
End sub
Timer
потому что этот Timer
подход не работает незадолго до полуночи.
Объявление Sleep в kernel32.dll не будет работать в 64-битном Excel. Это было бы немного более общим:
#If VBA7 Then
Public Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
#Else
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
#End If
Просто очищенная версия кода clemo - работает в Access, в котором нет функции Application.Wait.
Public Sub Pause(sngSecs As Single)
Dim sngEnd As Single
sngEnd = Timer + sngSecs
While Timer < sngEnd
DoEvents
Wend
End Sub
Public Sub TestPause()
Pause 1
MsgBox "done"
End Sub
Timer
дает количество секунд, прошедших с полуночи, то этот подход не работает, если он выполняется непосредственно перед полуночью (т. sngEnd
Е. Когда> = 86 400). В полночь Timer
сбрасывается до 0 и, таким образом, остается меньше, чем sngEnd
навсегда.
Большинство представленных решений используют Application.Wait, которое не учитывает время (в миллисекундах), уже прошедшее с момента начала текущего подсчета секунд, поэтому они имеют внутреннюю неточность до 1 секунды .
Подход с использованием таймера - лучшее решение , но вы должны учитывать сброс в полночь, поэтому вот очень точный метод сна с использованием таймера:
'You can use integer (1 for 1 second) or single (1.5 for 1 and a half second)
Public Sub Sleep(vSeconds As Variant)
Dim t0 As Single, t1 As Single
t0 = Timer
Do
t1 = Timer
If t1 < t0 Then t1 = t1 + 86400 'Timer overflows at midnight
DoEvents 'optional, to avoid excel freeze while sleeping
Loop Until t1 - t0 >= vSeconds
End Sub
ИСПОЛЬЗУЙТЕ ЭТО ДЛЯ ПРОВЕРКИ ЛЮБОЙ ФУНКЦИИ СНА: (открыть окно немедленной отладки: CTRL + G)
Sub testSleep()
t0 = Timer
Debug.Print "Time before sleep:"; t0 'Timer format is in seconds since midnight
Sleep (1.5)
Debug.Print "Time after sleep:"; Timer
Debug.Print "Slept for:"; Timer - t0; "seconds"
End Sub
Application.Wait Second(Now) + 1
Function Delay(ByVal T As Integer)
'Function can be used to introduce a delay of up to 99 seconds
'Call Function ex: Delay 2 {introduces a 2 second delay before execution of code resumes}
strT = Mid((100 + T), 2, 2)
strSecsDelay = "00:00:" & strT
Application.Wait (Now + TimeValue(strSecsDelay))
End Function
Вот альтернатива сну:
Sub TDelay(delay As Long)
Dim n As Long
For n = 1 To delay
DoEvents
Next n
End Sub
В следующем коде я заставляю мигать эффект «свечения» на кнопке вращения, чтобы направлять пользователей к нему, если у них «проблемы», использование «сна 1000» в цикле не привело к видимому миганию, но цикл работает отлично.
Sub SpinFocus()
Dim i As Long
For i = 1 To 3 '3 blinks
Worksheets(2).Shapes("SpinGlow").ZOrder (msoBringToFront)
TDelay (10000) 'this makes the glow stay lit longer than not, looks nice.
Worksheets(2).Shapes("SpinGlow").ZOrder (msoSendBackward)
TDelay (100)
Next i
End Sub
я сделал это, чтобы ответить на проблему:
Sub goTIMER(NumOfSeconds As Long) 'in (seconds) as: call gotimer (1) 'seconds
Application.Wait now + NumOfSeconds / 86400#
'Application.Wait (Now + TimeValue("0:00:05")) 'other
Application.EnableEvents = True 'EVENTS
End Sub
Я обычно использую функцию таймера, чтобы приостановить приложение. Вставьте этот код в свой
T0 = Timer
Do
Delay = Timer - T0
Loop Until Delay >= 1 'Change this value to pause time for a certain amount of seconds
Timer
дает количество секунд с полуночи, то этот подход не работает, если он выполняется непосредственно перед полуночью (то есть так, что T0
меньше, чем количество секунд задержки от полуночи). В полночь Timer
сбрасывается на 0 до того, как будет достигнут предел задержки. Delay
никогда не достигает предела задержки, поэтому цикл выполняется бесконечно.
Loop Until Delay >= 1
, иначе вы рискуете превысить 1 и никогда не выйти из цикла.
Функции ожидания и сна блокируют Excel, и вы не можете ничего делать, пока не закончится задержка. С другой стороны, задержка цикла не дает вам точного времени ожидания.
Итак, я сделал это обходное решение, объединив немного обеих концепций. Он повторяется до тех пор, пока время не станет нужным вам.
Private Sub Waste10Sec()
target = (Now + TimeValue("0:00:10"))
Do
DoEvents 'keeps excel running other stuff
Loop Until Now >= target
End Sub
Вам просто нужно позвонить в Waste10Sec, где вам нужна задержка
Вы можете использовать Application.wait now + timevalue ("00:00:01") или Application.wait now + timeserial (0,0,1)
DoEvents
как показано