2008-10-17 17 views

Respuesta

11

Puede utilizar Application.OnTime para programar una macro para ejecutar periódicamente. Por ejemplo, crea un módulo con el siguiente código. Llame a "Habilitar" para iniciar el funcionamiento del temporizador.

Es importante dejar funcionando el temporizador cuando se cierra el libro: para hacerlo manejar Workbook_BeforeClose y llame "Desactivar"

Option Explicit 

Private m_dtNextTime As Date 
Private m_dtInterval As Date 

Public Sub Enable(Interval As Date) 
    Disable 
    m_dtInterval = Interval 
    StartTimer 
End Sub 

Private Sub StartTimer() 
    m_dtNextTime = Now + m_dtInterval 
    Application.OnTime m_dtNextTime, "MacroName" 
End Sub 

Public Sub MacroName() 
    On Error GoTo ErrHandler: 
    ' ... do your stuff here 

    ' Start timer again 
    StartTimer 
    Exit Sub 
ErrHandler: 
    ' Handle errors, restart timer if desired 
End Sub 

Public Sub Disable() 
    On Error Resume Next ' Ignore errors 
    Dim dtZero As Date 
    If m_dtNextTime <> dtZero Then 
     ' Stop timer if it is running 
     Application.OnTime m_dtNextTime, "MacroName", , False 
     m_dtNextTime = dtZero 
    End If 
    m_dtInterval = dtZero 
End Sub 

Alternativamente, puede utilizar la API de Win32 SetTimer/KillTimer funciones de manera similar .

+2

... para automatizar por completo esta buena respuesta, agregue Llamar a MacroName() al evento Workbook_Open(). De esta forma, cada vez que abra xls/xlsm, MacroName iniciará sus características sin intervención del usuario. – jpinto3912

+1

Hmm, me pregunto, ¿cuándo se asigna 'm_dtInterval' (a algo más que dtZero)? – gregseth

+0

¿Por qué es importante detener el temporizador cuando el libro de trabajo está cerrado? ¿Qué pasa si no haces eso? –

1

Hay un método de aplicación que puede usarse para sincronizar eventos. Si desea que esto ocurra periódicamente, tendrá que 'recargar' el temporizador después de cada ejecución, pero eso debería ser bastante sencillo.

Sub MyTimer() 
    Application.Wait Now + TimeValue("00:00:05") 
    MsgBox ("5 seconds") 
End Sub 

-Adam

0

Podría considerar el Programador de tareas de Windows y VBScript.

0

Hago esto todo el tiempo, solía usar el método "OnTime" como se muestra arriba pero hace que la máquina con la que está ejecutando el código sea inútil para otras cosas, porque Excel está funcionando el 100% del tiempo. En su lugar utilizo un libro de trabajo oculto modificado y ejecuto con Windows Task Scheduler y en la función thisworkbook workbook_open, llamo a la macro de su libro de trabajo personal, o abro y ejecuto otro libro de trabajo con el código en él. Después de que se haya ejecutado el código, puede llamar a la función application.quit del libro de trabajo oculto y cerrar ecxel para la próxima ejecución. Lo uso para todas mis funciones de informes sin supervisión de 15 minutos y diarias.

+0

Tengo que decir que esto ya no es cierto. Estoy ejecutando un Sub periódicamente en este momento (una vez por segundo) y Excel no acapara la CPU en absoluto. – rix0rrr

Cuestiones relacionadas