2009-11-04 6 views
3

Я написал макрос, который запускается в 15:30 вечера каждый рабочий день, когда рабочая книга открывается. Когда рабочая книга закрыта, она пытается открыть себя при следующем запуске макроса. Я попытался превратить планировщик в false, и я получаю сообщение об ошибке. Код ниже. Есть ли у кого-нибудь идеи, почему это не работает?VBA ontime cancel scheduling

Благодаря

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

Вам нужно, чтобы люди знали, что была ошибка! –

+0

Я предполагаю, что это будет 'Метод OnTime объекта _application 'failed'. Но ОП должен отредактировать свой вопрос, чтобы подтвердить. – pjp

+0

Да, я прошу прощения за то, что не поставил достаточно деталей, спасибо за советы. Будет полезно, когда я должен задать больше вопросов, также благодаря Raj для форматирования кода – 2009-11-05 11:54:03

ответ

2

Я думаю, что вы должны сохранить ссылку на время, так что вы можете отменить действие. Вы можете только отменить действие, если оно еще не выполнено.

В ThisWorkbook введите следующую запустить макрос в 15:59, пока лист не будет закрыт

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 

Затем добавить макрос к модулю

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 

Этот путь тем же значением dTime будет использоваться для отмены запланированной задачи, как было использовано для ее создания.

Если дальнейшая задача не была запланирована, то есть ошибкой в ​​MacroTimeTest, тогда событие закрытия рабочей книги обработает ошибку.

Чтобы увидеть выход взгляд отладки на немедленном окне в редакторе VBA (Ctrl + G)