2009-10-13 9 views
2

J'ai un ancien code VBA Excel où je veux exécuter une tâche à intervalles réguliers. Si j'utilisais VB6, j'aurais utilisé un contrôle de minuterie.Minuteur dans le formulaire utilisateur dans Excel VBA

J'ai trouvé la méthode Application.OnTime(), et cela fonctionne bien pour le code qui s'exécute dans une feuille de calcul Excel, mais je ne peux pas le faire fonctionner dans un formulaire utilisateur. La méthode n'est jamais appelée.

Comment faire pour que Application.OnTime() appelle une méthode dans un formulaire utilisateur ou existe-t-il d'autres façons de planifier l'exécution du code dans VBA?

Répondre

6

J'ai trouvé une solution de contournement pour cela. Si vous écrivez une méthode dans un module qui appelle simplement une méthode dans votre formulaire utilisateur, vous pouvez planifier la méthode du module à l'aide de Application.OnTime(). Un peu un kludge, mais ça ira à moins que quelqu'un ait une meilleure suggestion.

Voici un exemple:

''//Here's the code that goes in the user form 
Dim nextTriggerTime As Date 

Private Sub UserForm_Initialize() 
    ScheduleNextTrigger 
End Sub 

Private Sub UserForm_Terminate() 
    Application.OnTime nextTriggerTime, "modUserformTimer.OnTimer", Schedule:=False 
End Sub 

Private Sub ScheduleNextTrigger() 
    nextTriggerTime = Now + TimeValue("00:00:01") 
    Application.OnTime nextTriggerTime, "modUserformTimer.OnTimer" 
End Sub 

Public Sub OnTimer() 
    ''//... Trigger whatever task you want here 

    ''//Then schedule it to run again 
    ScheduleNextTrigger 
End Sub 

''// Now the code in the modUserformTimer module 
Public Sub OnTimer() 
    MyUserForm.OnTimer 
End Sub 
+0

Je pense que c'est la seule chemin Don. –

+0

Très bon travail. +1 – Tomalak

0

Que diriez-vous déplacer tout le code à un module 'Timer'.

Dim nextTriggerTime As Date 
Dim timerActive As Boolean 

Public Sub StartTimer() 
    If timerActive = False Then 
     timerActive = True 
     Call ScheduleNextTrigger 
    End If 
End Sub 

Public Sub StopTimer() 
    If timerActive = True Then 
     timerActive = False 
     Application.OnTime nextTriggerTime, "Timer.OnTimer", Schedule:=False 
    End If 
End Sub 

Private Sub ScheduleNextTrigger() 
    If timerActive = True Then 
     nextTriggerTime = Now + TimeValue("00:00:01") 
     Application.OnTime nextTriggerTime, "Timer.OnTimer" 
    End If 
End Sub 

Public Sub OnTimer() 
    Call MainForm.OnTimer 
    Call ScheduleNextTrigger 
End Sub 

Maintenant, vous pouvez appeler à partir du mainform:

call Timer.StartTimer 
call Timer.StopTimer 

Pour éviter les erreurs, ajouter:

Private Sub UserForm_Terminate() 
    Call Timer.StopTimer 
End Sub 

Wich déclenchera:

Public Sub OnTimer() 
    Debug.Print "Tick" 
End Sub 
Questions connexes