Application.OnTime en cours d'exécution quand il ne devrait pas

J'ai écrit un script qui génère un e-mail Lotus Notes pour publier des données à certains intervalles de time. Ce script est Macro2 – Macro5. Macro 2 – Macro 5 sont tous identiques, mais j'ai dupliqué le script sous différents sousmes pour essayer de diagnostiquer mon problème. Le problème que j'expérimente est parfois de 8 h, par exemple, 4 emails seront générés. Un e-mail sera déclenché correctement par Macro 5, mais les autres emails envoyés à 8h ont été déclenchés par Macro 2. Je le sais parce que j'ai ajouté une ligne supplémentaire à chaque Macro pour indiquer dans le courriel que Macro a généré.

J'utilise les éléments suivants pour appeler ces sousmes:

Dans "Ce classur", j'ai:

Private Sub Workbook_Open() Call DailyAM Call DailyPM End Sub 

Dans le module 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 

Je suis vraiment confus quant à la raison pour laquelle cela se produit. Assez certain que le problème n'a rien à voir avec Macro 2-5, mais ici, c'est juste au cas où:

 Sub Macro5() Windows("Silo report test v2.xlsm").Activate Application.Calculate Dim Maildb As Object 'The mail database Dim UserName As Ssortingng 'The current users notes name Dim MailDbName As Ssortingng '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("[email protected]") 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 

Merci à tous pour votre aide. On dirait que vous étiez correct pathDongle, il semble que les events intemuns qui n'avaient pas été déclenchés restnt programmés après la fermeture du classur. Je présume qu'ils doivent finalement réinitialiser lorsque Excel lui-même est fermé ou lorsque l'ordinateur est redémarré. J'ai ajouté les éléments suivants qui semblent avoir abordé le problème:

 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 

Je pense que je pourrais append un code similaire à la fin des sous-routines DailyAM et DailyPM avant d'être appelés à nouveau à la fin de ces sous-systèmes. Je pense que si j'ouvre le cahier de travail à 18h, alors l'événement inattendu de 16h00 se terminerait également deux fois plus tard le lendemain.

Merci encore.

Il semble que vous avez planifié certains events à l'aide d'Application.OnTime, mais je ne vois aucun code pour désactiver ces events. Si vous ouvrez le classur 5 fois pendant la journée, ces events seront programmés 5 fois au moment spécifié et triggersront simultanément. Peut-être que vous devez désactiver les events si le classur est fermé pour empêcher les events de tirer?

Voici un exemple pour planifier et annuler un seul événement:

Dans un MODULE – créez une variable pour stocker l'heure programmée:

 Public scheduleTime As Date 

Quelque part dans le code programmer un code à exécuter:

 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 

Assurez-vous que l'événement est désactivé lorsque vous fermez Excel, dans l'object ThisWorkbook:

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