Как сделать паузу на определенное количество времени? (Excel/VBA)
У меня есть лист Excel, который имеет следующий макрос. Я бы хотел, чтобы цикл его каждую секунду, но висел, если я могу найти функцию, чтобы сделать это. Разве это невозможно?
Sub Macro1()
'
' Macro1 Macro
'
Do
Calculate
'Here I want to wait for one second
Loop
End Sub
12 ответов:
использовать подождите способ:
Application.Wait Now + #0:00:01#
или (для Excel 2010 и более поздних):
Application.Wait Now + #12:00:01 AM#
добавьте это в свой модуль
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
вместо:
Application.Wait(Now + #0:00:01#)
Я предпочитаю:
Application.Wait(Now + TimeValue("00:00:01"))
потому что это намного легче читать После этого.
это работает безупречно для меня. вставьте любой код до или после цикла "do until". В вашем случае поместите 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
объявление для сна в 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, который не имеет приложения.Функция ожидания.
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
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