excel - tiempo - Estilo de VBA Macro On Timer para ejecutar el código cada cierto número de segundos, es decir, 120 segundos
macro para repetir una accion (6)
Tengo la necesidad de ejecutar un código cada 120 segundos. Estoy buscando una manera fácil de hacer esto en VBA. Sé que sería posible obtener el valor del temporizador del evento Auto_Open
para evitar tener que usar un número mágico, pero no puedo entender cómo disparar un temporizador para que algo se ejecute cada 120 segundos.
Realmente no quiero usar un ciclo infinito con un sueño si puedo evitarlo.
EDITAR :
La publicación cruzada basada en una respuesta proporcionada se encuentra en: Excel VBA Application.OnTime. Creo que es una mala idea usar esto ... pensamientos de cualquier manera?
(Esto está parafraseado de los archivos de ayuda de MS Access. Estoy seguro de que XL tiene algo similar). Básicamente, TimerInterval es una propiedad a nivel de formulario. Una vez configurado, use el subformulario Form_Timer para llevar a cabo la acción deseada.
Sub Form_Load()
Me.TimerInterval = 1000 ''1000 = 1 second
End Sub
Sub Form_Timer()
''Do Stuff
End Sub
Cuando el libro de trabajo se abra por primera vez, ejecute este código:
alertTime = Now + TimeValue("00:02:00")
Application.OnTime alertTime, "EventMacro"
Luego solo tiene una macro en el libro de trabajo llamado "EventMacro" que lo repetirá.
Public Sub EventMacro()
''... Execute your actions here''
alertTime = Now + TimeValue("00:02:00")
Application.OnTime alertTime, "EventMacro"
End Sub
Descubrí que usar OnTime
puede ser doloroso, especialmente cuando:
- Está intentando codificar y el enfoque en la ventana se interrumpe cada vez que se desencadena el evento.
- Tiene varios libros de trabajo abiertos, cierra el que se supone que usa el temporizador y sigue activando y volviendo a abrir el libro de trabajo (si olvidó matar el evento correctamente).
Este artículo de Chip Pearson fue muy esclarecedor. Prefiero usar Windows Timer ahora, en lugar de OnTime
.
En eventos de libro de trabajo:
Private Sub Workbook_Open()
RunEveryTwoMinutes
End Sub
En un módulo:
Sub RunEveryTwoMinutes()
//Add code here for whatever you want to happen
Application.OnTime Now + TimeValue("00:02:00"), "RunEveryTwoMinutes"
End Sub
Si solo quiere que se ejecute la primera parte del código después de que se abre el libro, solo agregue un retraso de 2 minutos en el evento Workbook_Open
Mi solución:
Option Explicit
Public datHora As Date
Function Cronometro(action As Integer) As Integer
''This return the seconds between two >calls
Cronometro = 0
If action = 1 Then ''Start
datHora = Now
End If
If action = 2 Then ''Time until that moment
Cronometro = DateDiff("s", datHora, Now)
End If
End Function
¿Cómo utilizar? Fácil...
dummy= Cronometro(1) '' This starts the timer
seconds= Cronometro(2) '' This returns the seconds between the first call and this one
Sí, puede usar Application.OnTime
para esto y luego ponerlo en un bucle. Es como un despertador en el que sigue presionando el botón de repetición para cuando quiera que vuelva a sonar. Las siguientes actualizaciones de la celda A1 cada tres segundos con el tiempo.
Dim TimerActive As Boolean
Sub StartTimer()
Start_Timer
End Sub
Private Sub Start_Timer()
TimerActive = True
Application.OnTime Now() + TimeValue("00:00:03"), "Timer"
End Sub
Private Sub Stop_Timer()
TimerActive = False
End Sub
Private Sub Timer()
If TimerActive Then
ActiveSheet.Cells(1, 1).Value = Time
Application.OnTime Now() + TimeValue("00:00:03"), "Timer"
End If
End Sub
Puede poner el procedimiento StartTimer
en su evento Auto_Open
y cambiar lo que se hace en el procedimiento Timer
(ahora mismo está actualizando la hora en A1 con ActiveSheet.Cells(1, 1).Value = Time
).
Nota : querrá el código (además de StartTimer
) en un módulo, no en un módulo de hoja de trabajo. Si lo tiene en un módulo de hoja de trabajo, el código requiere una ligera modificación.