Vba задержка времени: Программирование на VBA в Excel паузы в 3 секунды

VBA Excel. Функция Timer (примеры)

Применение функции Timer в VBA Excel для приостановки выполнения приложений и определения времени работы процедур. Примеры использования.

1.
Описание функции Timer

2.
Примеры использования в VBA Excel

Описание функции Timer

Timer – это функция без аргументов, которая возвращает количество секунд, прошедших после полночи. Значение типа Single.

На сайте разработчика сказано, что в Windows функция Timer возвращает дробные части секунды. О порядке дробной части там информации нет. Попробуем выяснить это сами, запустив в редакторе VBA Excel подпрограмму со строкой

MsgBox «Timer = » & Timer

Исходя из результата, отображенного в информационном окне MsgBox, будем считать, что функция Timer возвращает сотые доли секунды. Во время экспериментов с процедурой Vremya из Примера 2 результат вычисления разницы между двумя значениями функции Timer достигал шести знаков после запятой, и один раз – семи.

Примеры использования в VBA Excel

Пример 1
Присвоение значения функции Timer переменной:

Dim x As Single

x = Timer

Пример 2
Код VBA Excel для приостановки приложений:

1

2

3

4

5

6

Dim Start As Single, Pause As Single

Start = Timer

Pause = 0.5

Do While Timer < Start + Pause

   DoEvents

Loop

  • Start – переменная, в которую записывается первоначальное значение таймера.
  • Pause – время в секундах (до сотых значений), на которое следует приостановить программу.

Функция DoEvents во время выполнения цикла передает управление операционной системе для обработки других событий. По рекомендации разработчиков не следует использовать DoEvents в тех случаях, когда

  • приостановленная процедура может быть запущена повторно из другой части вашего кода;
  • другие приложения могут обратиться к приостановленной процедуре.

Код для приостановки приложений можно использовать как отдельную подпрограмму, вставляя ее имя с указанием интервала в нужные места других процедур:

1

2

3

4

5

6

7

Sub StopSub(Pause As Single)

Dim Start As Single

Start = Timer

Do While Timer < Start + Pause

   DoEvents

Loop

End Sub

Проверяем работоспособность подпрограммы StopSub:

1

2

3

4

5

6

Sub Vremya()

Dim x As Single

x = Timer

Call StopSub (3)

MsgBox Timer — x

End Sub

Точный или почти точный результат будет только при использовании в качестве аргумента целых секунд, в том числе и в примере кода, предложенного разработчиком.

Такой способ приостановки приложений можно использовать в VBA Excel при создании бегущей строки.

Пример 3
Функцию Timer можно использовать для замера времени работы процедуры. Мы ее уже использовали для определения времени выполнения подпрограммы StopSub:

1

2

3

4

5

6

Sub Vremya()

Dim x As Single

x = Timer

Call MySub

MsgBox Timer — x

End Sub

Замените MySub на имя вашей подпрограммы и запустите код в редакторе VBA Excel. Информационное окно MsgBox покажет время работы процедуры.


Содержание рубрики VBA Excel по тематическим разделам со ссылками на все статьи.

Задержка электронной почты в Outlook > Вильхубер Давид

Электронная почта с асинхронной коммуникацией, несмотря на все предсказания гибели Slack и Discord, является доминирующим средством коммуникации в бизнес-секторе во всем мире. Помимо Inbox Zero от Merlin Mann, существует множество других стратегий для борьбы с ежедневным потоком электронной почты, включая так называемую задержку электронной почты, то есть отложенную доставку электронной почты.


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

Для этого проекта я представлю три варианта того, как вы можете реализовать то, что хотите. В первом варианте мы создаем правило Outlook (в случае сервера Exchange) (для всех используемых учетных записей электронной почты):

Эта процедура задерживает все исходящие сообщения. К сожалению, для времени возможен только диапазон значений от 1 до 120 минут, так что электронные письма не могут быть задержаны более чем на 2 часа.

Если вы хотите продлить время, а также получить больше контроля, вы можете использовать расширяемость Outlook с помощью отдельного сценария VBA . Для этого откройте редактор макросов (ALT + F11), перейдите в модуль «ThisOutlookSession» и вставьте один из следующих скриптов (изменения также активны без явного сохранения и без перезапуска Outlook):

В этом примере все электронные письма автоматически доставляются в 18:00.:

2d72e6634514ecc92cf5f51fb5948278

Например, если вы хотите отложить время отправки каждого электронного письма на 8 часов, следующий сценарий сделает это.:

2d72e6634514ecc92cf5f51fb5948278

И если вы хотите отправлять каждое электронное письмо в христианское время утром на следующий рабочий день, вы можете использовать следующие:

2d72e6634514ecc92cf5f51fb5948278

Если вы хотите, чтобы вас спросили о задержке перед отправкой, вы также можете отобразить диалоговое окно перед отправкой, в котором вас спросят, хотите ли вы отложить или нет. Также полезно: нажатие на «Отмена» останавливает отправку электронного письма в последний момент.

2d72e6634514ecc92cf5f51fb5948278

Электронные письма, которые уже были отложены, автоматически попадают в папку «Исходящие» соответствующей учетной записи электронной почты, с которой они были отправлены, до тех пор, пока не будут отправлены. Важно: они отправляются только при открытом Outlook. Если вы хотите получить это в исключительных случаях, вы переместите письмо обратно в черновики, снимите флажок «Отложить доставку до» в свойствах электронной почты через Параметры> Отложить доставку и отправьте его снова.

Чтобы все вышеупомянутые сценарии VBA работали, код в «ThisOutlookSession» превращен в отдельный модуль VBA с цифровой подписью . Чтобы на данный момент протестировать функции, вы можете разрешить все макросы (желательно только на короткое время) в разделе «Настройки»> «Центр управления безопасностью»> «Настройки для центра управления безопасностью» . ..> «Настройки макросов».:

Если вы хотите совместить преимущества первого варианта (отправка на стороне сервера) и второго варианта (выбор свободного времени), рекомендуется использовать Boomerang для Outlook с функцией «Отправить позже». Эта услуга предлагает бесплатную отсрочку 10 электронных писем в месяц и работает надежно.

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

110

Новинка! Сохраняйте вопросы или ответы и организуйте свой любимый контент.
Узнать больше.

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

 Субмакрос1()
'
' Макрос1 Макрос
'
Делать
    Рассчитать
    'Здесь я хочу подождать одну секунду
Петля
Конец сабвуфера
 
  • Excel
  • ВБА

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

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

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

 Приложение.  Подождите сейчас + #12:00:01#
 

9

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

 Public Declare Sub Sleep Lib «kernel32» (ByVal dwMilliseconds As Long)
 

Или, для 64-битных систем используйте:

 Public Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr)
 

Вызовите это в своем макросе так:

 Субмакрос1()
'
' Макрос1 Макрос
'
Делать
    Рассчитать
    Sleep (1000) ' задержка 1 секунда
Петля
Конец сабвуфера
 

8

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

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

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

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

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

2

у меня работает без нареканий. вставьте любой код до или после цикла «делать до». В вашем случае поместите 5 строк (время1= и время2= и цикл «до» ) в конце внутри цикла выполнения

 подпрограмма что угодно()
Тусклое время1, время2
время1 = сейчас
time2 = Сейчас + TimeValue("0:00:01")
    Делать до time1 >= time2
        DoEvents
        время1 = Сейчас()
    Петля
Конец сабвуфера
 

5

Объявление Sleep в kernel32. dll не будет работать в 64-разрядной версии Excel. Это было бы немного более общим:

 #If VBA7 Then
    Публичное объявление PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
#Еще
    Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
#Конец, если
 

3

Просто подчищенная версия кода clemo — работает в Access, в котором нет функции Application.Wait.

 Публичная подпауза (sngSecs As Single)
    Dim sngEnd как одиночный
    sngEnd = Таймер + sngSecs
    Пока таймер < sngEnd
        DoEvents
    Венд
Конец сабвуфера
Публичный подтестПауза()
    Пауза 1
    MsgBox "готово"
Конец сабвуфера
 

3

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

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

 'Вы можете использовать целое число (1 на 1 секунду) или одиночное (1,5 за 1,5 секунды)
Public Sub Sleep (vSeconds как вариант)
    Dim t0 как одиночный, t1 как одиночный
    t0 = Таймер
    Делать
        t1 = Таймер
        Если t1 < t0, то t1 = t1 + 86400 'Таймер переполняется в полночь
        DoEvents необязательно, чтобы избежать зависания Excel во время сна
    Цикл до t1 - t0 >= vSeconds
Конец сабвуфера
 

ИСПОЛЬЗУЙТЕ ЭТО ДЛЯ ПРОВЕРКИ ЛЮБОЙ ФУНКЦИИ СНА: (открыть немедленное окно отладки: CTRL+G)

 Sub testSleep()
    t0 = Таймер
    Debug.Print "Время перед сном:"; t0 'Формат таймера в секундах с полуночи
    Сон (1,5)
    Debug.Print "Время после сна:"; Таймер
    Debug.Print "Отложено для:"; Таймер - t0; "секунды"
Конец сабвуфера
 

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

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

 Частный саб Waste10Sec()
   цель = (Сейчас + TimeValue("0:00:10"))
   Делать
       DoEvents позволяет Excel запускать другие вещи
   Цикл до сих пор> = цель
Конец сабвуфера
 

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

0

Приложение. Подождите секунду (сейчас) + 1

1

Вот альтернатива спящему режиму:

 Sub TDelay(delay As Long)
Dim N As Long
Для n = 1 Задержать
DoEvents
Следующий n
Конец сабвуфера
 

В следующем коде я заставляю мигать эффект «свечения» на кнопке прокрутки, чтобы направить пользователей к ней, если у них «проблемы», использование «sleep 1000» в цикле не привело к видимому миганию, но цикл работает Отлично.

 Подпрограмма SpinFocus()
Дим и пока
Для i = 1 To 3 '3 мигает
Рабочие листы(2).Shapes("SpinGlow").ZOrder (msoBringToFront)
TDelay (10000) 'это заставляет свечение гореть дольше, чем нет, выглядит красиво.
Листы(2).Shapes("SpinGlow").ZOrder (msoSendBackward)
Задержка (100)
Далее я
Конец сабвуфера
 
 Задержка функции (ByVal T как целое число)
    'Функция может быть использована для введения задержки до 99 секунд
    'Вызов функции, пример: Delay 2 {вводит 2-секундную задержку перед возобновлением выполнения кода}
        strT = Mid((100 + T), 2, 2)
            strSecsDelay = "00:00:" & strT
    Application.Wait(Сейчас + TimeValue(strSecsDelay))
Конечная функция
 

1

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

 T0 = Таймер
Делать
    Задержка = Таймер - T0
Цикл до задержки >= 1 'Измените это значение на время паузы на определенное количество секунд
 

2

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

 Sub goTIMER (NumOfSeconds As Long) 'в (секундах) как: call gotimer (1) 'секунды
  Приложение.  Подождите сейчас + NumOfSeconds / 86400#
  'Application.Wait (Сейчас + TimeValue("0:00:05")) 'другое
  Application.EnableEvents = True 'СОБЫТИЯ
Конец сабвуфера
 

1

Вы можете использовать
Application.wait now + timevalue("00:00:01")
или же
Application.wait now + timeserial(0,0,1)

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

 Threading.thread.sleep(1000)
 

0

Как сделать задержку менее одной секунды в excel vba?

42

Новинка! Сохраняйте вопросы или ответы и организуйте свой любимый контент.
Узнать больше.

Я хочу повторить событие после определенной продолжительности, которая меньше 1 секунды. Я попытался использовать следующий код

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

Но здесь минимальное время задержки составляет одну секунду. Как дать задержку, скажем, полсекунды?

  • excel
  • vba

Вы можете использовать вызов API и Sleep:

Поместите это вверху вашего модуля:

 Объявите Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
 

Затем вы можете вызвать его в такой процедуре:

 Sub test()
Дим и пока
Для i = от 1 до 10
    Отладка. Распечатать сейчас()
    Sleep 500 'подождите 0,5 секунды
Далее я
Конец сабвуфера
 

1

Я нашел это на другом сайте, не уверен, работает оно или нет.

 Приложение. Подождите + 1/(24*60*60,0*2)
 

числовое значение 1 = 1 день

1/24 это один час

1/(24*60) одна минута

, поэтому 1/(24*60*60*2) равно 1/2 секунды

Вам нужно где-то использовать десятичную точку, чтобы заставить число с плавающей запятой

Источник

Не уверен, что это сработает за миллисекунды

 Приложение. Подождите (сейчас + 0,000001)
 

1

call waitfor(.005)

 Sub WaitFor(NumOfSeconds As Single)
    Dim SngSec как сингл
    SngSec=таймер + количество секунд
    Делать, пока таймер < sngsec
        DoEvents
   Петля
Конец сабвуфера
 

источник
Временные задержки в VBA

0

Я попробовал это, и у меня это работает:

 Private Sub DelayMs (ms As Long)
    Debug.  Print TimeValue (сейчас)
    Application.Wait (Сейчас + (мс * 0,00000001))
    Debug. Print TimeValue (сейчас)
Конец сабвуфера
Частный подтест()
    Call DelayMs (2000) 'тестовый код с задержкой в ​​2 секунды, см. окно отладки
Конец сабвуфера
 

1

Все пытаются Application.Wait , но это не очень надежно. Если вы попросите его подождать менее секунды, вы получите что-то между 0 и 1, но ближе к 10 секундам. Вот демонстрация с ожиданием в 0,5 секунды:

 Sub TestWait()
  Дим и пока
  Для i = от 1 до 5
    Dim t как двойной
    т = Таймер
    Приложение. Подождите сейчас + TimeValue ("0:00:00") / 2
    Отладка. Таймер печати - t
  Следующий
Конец сабвуфера
 

Вот результат, в среднем за 0,0015625 секунд:

 0
0
0
0,0078125
0
 

По общему признанию, Таймер не может быть идеальным способом измерения этих событий, но вы поняли идею.

Лучше использовать таймер:

 Sub TestTimer()
  Дим и пока
  Для i = от 1 до 5
    Dim t как двойной
    т = Таймер
    Делать до таймера - t >= 0,5
      DoEvents
    Петля
    Отладка.  Таймер печати - t
  Следующий
Конец сабвуфера
 

И среднее значение результатов очень близко к 0,5 секунды:

 0,5
0,5
0,5
0,5
0,5
 

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

 Application.Wait (Сейчас + TimeValue("0:00:01") / 1000)
 

Делите на то, что вам нужно. Десятая, сотая и т.д. вроде все работает. При удалении части «разделить на» макрос выполняется дольше, поэтому при отсутствии ошибок я должен верить, что он работает.

1

Ни один ответ не помог мне, поэтому я создаю это.

 ' Функция Timestamp возвращает текущее время в миллисекундах.
' совместим с объектами даты JSON или JavaScript.
Временная метка публичной функции () в качестве валюты
    метка времени = (Округление (Сейчас(), 0) * 24 * 60 * 60 + Таймер()) * 1000
Конечная функция
' Функция Sleep позволяет системе выполнять другие программы, пока не истекут миллисекунды.
Спящий режим публичной функции (миллисекунды в качестве валюты)
    Если миллисекунды < 0, то выход из функции
    Dim start как валюта
    начало = отметка времени ()
    Пока (отметка времени () < миллисекунды + начало)
        DoEvents
    Венд
Конечная функция
 

Примечание: В Excel 2007, Now() отправить Double с десятичными дробями в секунды, поэтому я использую Timer() для получения миллисекунд.

Примечание: Application.Wait() принимать секунды и не меньше (т. е. Application.Wait(Now()) Application.Wait(Now()+100*millisecond)) )

2 Примечание: Application.Wait() не позволяет системе выполнять другую программу, но почти не снижает производительность. Предпочитаю использование События .

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

 sov(sekunder As Double) As Double
start_time = Таймер
Делать
DoEvents
Цикл до (таймер - начальное_время) >= секунд
Конечная функция
 

Чтобы сделать паузу на 0,8 секунды:

 Sub main()
    Время начала = Таймер
    Делать
    Цикл до таймера - startTime >= 0,8
Конец сабвуфера
 
 Открытая функция CheckWholeNumber (число как двойное) как логическое значение
    Если Число - Исправить(Число) = 0 Тогда
        Чекцелнумбер = Истина
    Конец, если
Конечная функция
Public Sub TimeDelay (дни в двойном размере, часы в двойном размере, минуты в двойном размере, секунды в двойном размере)
    Если CheckWholeNumber(Days) = False Тогда
        Часы = Часы + (Дни - Исправить(Дни)) * 24
        Дни = Исправить (Дни)
    Конец, если
    Если CheckWholeNumber(Часы) = Ложь Тогда
        Минуты = Минуты + (Часы - Fix(Часы)) * 60
        Часы = Исправить (Часы)
    Конец, если
    Если CheckWholeNumber(Minutes) = False Тогда
        Секунды = Секунды + (Минуты - Fix(Минуты)) * 60
        Минуты = Fix(минуты)
    Конец, если
    Если Секунд >= 60 Тогда
        Секунды = Секунды - 60
        Минуты = Минуты + 1
    Конец, если
    Если Минут >= 60 Тогда
        Минуты = Минуты - 60
        Часы = Часы + 1
    Конец, если
    Если Часы >= 24 Тогда
        Часы = Часы - 24
        Дни = Дни + 1
    Конец, если
    Приложение.  Подождите _
    ( _
        Сейчас + _
        TimeSerial(Часы + Дни * 24, Минуты, 0) + _
        Секунды * TimeSerial(0, 0, 1) _
    )
Конец сабвуфера
 

пример:

 вызов TimeDelay(1.9,23.9,59.9,59.9999999)
 

надеюсь, вам понравится.

изменить:

вот один без каких-либо дополнительных функций, для тех, кто любит, чтобы он был быстрее
Если Дней - Исправить(Дней) > 0 Тогда
Часы = Часы + (Дни - Исправить(Дни)) * 24
Дни = Исправить (Дни)
Конец, если
Если Часы - Исправить(Часы) > 0 Тогда
Минуты = Минуты + (Часы - Fix(Часы)) * 60
Часы = Исправить (Часы)
Конец, если
Если Минуты - Исправить(Минуты) > 0 Тогда
Секунды = Секунды + (Минуты - Fix(Минуты)) * 60
Минуты = Fix(минуты)
Конец, если
Если Секунд >= 60 Тогда
Секунды = Секунды - 60
Минуты = Минуты + 1
Конец, если
Если Минут >= 60 Тогда
Минуты = Минуты - 60
Часы = Часы + 1
Конец, если
Если Часы >= 24 Тогда
Часы = Часы - 24
Дни = Дни + 1
Конец, если
Приложение.