2009-11-04 6 views
3

J'ai écrit une macro qui s'exécute à 15h30 chaque jour de travail lors de la première ouverture d'un classeur. Lorsque le classeur est fermé, il essaie de s'ouvrir automatiquement la prochaine fois que la macro doit être exécutée. J'ai essayé de transformer le planificateur en faux et je reçois une erreur. Code ci-dessous. Quelqu'un at-il des idées pourquoi cela ne fonctionne pas?VBA ontime annuler la planification

Merci

Private Sub Workbook_Open() 
    Application.OnTime TimeValue("15:30:00"), "MacroTimeTest" 
End Sub 

public dtime as date 

Sub MacroTimeTest() 

    dtime = (Format(Application.Evaluate("workday(today(), 1)"), "DD/MM/YY") & " " & TimeValue("15:30:00")) 

    'other code has been deleted doesn't affect dtime variable 
End Sub 

Private Sub Workbook_BeforeClose(Cancel As Boolean) 

    'I have tried replacing false with 0 etc but it didn't make a difference 
    Application.OnTime earliesttime:=dtime, procedure:="MacroTimeTest", schedule:=False 

End Sub 
+1

Vous devez laisser les gens savent ce que l'erreur était! –

+0

Je suppose que ce serait "Method OnTime of object _application" failed'. Mais le PO devrait éditer leur question pour confirmer. – pjp

+0

Oui, je m'excuse de ne pas avoir mis suffisamment de détails, merci pour les conseils. Sera utile quand je dois poser plus de questions, aussi grâce à Raj pour le formatage du code –

Répondre

2

Je pense que vous devez garder une référence au temps afin que vous puissiez annuler l'action. Vous ne pouvez annuler une action que si elle n'a pas déjà été exécutée.

Dans ThisWorkbook Entrez les informations suivantes pour exécuter la macro à 15h59 jusqu'à ce que la feuille est fermée

Option Explicit 

Private Sub Workbook_BeforeClose(Cancel As Boolean) 

    On Error GoTo CouldNotCancel 

    Application.OnTime dTime, "MacroTimeTest", , False 
    Debug.Print "Cancelled task to run at " & dTime 

    Debug.Print "Workbook close" 

    Exit Sub 


CouldNotCancel: 
    Debug.Print "No task to cancel" 

End Sub 

Private Sub Workbook_Open() 
    Debug.Print "Workbook open" 

    dTime = TimeValue("15:59:00") 

    Debug.Print "Next run time " & dTime 
    Application.OnTime dTime, "MacroTimeTest" 

End Sub 

Ensuite, ajoutez votre macro à un module

Option Explicit 
Public dTime As Date 
Public Sub MacroTimeTest() 

    'schedule next run 
    dTime = TimeValue("15:59:00") 

    'schedule next run 
    Debug.Print "Scheduling next run at " & dTime 

    Application.OnTime dTime, "MacroTimeTest" 

    Debug.Print "Running macro" 

End Sub 

De cette façon, la même valeur de dTime sera utilisé pour annuler la tâche planifiée telle qu'elle a été utilisée pour la créer.

Si aucune autre tâche n'a été planifiée, c'est-à-dire une erreur dans MacroTimeTest, l'événement de fermeture du classeur gérera l'erreur.

Pour voir le look de sortie de débogage à la fenêtre immédiate dans l'éditeur VBA (Ctrl + G)