1

我在一个类模块中有这个代码 - 正如在msdn这个 stackoverflow 线程上所说

Public WithEvents objReminders As Outlook.Reminders

Private Sub Application_Startup()
    Set objReminders = Application.Reminders
End Sub

Private Sub Application_Reminder(ByVal Item As Object)
    Call Send_Email_Using_VBA
    MsgBox ("Litigate!") 
End Sub

我尝试使用该线程底部的代码,但也不会启动。

我能得到的只是 Outlook 的提醒弹出窗口。没有断点被击中,Msgbox 永远不会显示 - 即使我删除了函数调用。我已经重新启动了几次,但没有结果。

我错过了什么重要的东西吗?

4

3 回答 3

2

WithEvents用于处理对象Reminder上的事件objReminders,但您没有声明要匹配的子项。在我下面的代码中,请注意objReminders_...与您的Application_...潜艇。

我在 Outlook 2003 中使用了您的代码(我没有 Office 2007,因此无法在那里进行测试),并得出以下结论:

Public WithEvents objReminders As Outlook.Reminders

Private Sub objReminders_Snooze(ByVal ReminderObject As Reminder)
    Call Send_Email_Using_VBA
    MsgBox ("Litigate!")
End Sub

Private Sub Class_Initialize()
    Set objReminders = Outlook.Reminders
End Sub

在普通代码模块中用这个实现:

Sub test()

Dim rmd As New ReminderClass

rmd.objReminders.Item(1).Snooze 1 'Triggers objReminders_Snooze in class module
rmd.objReminders.Item(2).Snooze 1

End Sub

现在,这触发了Snooze我明确调用的事件。但是,这也应该适用于您在事件首次出现时触发(据我所知,这不会在提醒从 a 唤醒时触发Snooze)。我没有设置任何提醒来测试 - 如果您有除此之外的困难,我将为此设置一些我自己的测试。

Private Sub objReminders_ReminderFire(ByVal ReminderObject As Reminder)
    Call Send_Email_Using_VBA
    MsgBox ("Litigate!")
End Sub

更新:

在 2010 年玩过这个之后,我发现以下方法可以工作(至少会触发,但它似乎一直在触发):

Private Sub Application_Reminder(ByVal Item As Object)
    Call Send_Email_Using_VBA
    MsgBox ("Litigate!")
End Sub

这是在ThisOutlookSession对象模块中设置的。添加这个对你有什么帮助吗?

于 2012-07-18T17:31:02.730 回答
1

值得注意的是,这必须在 ThisOutlookSession 代码中,而不是不同的模块

Private Sub objReminders_ReminderFire(ByVal ReminderObject As Reminder)
    Call Send_Email_Using_VBA
    MsgBox ("Litigate!")
End Sub
于 2015-05-06T19:34:44.787 回答
0

此问题的实际答案如下:如果您正在设置定期约会,并将代码放入约会的 Application_Reminder 事件中,除非您在约会本身的下拉菜单中特别设置提醒期限,否则不会触发提醒事件。

我玩了几天,除非它是一个单一的约会,否则该事件永远不会触发 - 重复从来没有奏效。

设置一个提醒时间为 5 分钟的定期约会,一切正常。

仅供参考,这是我使用存储在本地文件夹中的电子邮件模板每月发送用户信息(自我密码重置)提醒的一些代码。现在完美运行。如果发送称为链接“发送邮件”的自动电子邮件,请记住创建自己的新类别。每个约会都必须设置为此类别,并在 Sub 中进行检查。

    Private Sub Application_Reminder(ByVal Item As Object)
      Dim objMsg As MailItem

       On Error Resume Next


    'IPM.TaskItem to watch for Task Reminders
    If Item.MessageClass <> "IPM.Appointment" Then
      Exit Sub
    End If

    If Item.Categories <> "Send Mail" Then
      Exit Sub
    End If

     'Check which Template for Reminder we need to send by looking for the keyword in the Reminder Appointment

If InStr(Item.Subject, "e-Expenses Password Resets") > 0 Then
    Set objMsg = Application.CreateItemFromTemplate("C:\Reminder Emails\e-Expenses Resetting your own password.oft")

ElseIf InStr(Item.Subject, "e-Learning Password Resets") > 0 Then
    Set objMsg = Application.CreateItemFromTemplate("C:\Reminder Emails\e-Learning Resetting your own password.oft")

ElseIf InStr(Item.Subject, "EMIS Password Resets") > 0 Then
    Set objMsg = Application.CreateItemFromTemplate("C:\Reminder Emails\EMIS Web Resetting your own password.oft")

ElseIf InStr(Item.Subject, "NHS email Password Resets") > 0 Then
    Set objMsg = Application.CreateItemFromTemplate("C:\Reminder Emails\NHS Net eMail Resetting your own password.oft")

ElseIf InStr(Item.Subject, "STRATA Password Resets") > 0 Then
    Set objMsg = Application.CreateItemFromTemplate("C:\Reminder Emails\STRATA Resetting your own password.oft")

ElseIf InStr(Item.Subject, "VPN Password String Resets") > 0 Then
    Set objMsg = Application.CreateItemFromTemplate("C:\Reminder Emails\VPN Resetting your own password.oft")

Else: Exit Sub

End If

 'Location is the email address we send to, typically to ALL users
  objMsg.To = Item.Location
  objMsg.Subject = Item.Subject  'Make the subject of the Appointment what we want to say in the Subject of the email
  objMsg.Send


  Set objMsg = Nothing
End Sub

玩得开心。

戴夫·托马斯

于 2016-04-29T09:27:28.247 回答