Poné el siguiente código en un módulo estándar, y crea un formulario que se llame frmMain.
Este ejemplo utiliza la función SetTimer de la API para disparar un temporizador controlado mediante un bucle y la función Timer, de Visual Basic.
Establece la constante TIMER_INTERVAL a la cantidad de segundos que quieres que sea el intervalo del temporizador. Esto es sólo de prueba, luego verás cómo manejas ese tema.
Para iniciar el temporizador llama al procedimiento
StartLongTimer, y para detenerlo a
TerminateLongTimer.
Cuando se cumpla cada intervalo de tiempo el temporizador lo notificará llamando al procedimiento
LongTimer_Timer, y allí realizarás las tareas que necesites.
Option Explicit
Const TIMER_INTERVAL = 86400 ' Intervalo del Timer, en segundos (le puse 1 día).
Declare Function SetTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
Declare Function KillTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long) As Long
Private bTerminateTimer As Boolean
Sub Main()
Call frmMain.Show
End Sub
Sub StartLongTimer()
bTerminateTimer = False
' Crea el temporizador del sistema que se ejecuta de
' forma asíncrona, de esta manera se evita el bloqueo
' del programa.
'
Call SetTimer(0&, 0&, 1000&, AddressOf LongTimerProc)
End Sub
Sub TerminateLongTimer()
' Establece la variable a verdadero para que
' se termine el procedimiento del temporizador.
'
bTerminateTimer = True
End Sub
Sub LongTimerProc(ByVal hWnd As Long, ByVal uMsg As Long, ByVal idEvent As Integer, ByVal dwTime As Long)
Dim snTime!
Call KillTimer(0&, idEvent)
' Guarda el intervalo de tiempo actual.
'
snTime = Timer
Do While (Timer - snTime) < TIMER_INTERVAL
' Espera hasta que pase el tiempo especificado
' a menos que se cancele.
'
If bTerminateTimer Then Exit Do
DoEvents
Loop
If Not bTerminateTimer Then
' Si no se canceló el temporizador notifica del evento
' y vuelve a inicializar el contador.
'
Call LongTimer_Timer
Call StartLongTimer
End If
End Sub
Sub LongTimer_Timer()
' Este procedimiento se llamará cada vez que pase el lapso de tiempo
' configurado para el temporizador.
'
' Acá se puede hacer cualquier cosa que desee.
'
Debug.Print "Timer interval: " & Time$
End Sub
Saludos.