Подтвердить что ты не робот

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

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

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

Loop
End Sub
4b9b3361

Ответ 1

Используйте Метод ожидания:

Application.Wait Now + #0:00:01#

или (для Excel 2010 и более поздних версий):

Application.Wait Now + #12:00:01 AM#

Ответ 2

Добавьте это в свой модуль

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

Ответ 3

вместо использования:

Application.Wait(Now + #0:00:01#)

Я предпочитаю:

Application.Wait(Now + TimeValue("00:00:01"))

потому что после этого читать намного легче.

Ответ 4

это безупречно работает для меня. вставьте любой код до или после цикла "делать до". В вашем случае поставьте 5 строк (time1 = и time2 = и "do until" ) в конце внутри цикла do

sub whatever()
Dim time1, time2

time1 = Now
time2 = Now + TimeValue("0:00:01")
    Do Until time1 >= time2
        DoEvents
        time1 = Now()
    Loop

End sub

Ответ 5

Объявление для сна в файле 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

Ответ 6

Просто очищенная версия кода 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

Ответ 7

Application.Wait Second(Now) + 1

Ответ 8

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

Ответ 9

Вот альтернатива для сна:

Sub TDelay(delay As Long)
Dim n As Long
For n = 1 To delay
DoEvents
Next n
End Sub

В следующем коде я заставляю мигать эффект "свечения" на кнопке прокрутки, чтобы направить пользователей к ней, если у них "возникли проблемы", использование "sleep 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

Ответ 10

В большинстве представленных решений используется Application.Wait, который не учитывает время (миллисекунды), уже прошедшее с момента начала подсчета секунды, поэтому им присуща неточность до 1 секунды.

Подход с таймером является лучшим решением, но вы должны принять во внимание сброс в полночь, так что вот очень точный метод Sleep с использованием Timer:

'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

Ответ 11

Я сделал это, чтобы ответить на проблему:

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

Ответ 12

Я обычно использую функцию таймера, чтобы приостановить приложение. Вставьте этот код в свой

T0 = Timer
Do
    Delay = Timer - T0
Loop Until Delay >= 1 'Change this value to pause time for a certain amount of seconds

Ответ 13

Функции ожидания и сна блокируют Excel, и вы не можете больше ничего делать, пока не закончится задержка. С другой стороны, задержки Loop не дают вам точного времени ожидания.

Итак, я сделал этот обходной путь, объединив немного обе концепции. Он зацикливается, пока время не станет тем временем, которое вы хотите.

Private Sub Waste10Sec()
   target = (Now + TimeValue("0:00:10"))
   Do
       DoEvents 'keeps excel running other stuff
   Loop Until Now >= target
End Sub

Вам просто нужно позвонить в Waste10Sec, где вам нужна задержка

Ответ 14

Попробуйте следующее:

Threading.thread.sleep(1000)