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
Конец, если
Приложение.