Крис разрабатывает макрос Excel, который отображает пользователю ряд элементов. Он хотел бы ввести задержку в макросе, скажем, в одну секунду между каждым отображаемым элементом информации, и ему интересно, есть ли простой способ добавить такую ​​задержку.

Есть несколько способов добавить задержку в макрос. Традиционный способ — использовать метод Wait, который используется с объектом Application. Вы используете его, чтобы ввести задержку в одну секунду следующим образом:

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

Обратите внимание, что параметр, необходимый для метода Wait, — это время, когда вы хотите, чтобы ваш макрос возобновил выполнение. Другими словами, это время «ждать, пока». Вот почему в приведенном выше примере используется текущее время (из функции Now), увеличенное на одну секунду.

Если вы предпочитаете не использовать метод ожидания (по какой-либо причине), вы также можете просто использовать цикл, чтобы выжидать время:

Dim WaitTime As Date

WaitTime = Now() + TimeValue("0:00:01")

Do While Now < WaitTime Loop

Вариант этого подхода основан на функции Timer, которая возвращает количество секунд, прошедших с полуночи:

Dim Endpoint as Single

Endpoint = Timer + 1 Do While Timer < Endpoint Loop

При использовании цикла таким образом это, вероятно, не будет большой проблемой, если вы задержитесь всего на секунду. Если вам нужно отложить на более длительное время, вы, вероятно, захотите поместить в цикл функцию DoEvents:

Dim Endpoint as Single

Endpoint = Timer + 1 Do While Timer < Endpoint     DoEvents Loop

Причина проста: если вы этого не сделаете, Excel не будет реагировать ни на какие другие события, пока находится в цикле. Это может создать впечатление, что ваша система зависла или зависла во время ожидания.

Если вам нужна более подробная информация о задержках (вплоть до диапазона миллисекунд), вы можете полагаться на функцию сна, которая является частью Windows API. (Он не является частью VBA.) Чтобы использовать его, вам необходимо включить объявление в начале вашего модуля, в области объявлений, перед любыми процедурами:

#If VBA7 And Win64 Then     Public Declare PtrSafe Sub Sleep Lib "kernel32"(ByVal dwMilliseconds As Long)

#Else     Public Declare Sub Sleep Lib "kernel32"(ByVal dwMilliseconds As Long)

#End If

Затем в вашем макросе вы можете использовать функцию сна следующим образом:

Sleep(1000)

Это приостанавливает работу системы на 1000 миллисекунд, что составляет 1 секунду.

ExcelTips — ваш источник экономичного обучения Microsoft Excel.

Этот совет (5134) применим к Microsoft Excel 2007, 2010, 2013 и 2016.