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.