Есть ли в VBA эквивалент Thread.Sleep () - PullRequest
43 голосов
/ 22 января 2009

Есть ли эквивалент в Thread.Sleep() в Access VBA?

Ответы [ 8 ]

62 голосов
/ 22 января 2009
Declare Sub Sleep Lib "kernel32" Alias "Sleep" _
(ByVal dwMilliseconds As Long)

Используйте следующий синтаксис для вызова функции Sleep:

Sub Sleep()
Sleep 1000 'Implements a 1 second delay
End Sub 
8 голосов
/ 18 октября 2011

Другой способ без использования kernel32:

Dim started As Single: started = Timer

Do: DoEvents: Loop Until Timer - started >= 1
6 голосов
/ 10 ноября 2010

Для исправления кода требуется пара поправок. Код ниже является исправленной версией.

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

Sub SleepVBA() 
Sleep 1000 'Implements a 1 second delay 
End Sub 
5 голосов
/ 16 января 2014

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

    Sub Wait(seconds As Integer)
      Dim now As Long
      now = Timer()
      Do
          DoEvents
      Loop While (Timer < now + seconds)
    End Sub
2 голосов
/ 01 декабря 2016

Если вы используете Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long), вы можете получить эту ошибку в объектном модуле.

enter image description here

Если это так, вы можете объявить его закрытым:

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

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

Можно использовать процедуру Excel Wait () из Access VBA.

Первый шаг - обеспечить ссылку на библиотеку Excel из вашего проекта.

Когда это будет сделано, следующий код будет работать в течение десяти секунд:

Call Excel.Application.Wait(Time:=DateAdd("s",10,Now()))
2 голосов
/ 01 марта 2012

Я использую это в Excel, и он прекрасно работает:

Application.Wait DateAdd("s", 1, Now())

DateAdd () - это функция, которая устанавливает время относительно Now() (в этом случае - вы можете использовать другие значения в качестве аргумента), "s" - это мера времени (в данном случае секунды), и инкремент равен 1. Итак, вызов функции сообщает приложению, что нужно подождать 1 секунду.

См. Также для получения более подробной информации об использовании функции DateAdd.

1 голос
/ 20 октября 2011

Добавление

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

каким-то образом создал дополнительные проблемы где-то еще в моем коде. Я использовал эту функцию, которую нашел на другом форуме, и немного подправил:

Function WaitTime(n As Double)
'Function that wait an amount of time n in seconds
TWait = Time
TWait = DateAdd("s", n, TWait)
Do Until TNow >= TWait
     TNow = Time
Loop
End Function

надеюсь, это поможет:)

...