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

Помогите решить проблему - нужно сделать паузу с помощью VBA в Excel чтобы во время её можно было вводить в ячейки данные - после конца паузы он обрабатывает эти данные.

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

1.

Sub pause()
    Dim t As Date

    t = Timer

    Do
        'DoEvents
    Loop While Timer - t < 3
End Sub

2.

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

3.

Public Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr) 'For 64 Bit Systems

Sleep 3000 'delay in milliseconds 

Ответы (1 шт):

Автор решения: vikttur

Application.Wait - задержка выполнения следующей строки кода, т.е. временная "остановка".

Цикл с проверкой времени - практически то же самое, только цикл крутится вхолостую до выполнения условия.

А вот DoEvents - прерывание, передача управления системе в процессе работы. И пока цикл крутится, системе разрешается чего-нибудь сделать.

После паузы в ячейку A1 будет записана сумма предыдущего и измененного значений этой ячейки.

 Sub test()
    Dim lVal As Long

    With Cells(1, 1)
        lVal = .Value
        Call pause_
        .Value = lVal + .Value
    End With
End Sub

Sub pause_()
    Dim t As Date: t = Timer

    Do: DoEvents
    Loop While Timer - t < 3
End Sub

Вместо Timer можно использовать Now (с проверкой < 3/86400, например). Но в любом случае нестабильно это.

За 3 секунды можно не успеть изменить значение, а макрос отработает. Да хоть 20 мин. - редактируют ячейку в конце последней минуты... Да, изменили и считаете, что вычисления прошли корректно... но макрос-то не увидел нового значения.

Вариант: первый макрос делает, что ему положено, до момента, когда нужна пауза. Если значения переменных или результаты вычислений нужны будут в дальнейшем - сохраняет (в именах, в глобальных переменных, в реестре, на листе...) и останавливается. Продолжается работа другим макросом после изменения ячейки (по событию листа)

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Application.Intersect(Range("A1"), Target) Is Nothing Then
        With Application: .ScreenUpdating = False: .EnableEvents = False: End With
            ' что там дальше...'
        With Application: .ScreenUpdating = True: .EnableEvents = True: End With
    End If
End Sub
→ Ссылка