Macro de VBA En estilo de temporizador para ejecutar código cada número de segundos establecido, es decir, 120 segundos


Tengo la necesidad de ejecutar un fragmento de 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 bucle infinito con un sueño si puedo evitarlo.


EDITAR :

La publicación cruzada basada en una respuesta proporcionada es at: Aplicación Excel VBA.A tiempo. Creo que es una mala idea usar esto... pensamientos de cualquier manera?

Author: Community, 2010-02-23

6 answers

Cuando el libro de trabajo se abra por primera vez, ejecute este código:

alertTime = Now + TimeValue("00:02:00")
Application.OnTime alertTime, "EventMacro"

Entonces simplemente tenga una macro en el libro de trabajo llamada "EventMacro" que lo repetirá.

Public Sub EventMacro()
    '... Execute your actions here'
    alertTime = Now + TimeValue("00:02:00")
    Application.OnTime alertTime, "EventMacro"
End Sub
 56
Author: Alain,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-12-03 17:27:02

Sí, puedes usar Application.OnTime para esto y luego ponerlo en un bucle. Es como un despertador donde mantienes pulsado el botón de repetición para cuando quieras que suene de nuevo. La siguiente actualización 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 (en este momento solo está actualizando el tiempo en A1 con ActiveSheet.Cells(1, 1).Value = Time).

Nota : querrás el código (además de StartTimer) en un módulo, no es 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.

 21
Author: Todd Main,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-12-06 23:59:55

En los eventos del 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 desea que la primera pieza de código se ejecute después de que se abra el libro de trabajo, simplemente agregue un retraso de 2 minutos en el evento Workbook_Open

 8
Author: Alex P,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-17 19:06:48

(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, utilice el sub 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
 2
Author: PowerUser,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-02-23 16:19:38

He descubierto que usar OnTime puede ser doloroso, particularmente cuando:

  1. Estás intentando codificar y el foco 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 debe usar el temporizador, y sigue activando y reabriendo el libro de trabajo (si olvidó matar el evento correctamente).

Este artículo de Chip Pearson fue muy esclarecedor. Prefiero usar el temporizador de Windows ahora, en lugar de OnTime.

 0
Author: Gravity Grave,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-08 21:49:49

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? Sencillo...

dummy= Cronometro(1) ' This starts the timer

seconds= Cronometro(2) ' This returns the seconds between the first call and this one
 0
Author: Julian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-06 16:36:30