Программирование на 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 шт):
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