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

36

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

  • 2
    Это часто задаваемые вопросы по Access, и вы найдете mvps.org/Access важным источником ответов на часто задаваемые вопросы.
Теги:
access-vba
sleep

8 ответов

58
Лучший ответ
Declare Sub Sleep Lib "kernel32" Alias "Sleep" _
(ByVal dwMilliseconds As Long)

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

Sub Sleep()
Sleep 1000 'Implements a 1 second delay
End Sub 
  • 0
    Ааа, только что нашла это. Спасибо!
  • 1
    Я должен отметить, что в Excel 2007 я могу вызывать Sleep напрямую без оболочки VBA.
Показать ещё 1 комментарий
7

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

Dim started As Single: started = Timer

Do: DoEvents: Loop Until Timer - started >= 1
6

Для того, чтобы код работал, требуется несколько поправок. Код ниже - исправленная версия.

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

Sub SleepVBA() 
Sleep 1000 'Implements a 1 second delay 
End Sub 
5

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

    Sub Wait(seconds As Integer)
      Dim now As Long
      now = Timer()
      Do
          DoEvents
      Loop While (Timer < now + seconds)
    End Sub
  • 0
    Проблема с использованием этого метода заключается в том, что DoEvents в конечном итоге использует почти все процессорное время.
2

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

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

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

Call Excel.Application.Wait(Time:=DateAdd("s",10,Now()))
2

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

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

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

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

  • 0
    Это не работает в Access как есть
  • 0
    @ MAW74656 Достаточно справедливо; Я сказал в Excel, и я не проверял в Access. Вы говорите «как есть», знаете ли вы обходной путь?
Показать ещё 1 комментарий
1

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

Изображение 3772

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

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

1

Добавление

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

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

  • 1
    Единственная причина, по которой я могу думать о том, что добавление заголовка функции может вызвать «проблемы», заключается в том, что вы уже использовали имя функции «Sleep» в модуле или классе в текущем процессе.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню