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.

Другие вопросы по тегам