Application.OnTime运行时不应该

我已经编写了一个脚本来生成一个Lotus Notes电子邮件,以便以特定的时间间隔发布数据。 这个脚本是Macro2 – Macro5。 macros2 – macros5都是一样的,但我已经复制了不同的潜艇下的脚本来尝试和诊断我的问题。 我遇到的问题有时是在下午8点,会产生4封电子邮件。 一个电子邮件将被Macro 5正确触发,但其他电子邮件在晚上8点发送已经被Macro 2触发。我知道这是因为我已经添加了一个额外的行到每个macros,以指示在电子邮件macros生成它。

我正在使用以下来调用这些subs:

在“这本练习册”中我有:

Private Sub Workbook_Open() Call DailyAM Call DailyPM End Sub 

在模块1中:

 Sub DailyAM() Application.OnTime TimeValue("06:00:00"), "Macro2" Application.OnTime TimeValue("10:00:00"), "DailyAM" End Sub Sub DailyPM() Application.OnTime TimeValue("12:01:00"), "Macro3" Application.OnTime TimeValue("16:00:00"), "Macro4" Application.OnTime TimeValue("20:00:00"), "Macro5" Application.OnTime TimeValue("23:59:00"), "DailyPM" End Sub 

真的很困惑,为什么发生这种情况。 相当肯定这个问题与macros2-5没有任何关系,但这里只是为了以防万一:

 Sub Macro5() Windows("Silo report test v2.xlsm").Activate Application.Calculate Dim Maildb As Object 'The mail database Dim UserName As String 'The current users notes name Dim MailDbName As String 'THe current users notes mail database name Dim MailDoc As Object 'The mail document itself Dim AttachME As Object 'The attachment richtextfile object Dim Session As Object 'The notes session Dim EmbedObj As Object 'The embedded object (Attachment) Set Session = CreateObject("Notes.NotesSession") UserName = Session.UserName MailDbName = Left$(UserName, 1) & Right$(UserName, (Len(UserName) - InStr(1, UserName, " "))) & ".nsf" Set Maildb = Session.GETDATABASE("", MailDbName) If Maildb.IsOpen = True Then 'Already open for mail Else Maildb.OPENMAIL End If Set MailDoc = Maildb.CreateDocument MailDoc.Form = "Memo" 'Email address array changed for privacy vaRecipient = VBA.Array("example@example.com") MailDoc.SendTo = vaRecipient MailDoc.Subject = Range("B1").Value Set workspace = CreateObject("Notes.NotesUIWorkspace") Dim notesUIDoc As Object Set notesUIDoc = workspace.EditDocument(True, MailDoc) Call notesUIDoc.GOTOFIELD("Body") Call notesUIDoc.FieldClear("Body") Call notesUIDoc.FieldAppendText("Body", Range("B9").Value & vbCrLf & vbCrLf & Range("b10").Value & Range("I10").Value & Range("D10").Value & vbCrLf & Range("b11").Value & Range("I11").Value & Range("D11").Value & vbCrLf & Range("b12").Value & Range("I12").Value & Range("D12").Value & vbCrLf & vbCrLf & Range("b13").Value & Range("I13").Value & Range("D13").Value & vbCrLf & vbCrLf & Range("b14").Value & Range("C14").Value & Range("D14").Value & vbCrLf & vbCrLf & Range("b15").Value & Range("I15").Value & Range("D15").Value & vbCrLf & Range("F4").Value & vbCrLf) notesUIDoc.Send notesUIDoc.Close MailDoc.PostedDate = Now() 'Gets the mail to appear in the sent items folder Set Maildb = Nothing Set MailDoc = Nothing Set AttachME = Nothing Set Session = Nothing Set EmbedObj = Nothing End Sub 

感谢大家的帮助。 看来你是正确的path,似乎在工作簿closures之后,尚未触发的按时间事件仍然是按计划进行的。 我认为,当Excel本身closures或重新启动计算机时,它们最终必须重置。 我已经添加了以下似乎已经解决了这个问题:

 Private Sub Workbook_BeforeClose(Cancel As Boolean) On Error Resume Next Application.OnTime TimeValue("12:01:00"), "Macro3", , False Application.OnTime TimeValue("16:00:00"), "Macro4", , False Application.OnTime TimeValue("20:00:00"), "Macro5", , False Application.OnTime TimeValue("06:00:00"), "Macro6", , False On Error GoTo 0 End Sub 

我想我可能会将相似的代码添加到DailyAM和DailyPM子例程的末尾,然后再次在这些子目录的末尾调用。 我在想,如果我在下午6点打开工作簿,那么下午四点的时间会在第二天结束。

再次感谢。

它看起来像你已经使用Application.OnTime计划了一些事件,但我看不到任何代码来禁用这些事件。 如果您在一天中打开工作簿5次,则这些事件将在指定的时间安排5次,并将同时触发。 也许你需要禁用事件,如果工作簿已closures,以防止事件触发?

以下是安排和取消单个活动的示例:

在MODULE中 – 创build一个variables来存储预定的时间:

 Public scheduleTime As Date 

在代码的某处安排一些代码来运行:

 Sub ScheduleEvent() 'Code to Run 'Reschedule 1 hour from now and rerun this Sub scheduleTime = Now + TimeValue("01:00:00") Application.OnTime scheduleTime, "ScheduleEvent", , True End Sub 

确保在closuresExcel时,在ThisWorkbook对象中禁用事件:

 Private Sub Workbook_BeforeClose(Cancel As Boolean) On Error Resume Next Application.OnTime scheduleTime, "ScheduleEvent", , False On Error GoTo 0 End Sub