una tiempo segundos repetir pausar para macro hoja esperar ejecutar determinada constantemente cierto cada automaticamente accion abrir excel vba excel-vba timer scheduling

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:

  1. Está intentando codificar y el enfoque en la ventana se interrumpe cada vez que se desencadena el evento.
  2. 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.