如何使application.reminder事件有效?

时间:2012-07-18 15:21:59

标签: events vba outlook outlook-vba

我在类模块中有这个代码 - 正如msdnthis stackoverflow thread上所述

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

我已尝试使用this thread底部的代码,但也无法启动。

所有我能得到的是outlook的提醒弹出窗口。没有断点,Msgbox永远不会显示 - 即使我删除了函数调用。我已经重启了好几次而且没有结果。

我错过了重要的事情吗?

3 个答案:

答案 0 :(得分: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事件上触发的。但是,当事件第一次出现时,这也应该可以触发(据我所知,这不会在提醒从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对象模块中设置的。添加这个可以为你做什么吗?

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

这个问题的实际答案如下: 如果您正在设置定期约会,并在预约时将代码放入Application_Reminder事件中,则除非您在约会本身的下拉列表中专门设置提醒时段,否则不会触发提醒事件。

我玩了好几天,事件永远不会开火,除非它是单一的约会 - 经常再也没用过。

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

仅供参考我使用的一些代码用于每月发送用户信息(自密码重置)提醒,使用存储在本地文件夹中的电子邮件模板。现在工作得很好。如果发送名为linke&#39; Send Mail&#39;的自动电子邮件,请务必创建自己的新类别。每个约会都必须设置为此类别,并在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

玩得开心。

戴夫托马斯