Как сделать паузу на определенное количество времени? (Excel/VBA)


У меня есть лист Excel, который имеет следующий макрос. Я бы хотел, чтобы цикл его каждую секунду, но висел, если я могу найти функцию, чтобы сделать это. Разве это невозможно?

Sub Macro1()
'
' Macro1 Macro
'
Do
    Calculate
    'Here I want to wait for one second

Loop
End Sub
12 83

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

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

попробуйте это :

Threading.thread.sleep(1000)