doevent vba user-controls wait doevents

doevent vba



DoEvents, Waiting y Editing (2)

Tengo un conjunto de código que contiene:

Application.Wait (Now + TimeValue("4:00:00"))

Esto es esencialmente pausar la macro para una ventana de cuatro horas desde las 3 AM (cuando termina de ejecutar el código) hasta las 7 AM (cuando debería reanudarse). El código está esencialmente en un bucle sin fin.

Quiero que el usuario pueda tener control durante ese tiempo para editar ciertas celdas. Yo he tratado

DoEvents

pero no han encontrado la manera de mantener la macro en ejecución, pero proporcionan control al usuario durante ese tiempo cuando la macro no hace más que esperar.

Cualquier idea sería apreciada. ¡Gracias!

EDITAR:

Una pregunta de seguimiento más. Creé esta macro para hacer referencia a la macro real "Production_Board". Quiero que esta macro se ejecute todo el tiempo y actualice con la mayor frecuencia posible. Al usar goto startagain, intenta comenzar a ejecutar la macro de nuevo antes de que la macro haya comenzado incluso debido al intervalo de retraso de "encendido".

¿Cómo podría hacer que el sub RunMacro vuelva a comenzar en el momento en que termine la macro "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


En lugar de Wait , intente OnTime . Para demostrar, pegue esto en un módulo normal y ejecute Test . El rango A1 de la hoja activa aumentará cada cinco segundos y podrá trabajar en el medio. También funciona si estás en el modo de edición cuando transcurren los cinco segundos:

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

Tenga en cuenta que la instrucción OnTime al final del sub llama al sub de forma recursiva. Aquí hay algo más de información.


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

Una vez que inicie mySub () se ejecutará indefinidamente. Entre las 3 AM y las 7 AM, ejecutará Aespire_Production_Board en cada ciclo. También le permite al usuario interactuar. El código se puede poner en modo Break usando CTRL-Break.