Сроки задержки в VBA - PullRequest
       53

Сроки задержки в VBA

16 голосов
/ 05 августа 2011

Я бы хотел 1 секунду задержки в моем коде. Ниже приведен код, который я пытаюсь сделать с этой задержкой. Я думаю, что он опрашивает дату и время выключения операционной системы и ждет, пока время не совпадет. У меня проблема с задержкой. Я думаю, что это не опрашивает время, когда это соответствует времени ожидания, и это просто сидит там и замирает. Это только замораживает около 5% времени, когда я запускаю код. Мне было интересно узнать о Application.Wait и есть ли способ проверить, больше ли время опроса, чем время ожидания.

   newHour = Hour(Now())
   newMinute = Minute(Now())
   newSecond = Second(Now()) + 1
   waitTime = TimeSerial(newHour, newMinute, newSecond)
   Application.Wait waitTime

Ответы [ 12 ]

36 голосов
/ 26 сентября 2011

Если вы находитесь в Excel VBA, вы можете использовать следующее.

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

(Строка времени должна выглядеть как Ч: ММ: СС.)

23 голосов
/ 05 августа 2011

Я использую эту маленькую функцию для VBA.

Public Function Pause(NumberOfSeconds As Variant)
    On Error GoTo Error_GoTo

    Dim PauseTime As Variant
    Dim Start As Variant
    Dim Elapsed As Variant

    PauseTime = NumberOfSeconds
    Start = Timer
    Elapsed = 0
    Do While Timer < Start + PauseTime
        Elapsed = Elapsed + 1
        If Timer = 0 Then
            ' Crossing midnight
            PauseTime = PauseTime - Elapsed
            Start = 0
            Elapsed = 0
        End If
        DoEvents
    Loop

Exit_GoTo:
    On Error GoTo 0
    Exit Function
Error_GoTo:
    Debug.Print Err.Number, Err.Description, Erl
    GoTo Exit_GoTo
End Function
11 голосов
/ 05 августа 2011

Вы можете скопировать это в модуль:

Sub WaitFor(NumOfSeconds As Long)
Dim SngSec as Long
SngSec=Timer + NumOfSeconds

Do while timer < sngsec
DoEvents
Loop

End sub

и всякий раз, когда вы хотите применить паузу, пишите:

Call WaitFor(1)

Надеюсь, это поможет!

6 голосов
/ 05 августа 2011

Вы пытались использовать сон?

Вот пример ЗДЕСЬ (скопировано ниже):

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Private Sub Form_Activate()    

frmSplash.Show
DoEvents
Sleep 1000
Unload Me
frmProfiles.Show

End Sub

Обратите внимание, что приложение может замораживаться на выбранный период времени.

2 голосов
/ 03 июля 2016

Функция Таймер также применяется к Access 2007, Access 2010, Access 2013, Access 2016, Access 2007 Developer, Access 2010 Developer, Access 2013 Developer. Вставьте этот код, чтобы приостановить время на определенное количество секунд

T0 = Timer
Do
    Delay = Timer - T0
Loop Until Delay = 1 'Change this value to pause time in second
2 голосов
/ 19 августа 2015

Еще один вариант ответа Стива Мэллориса, мне специально нужно было, чтобы Excel разбежался и что-то делал во время ожидания, а 1 секунда была слишком длинной.

'Wait for the specified number of milliseconds while processing the message pump
'This allows excel to catch up on background operations
Sub WaitFor(milliseconds As Single)

    Dim finish As Single
    Dim days As Integer

    'Timer is the number of seconds since midnight (as a single)
    finish = Timer + (milliseconds / 1000)
    'If we are near midnight (or specify a very long time!) then finish could be
    'greater than the maximum possible value of timer. Bring it down to sensible
    'levels and count the number of midnights
    While finish >= 86400
        finish = finish - 86400
        days = days + 1
    Wend

    Dim lastTime As Single
    lastTime = Timer

    'When we are on the correct day and the time is after the finish we can leave
    While days >= 0 And Timer < finish
        DoEvents
        'Timer should be always increasing except when it rolls over midnight
        'if it shrunk we've gone back in time or we're on a new day
        If Timer < lastTime Then
            days = days - 1
        End If
        lastTime = Timer
    Wend

End Sub
2 голосов
/ 11 февраля 2014

Access всегда может использовать процедуру Excel, если в проекте имеется объект Microsoft Excel XX.X ссылка включена :

Call Excel.Application.Wait(DateAdd("s",10,Now()))
1 голос
/ 01 мая 2015

Я использовал ответ Стива Мэллори, но я боюсь, что таймер никогда или, по крайней мере, иногда не идет к 86400 или 0 (ноль) резких (MS Access 2013). Поэтому я изменил код. Я изменил условие полуночи на «If Timer> = 86399 Тогда» и добавил разрыв цикла «Выход из Do» следующим образом:

Public Function Pause(NumberOfSeconds As Variant)
    On Error GoTo Error_GoTo

    Dim PauseTime As Variant
    Dim Start As Variant
    Dim Elapsed As Variant

    PauseTime = NumberOfSeconds
    Start = Timer
    Elapsed = 0
    Do While Timer < Start + PauseTime
        Elapsed = Elapsed + 1
        If Timer >= 86399
            ' Crossing midnight
            ' PauseTime = PauseTime - Elapsed
            ' Start = 0
            ' Elapsed = 0
            Exit Do
        End If
        DoEvents
    Loop

Exit_GoTo:
    On Error GoTo 0
    Exit Function
Error_GoTo:
    Debug.Print Err.Number, Err.Description, Erl
    GoTo Exit_GoTo
End Function
1 голос
/ 05 августа 2011

Ваш код создает только время без даты. Если ваше предположение верно, что при запуске приложения. Дождитесь времени, которое фактически уже достигло этого времени, оно будет ждать ровно 24 часа. Я также немного беспокоюсь о вызове now () несколько раз (может быть по-другому?) Я бы изменил код на

 application.wait DateAdd("s", 1, Now)
0 голосов
/ 06 декабря 2018

Для MS Access: Запустите скрытую форму с установленным Me.TimerInterval и обработчиком события Form_Timer. Поместите ваш код с задержкой в ​​подпрограмму Form_Timer - выход из подпрограммы после каждого выполнения.

например:.

Private Sub Form_Load()
    Me.TimerInterval = 30000 ' 30 sec
End Sub

Private Sub Form_Timer()

    Dim lngTimerInterval  As Long: lngTimerInterval = Me.TimerInterval

    Me.TimerInterval = 0

    '<Your Code goes here>

    Me.TimerInterval = lngTimerInterval
End Sub

«Ваш код идет сюда» будет выполнен через 30 секунд после открытия формы и через 30 секунд после каждого последующего выполнения.

Закройте скрытую форму, когда закончите.

...