1

我编写了一个脚本,它生成一个 Lotus Notes 电子邮件以在特定时间间隔发布数据。这个脚本是 Macro2 - Macro5。宏 2 - 宏 5 都是相同的,但我在不同的子目录下复制了脚本以尝试诊断我的问题。我遇到的问题有时是例如晚上 8 点,会生成 4 封电子邮件。一封电子邮件将由宏 5 正确触发,但在晚上 8 点发送的其他电子邮件已由宏 2 触发。我知道这一点是因为我在每个宏中添加了一个额外的行,以在电子邮件中指明是哪个宏生成了它。

我正在使用以下内容来调用这些潜艇:

在“这本工作簿”中,我有:

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

真的很困惑为什么会这样。可以肯定这个问题与宏 2-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
4

2 回答 2

1

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

以下是安排和取消单个事件的示例:

在 MODULE - 创建一个变量来存储预定时间:

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

确保在关闭 Excel 时禁用 ThisWorkbook 对象中的事件:

Private Sub Workbook_BeforeClose(Cancel As Boolean)

    On Error Resume Next
    Application.OnTime scheduleTime, "ScheduleEvent", , False
    On Error GoTo 0

End Sub
于 2014-11-18T23:44:57.260 回答
0

感谢大家的帮助。似乎您是正确的路径加密狗,在工作簿关闭后,未触发的准时事件似乎仍在计划中。我认为当 Excel 本身关闭或计算机重新启动时,它们最终必须重置。我添加了以下内容,现在似乎已经解决了这个问题:

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 点打开工作簿,那么下午 4 点准时活动也会在第二天安排两次。

再次感谢。

于 2014-11-19T21:20:02.850 回答