DoEvents, Ожидание и редактирование
У меня есть набор кода, который содержит:
Application.Wait (Now + TimeValue("4:00:00"))
По сути, это приостанавливает макрос для четырехчасового окна с 3 часов утра (когда он заканчивает выполнение кода) до 7 часов утра (когда он должен возобновиться). Код по сути бесконечный цикл.
Я хочу, чтобы пользователь мог контролировать в это время редактирование определенных ячеек. я пытался
DoEvents
но не нашли способ сохранить работу макроса, но предоставить контроль пользователю в то время, когда макрос ничего не делает, кроме ожидания.
Любое понимание будет оценено. Спасибо!
РЕДАКТИРОВАТЬ:
Еще один дополнительный вопрос. Я создал этот макрос для ссылки на фактический макрос "Production_Board". Я хочу, чтобы этот макрос работал все время и обновлялся как можно чаще. Используя goto startagain, он пытается начать запуск макроса еще до того, как макрос даже запустился из-за интервала задержки "ontime".
Как я могу заставить подпрограмму RunMacro запускаться снова, как только завершится макрос "Production_Board"?
Sub RunMacro
startagain:
Dim hour As Integer
Dim OT As String
hour = 0
OT = "Empty"
hour = Sheets("Calculations").Range("DR1").Value
OT = Sheets("Black").Range("D4").Value
If OT = "Y" Then
If hour = 3 Or hour = 4 Then
Application.OnTime TimeValue("05:00:00"), "Aespire_Production_Board"
Else
Application.OnTime Now + TimeValue("00:00:30"), "Aespire_Production_Board"
End If
Else
If hour = 3 Or hour = 4 Or hour = 5 Or hour = 6 Then
Application.OnTime TimeValue("07:00:00"), "Aespire_Production_Board"
Else
Application.OnTime Now + TimeValue("00:00:30"), "Aespire_Production_Board"
End If
DoEvents
GoTo startagain
2 ответа
Вместо Wait
, пытаться OnTime
, Чтобы продемонстрировать, вставьте это в обычный модуль и запустите Test
, Диапазон А1 активного листа будет увеличиваться каждые пять секунд, и вы сможете работать между ними. Это также работает, если вы находитесь в режиме редактирования по истечении пяти секунд:
Sub test()
test2
End Sub
Sub test2()
ActiveSheet.Cells(1, 1).Value = ActiveSheet.Cells(1, 1).Value + 1
Application.OnTime Now + TimeValue("00:00:5"), "test2"
End Sub
Обратите внимание, что OnTime
оператор в конце подпрограммы снова вызывает подпункт рекурсивно. Вот еще немного информации.
Sub mySub()
Do
If Time() >= #3:00:00 AM# And Time() <= #7:00:00 AM# Then
Aespire_Production_Board
End If
DoEvents
Loop
End Sub
Как только вы запустите mySub(), он будет работать неопределенно долго. С 3 до 7 утра он будет запускать Aespire_Production_Board в каждом цикле. Это также позволяет пользователю взаимодействовать. Код можно перевести в режим Break с помощью CTRL-Break.