Відповіді:
Використовуйте метод Wait :
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 do" цикл) в кінці всередині циклу 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
підхід не вдається лише перед півночі.
Декларація про сон у 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 зараз + timevalue ("00:00:01") або Application.cait now + timeserial (0,0,1)
DoEvents
як тут призначалася dailydoseofexcel.com/archives/2005/06/14/stopwatch