Sending a Meeting Reminder Email in Outlook


Wouldn’t it be handy if Outlook had a quick way to send a message to everyone invited to a meeting reminding them when the meeting starts and where it’s taking place at? Yes, Outlook meetings have built-in reminders, but you can’t be sure all the invitees set a reminder and even if they did an email nudge may do more to get them to the meeting than a reminder pop-up. Of course you could create a new message, copy and paste the list of invitees from the meeting item into the address line, write a note reminding them of the meeting, and send if off. I don’t know about you, but that sounds like a lot of work to me. I’d rather select an appointment on my calendar and click a button. Let the computer do the work.

Here’s a script that automates the process leaving you free to do something more important, or at least more interesting. Using the script is dead simple. Select or open a meeting on an Outlook calendar, it can be any calendar, and run the script. Off goes a reminder to all the participants who haven’t already declined your invitation (no point in sending them a reminder). It won’t send you a reminder either, unless you aren’t the organizer, and it won’t send reminders to resources (e.g. conference rooms). If you set the macro to run from a toolbar or QAT (Quick Action Toolbar), then the process only requires two clicks (one to select the appointment and another to send the reminder). Pretty simple, huh?

I wrote and tested this using Outlook 2007. I also tested it using Outlook 2010. It should work under any version of Outlook, but in fairness I haven’t tested it to make sure. You should test it to make sure it works the way you want it to before using it in a production environment.

Adding the Code to Outlook.

  1. Start Outlook
  2. Press ALT+F11 to open the Visual Basic Editor
  3. If not already expanded, expand Microsoft Office Outlook Objects
  4. If not already expanded, expand Modules
  5. Select an existing module (e.g. Module1) by double-clicking on it or create a new module by right-clicking Modules and selecting Insert > Module.
  6. Copy the code from the code snippet box and paste it into the right-hand pane of Outlook’s VB Editor window
  7. Edit the code as needed. I placed a comment where changes can occur.
  8. Click the diskette icon on the toolbar to save the changes
  9. Close the VB Editor
Sub SendMeetingReminder()
    'On the next line change True to False if you want the reminder to send without giving you the chance to edit it.
    'Leave it set to True if you want an opportunity to edit the message before sending it.
    Const EDIT_FIRST = True
    'On the next line edit the message as desired.  Both %START% and %LOCATION% are parameters that will be replaced
    'with the meeting start time and location respectively before the message is displayed/sent.
    Const MSG_TEXT = "Just a quick reminder about this meeting.<br><br>Start: <b>%START%</b><br>Location: <b>%LOCATION%</b><br><br>"
    Const MACRO_NAME = "Send Meeting Reminder"
    Const ERR_MSG = "You must select an appointment for this macro to work."
    Dim olkApt As Object, _
        olkRem As Outlook.MailItem, _
        olkRec As Outlook.Recipient
    On Error Resume Next
    Select Case TypeName(Application.ActiveWindow)
        Case "Explorer"
            Set olkApt = Application.ActiveExplorer.Selection(1)
        Case "Inspector"
            Set olkApt = Application.ActiveInspector.CurrentItem
    End Select
    If TypeName(olkApt) <> "Nothing" Then
        If olkApt.Class = olAppointment Then
            Set olkRem = Application.CreateItem(olMailItem)
            With olkRem
                .Subject = "Meeting Reminder: " & olkApt.Subject
                .HTMLBody = MSG_TEXT & .HTMLBody
                .HTMLBody = Replace(.HTMLBody, "%START%", Format(olkApt.Start, "ddd, mmm d at h:mm AMPM"))
                .HTMLBody = Replace(.HTMLBody, "%LOCATION%", olkApt.Location)
                For Each olkRec In olkApt.Recipients
                    If (olkRec.Type <> olResource) And (olkRec.Name <> Session.CurrentUser.Name) Then
                        If Not olkRec.MeetingResponseStatus = olResponseDeclined Then
                            olkRem.Recipients.Add olkRec.Name
                        End If
                    End If
                Next
                .Recipients.ResolveAll
                If EDIT_FIRST Then
                    .Display
                Else
                    .Send
                End If
            End With
        Else
            MsgBox ERR_MSG, vbCritical + vbOKOnly, MACRO_NAME
        End If
    Else
        MsgBox ERR_MSG, vbCritical + vbOKOnly, MACRO_NAME
    End If
    On Error GoTo 0
    Set olkApt = Nothing
    Set olkRem = Nothing
    Set olkRec = Nothing
End Sub

Using the Code.

  1. Select or open a meeting on any Outlook calendar
  2. Run the SendMeetingReminder macro to send a reminder

Running with a single click.

You can add toolbar buttons (Outlook 2003) or QAT buttons (Outlook 2007/2010) to run the macro with a single click. Here’s a link to a page that explaining how to do both.

Revisions.

  • Revision 1

This revision is for Travis who asked if it would be possible to modify the solution to have the message sent “… when the reminder pops up and not when you initially set up the appointment”. Travis goes on to explain that Lotus Notes has the ability to set up future reminders, something he’d like to emulate in Outlook.

In order to provide that capability we have to modify the code to be triggered when the Reminder event of the Application object fires. The event passes the object, in this case an appointment item, the reminder belongs to. All we need to do is modify the original code to take a parameter, the appointment, instead of working against the open or selected item. I also modified the code so it will only work with meetings. I ddidn’t figure there’d be much interest in sending a reminder to yourself for regular appointments.

One note about this solution. A message will be sent each time the reminder fires for the meeting. In other words, if you snooze the reminder, then another message will be sent the second time the reminder fires.

Instructions.

Outlook 2003 and Earlier.

  1. Start Outlook
  2. Click Tools > Macro > Visual Basic Editor
  3. If not already expanded, expand Microsoft Office Outlook Objects and click on ThisOutlookSession
  4. Copy the code from the Code Snippet box and paste it into the right-hand pane of
  5. Outlook’s VB Editor window
  6. Edit the code as needed. I included comment lines wherever something needs to or can change
  7. Click the diskette icon on the toolbar to save the changes
  8. Close the VB Editor
  9. Click Tools > Macro > Security
  10. Set the Security Level to Medium
  11. Close Outlook
  12. Start Outlook
  13. Outlook will display a dialog-box warning that ThisOutlookSession contains macros and asking if you want to allow them to run. Say yes.

Outlook 2007.

  1. Start Outlook
  2. Click Tools > Macro > Visual Basic Editor
  3. If not already expanded, expand Microsoft Office Outlook Objects and click on ThisOutlookSession
  4. Copy the code from the Code Snippet box and paste it into the right-hand pane of Outlook’s VB Editor window
  5. Edit the code as needed. I included comment lines wherever something needs to or can change
  6. Click the diskette icon on the toolbar to save the changes
  7. Close the VB Editor
  8. Click Tools > Trust Center
  9. Click Macro Security
  10. Set Macro Security to “Warnings for all macros”
  11. Click OK
  12. Close Outlook
  13. Start Outlook. Outlook will display a dialog-box warning that ThisOutlookSession contains macros and asking if you want to allow them to run. Say yes.

Outlook 2010.

  1. Start Outlook
  2. Click Tools > Macro > Visual Basic Editor
  3. If not already expanded, expand Microsoft Office Outlook Objects and click on ThisOutlookSession
  4. Copy the code from the Code Snippet box and paste it into the right-hand pane of Outlook’s VB Editor window
  5. Edit the code as needed. I included comment lines wherever something needs to or can change
  6. Click the diskette icon on the toolbar to save the changes
  7. Close the VB Editor
  8. Click File and select Options
  9. When the Outlook Options dialog appears click Trust Center then click the Trust Center Settings button
  10. Click Macro Settings
  11. Select either of the two bottom settings (i.e. “Notifications for all macros” or “Enable all macros (not recommended; potentially dangerous code can run)”. The choice of which to chose is up to you. If you select “Notifications”, then you’ll be prompted at times to enable macros. If you pick “Enable all” then there’s a chance that a malicious macro could run. It’s a question of how much risk you want to assume.
  12. Click Ok until the dialog-boxes have all closed
  13. Close Outlook
  14. Start Outlook. Outlook will display a dialog-box warning that ThisOutlookSession contains macros and asking if you want to allow them to run. Say yes.
Private Sub Application_Reminder(ByVal Item As Object)
    If Item.Class = olAppointment Then
        SendMeetingReminder Item
    End If
End Sub

Sub SendMeetingReminder(olkApt As Outlook.AppointmentItem)
    'On the next line change False to True if you want an opportunity to edit the message before it's sent.  
    'Leave it set to False if you want the message to be sent without any action on your part.
    Const EDIT_FIRST = False
    'On the next line edit the message as desired.  Both %START% and %LOCATION% are parameters that will be replaced
    'with the meeting start time and location respectively before the message is displayed/sent.
    Const MSG_TEXT = "Just a quick reminder about this meeting.<br><br>Start: <b>%START%</b><br>Location: <b>%LOCATION%</b><br><br>"
    Const MACRO_NAME = "Send Meeting Reminder"
    Dim olkRem As Outlook.MailItem, _
        olkRec As Outlook.Recipient
    If olkApt.MeetingStatus = olMeeting Then
        Set olkRem = Application.CreateItem(olMailItem)
        With olkRem
            .Subject = "Meeting Reminder: " & olkApt.Subject
            .HTMLBody = MSG_TEXT & .HTMLBody
            .HTMLBody = Replace(.HTMLBody, "%START%", Format(olkApt.Start, "ddd, mmm d at h:mm AMPM"))
            .HTMLBody = Replace(.HTMLBody, "%LOCATION%", olkApt.Location)
            For Each olkRec In olkApt.Recipients
                If (olkRec.Type <> olResource) And (olkRec.Name <> Session.CurrentUser.Name) Then
                    If Not olkRec.MeetingResponseStatus = olResponseDeclined Then
                        olkRem.Recipients.Add olkRec.Name
                    End If
                End If
            Next
            .Recipients.ResolveAll
            If EDIT_FIRST Then
                .Display
            Else
                .Send
            End If
        End With
    End If
    Set olkRem = Nothing
    Set olkRec = Nothing
End Sub
  • Revision 2

I put this revision together for Tim. Part of Tim’s job involves scheduling appointments with students leading him to ask if I could modify the code to send a reminder to the student appointments alone. After some discussion Tim and I settled on using a category to differentiate the student appointments from other appointments on his calendar. Here’s how the solution works. Tim will create a new category called “Reminder”. When Tim creates a student appointment he will assign it to the “Reminder” category. He’s not limited to using the “Reminder” category with student appointments though. Tim can assign the category to any appointment. When a reminder fires the code runs. First it checks to make sure the item that triggered the reminder is an appointment. If it is, then it checks to see if the item belongs to the “Reminder” category. If it does, then the code sends a meeting reminder email. If the triggering item isn’t an appointment or if the appointment doesn’t belong to the “Reminder” category, then nothing happens.

Instructions.

Outlook 2003 and Earlier.

  1. Start Outlook
  2. Click Tools > Macro > Visual Basic Editor
  3. If not already expanded, expand Microsoft Office Outlook Objects and click on ThisOutlookSession
  4. Copy the code from the Code Snippet box and paste it into the right-hand pane of
  5. Outlook’s VB Editor window
  6. Edit the code as needed. I included comment lines wherever something needs to or can change
  7. Click the diskette icon on the toolbar to save the changes
  8. Close the VB Editor
  9. Click Tools > Macro > Security
  10. Set the Security Level to Medium
  11. Close Outlook
  12. Start Outlook
  13. Outlook will display a dialog-box warning that ThisOutlookSession contains macros and asking if you want to allow them to run. Say yes.

Outlook 2007.

  1. Start Outlook
  2. Click Tools > Macro > Visual Basic Editor
  3. If not already expanded, expand Microsoft Office Outlook Objects and click on ThisOutlookSession
  4. Copy the code from the Code Snippet box and paste it into the right-hand pane of Outlook’s VB Editor window
  5. Edit the code as needed. I included comment lines wherever something needs to or can change
  6. Click the diskette icon on the toolbar to save the changes
  7. Close the VB Editor
  8. Click Tools > Trust Center
  9. Click Macro Security
  10. Set Macro Security to “Warnings for all macros”
  11. Click OK
  12. Close Outlook
  13. Start Outlook. Outlook will display a dialog-box warning that ThisOutlookSession contains macros and asking if you want to allow them to run. Say yes.

Outlook 2010.

  1. Start Outlook
  2. Click Tools > Macro > Visual Basic Editor
  3. If not already expanded, expand Microsoft Office Outlook Objects and click on ThisOutlookSession
  4. Copy the code from the Code Snippet box and paste it into the right-hand pane of Outlook’s VB Editor window
  5. Edit the code as needed. I included comment lines wherever something needs to or can change
  6. Click the diskette icon on the toolbar to save the changes
  7. Close the VB Editor
  8. Click File and select Options
  9. When the Outlook Options dialog appears click Trust Center then click the Trust Center Settings button
  10. Click Macro Settings
  11. Select either of the two bottom settings (i.e. “Notifications for all macros” or “Enable all macros (not recommended; potentially dangerous code can run)”. The choice of which to chose is up to you. If you select “Notifications”, then you’ll be prompted at times to enable macros. If you pick “Enable all” then there’s a chance that a malicious macro could run. It’s a question of how much risk you want to assume.
  12. Click Ok until the dialog-boxes have all closed
  13. Close Outlook
  14. Start Outlook. Outlook will display a dialog-box warning that ThisOutlookSession contains macros and asking if you want to allow them to run. Say yes.
Dim WithEvents olkReminders As Outlook.Reminders

Private Sub Application_Quit()
    Set olkReminders = Nothing
End Sub

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

Private Sub olkReminders_ReminderFire(ByVal ReminderObject As Reminder)
    Dim olkApt As Outlook.AppointmentItem
    If ReminderObject.Item.Class = olAppointment Then
        Set olkApt = ReminderObject.Item
        If olkApt.MeetingStatus = olMeeting Then
            If InCategory(olkApt, "Reminder") Then
                ReminderObject.Dismiss
                SendMeetingReminder olkApt
            End If
        End If
    End If
    Set olkApt = Nothing
End Sub

Function InCategory(olkItm As Object, strCat As String) As Boolean
    Dim arrTmp As Variant, varCat As Variant
    arrTmp = Split(olkItm.Categories, ",")
    For Each varCat In arrTmp
        If varCat = strCat Then
            InCategory = True
            Exit For
        End If
    Next
End Function

Sub SendMeetingReminder(olkApt As Outlook.AppointmentItem)
    'On the next line change True to False if you want the reminder to send without giving you the chance to edit it.
    'Leave it set to True if you want an opportunity to edit the message before sending it.
    Const EDIT_FIRST = True
    'On the next line edit the message as desired.  Both %START% and %LOCATION% are parameters that will be replaced
    'with the meeting start time and location respectively before the message is displayed/sent.
    Const MSG_TEXT = "Just a quick reminder about this meeting.<br><br>Start: <b>%START%</b><br>Location: <b>%LOCATION%</b><br><br>"
    Const MACRO_NAME = "Send Meeting Reminder"
    Dim olkRem As Outlook.MailItem, _
        olkRec As Outlook.RECIPIENT
    On Error Resume Next
    Set olkRem = Application.CreateItem(olMailItem)
    With olkRem
        .Subject = "Meeting Reminder: " & olkApt.Subject
        .HTMLBody = MSG_TEXT & .HTMLBody
        .HTMLBody = Replace(.HTMLBody, "%START%", Format(olkApt.Start, "ddd, mmm d at h:mm AMPM"))
        .HTMLBody = Replace(.HTMLBody, "%LOCATION%", olkApt.Location)
        For Each olkRec In olkApt.Recipients
            If (olkRec.Type <> olResource) And (olkRec.Name <> Session.CurrentUser.Name) Then
                If Not olkRec.MeetingResponseStatus = olResponseDeclined Then
                    olkRem.Recipients.Add olkRec.Name
                End If
            End If
        Next
        .Recipients.ResolveAll
        If EDIT_FIRST Then
            .Display
        Else
            .Send
        End If
    End With
    On Error GoTo 0
    Set olkApt = Nothing
    Set olkRem = Nothing
    Set olkRec = Nothing
End Sub
  • Revision 3

I created this revision for Fred who asked me to modify rev 2 to use something other than a category as the triggering mechanism. In this version I’m using a user property that Fred will set to true if he wants to send a reminder or false if he doesn’t. Fred will add a button to either the ribbon or the quick action toolbar (QAT) that toggles the setting. Unfortunately, it’s not possible to create either of those via code, so Fred will have to create them manually. After the code I’ve included links to instructions on how to create those buttons. The button will call the ToggleReminder macro. Fred can follow the instructions from rev 2 to add the code to Outlook.

Const PRP_NAME = "ReminderMsg"

Dim WithEvents olkReminders As Outlook.Reminders

Private Sub Application_Quit()
    Set olkReminders = Nothing
End Sub

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

Private Sub olkReminders_ReminderFire(ByVal ReminderObject As Reminder)
    Dim olkApt As Outlook.AppointmentItem
    If ReminderObject.Item.Class = olAppointment Then
        Set olkApt = ReminderObject.Item
        If olkApt.MeetingStatus = olMeeting Then
            If ReminderRequested(olkApt) Then
                ReminderObject.Dismiss
                SendMeetingReminder olkApt
            End If
        End If
    End If
    Set olkApt = Nothing
End Sub

Function ReminderRequested(olkMtg As Outlook.AppointmentItem) As Boolean
    Dim olkPrp As Outlook.UserProperty
    On Error Resume Next
    Set olkPrp = olkMtg.UserProperties.Item(PRP_NAME)
    On Error GoTo 0
    If TypeName(olkPrp) <> "Nothing" Then
        ReminderRequested = olkPrp.Value
    End If
    Set olkPrp = Nothing
End Function

Sub SendMeetingReminder(olkApt As Outlook.AppointmentItem)
    'On the next line change True to False if you want the reminder to send without giving you the chance to edit it.
    'Leave it set to True if you want an opportunity to edit the message before sending it.
    Const EDIT_FIRST = True
    'On the next line edit the message as desired.  Both %START% and %LOCATION% are parameters that will be replaced
    'with the meeting start time and location respectively before the message is displayed/sent.
    Const MSG_TEXT = "Just a quick reminder about this meeting.<br><br>Start: <b>%START%</b><br>Location: <b>%LOCATION%</b><br><br>"
    Const MACRO_NAME = "Send Meeting Reminder"
    Dim olkRem As Outlook.MailItem, _
        olkRec As Outlook.RECIPIENT
    On Error Resume Next
    Set olkRem = Application.CreateItem(olMailItem)
    With olkRem
        .Subject = "Meeting Reminder: " & olkApt.Subject
        .HTMLBody = MSG_TEXT & .HTMLBody
        .HTMLBody = Replace(.HTMLBody, "%START%", Format(olkApt.Start, "ddd, mmm d at h:mm AMPM"))
        .HTMLBody = Replace(.HTMLBody, "%LOCATION%", olkApt.Location)
        For Each olkRec In olkApt.Recipients
            If (olkRec.Type <> olResource) And (olkRec.Name <> Session.CurrentUser.Name) Then
                If Not olkRec.MeetingResponseStatus = olResponseDeclined Then
                    olkRem.Recipients.Add olkRec.Name
                End If
            End If
        Next
        .Recipients.ResolveAll
        If EDIT_FIRST Then
            .Display
        Else
            .Send
        End If
    End With
    On Error GoTo 0
    Set olkApt = Nothing
    Set olkRem = Nothing
    Set olkRec = Nothing
End Sub

Sub ToggleReminder()
    Dim olkApt As Outlook.AppointmentItem, olkPrp As Outlook.UserProperty
    Select Case TypeName(Application.ActiveWindow)
        Case "Explorer"
            Set olkApt = Application.ActiveExplorer.Selection(1)
        Case "Inspector"
            Set olkApt = Application.ActiveInspector.CurrentItem
    End Select
    If TypeName(olkApt) <> "Nothing" Then
        If olkApt.Class = olAppointment Then
            On Error Resume Next
            Set olkPrp = olkApt.UserProperties.Item(PRP_NAME)
            On Error GoTo 0
            If TypeName(olkPrp) = "Nothing" Then
                Set olkPrp = olkApt.UserProperties.Add(PRP_NAME, olYesNo)
                olkPrp.Value = True
            Else
                olkPrp.Value = Not olkPrp.Value
            End If
            olkApt.Save
            MsgBox "The reminder message setting for this appoint is now " & IIf(olkPrp.Value = True, "on", "off") & ".", vbInformation + vbOKOnly, "Toggle Reminder Message"
        End If
    End If
    Set olkApt = Nothing
    Set olkPrp = Nothing
End Sub

Adding Buttons to Run the ToggleReminder Macro.

  • Outlook 2007. Follow these instructions to add a toolbar button that runs the macro.
  • Outlook 2010. Follow these instructions to add the macro to the QAT.

168 comments on “Sending a Meeting Reminder Email in Outlook

  1. Hi, Can I just say this whole page is incredible, it gives a chance for people who know very little about programming to customise there generic office output – brilliant!

    I have been looking at this to try and incorporate as many options as possible I’m not sure what the best format for this is, so if I write a list hopefully it’ll make sense?

    I’m currently trying to automatically send reminders for “Meeting” category to ALL of those people that HAVE NOT declined. So the reminder will go out to those who have accepted, those who tentatively accepted and those who have not responded.

    Changes I’ve cut and pasted in from other posts…

    I’d like to include the reminder to have recipients Bcc’d rather than To

    I have taken out the dismiss reminder as I would like to know when this is happening so I can check the emails are sent out accordingly.

    Here are my ideals;

    1. I’d like to simple display the date as “Wed 03/11/2016 at 10:30am” I don’t need to include the time zone because I only deal locally to my time zone.
    2. I’d like to include the message body of the original invite OR include an email signature so that the email is ‘branded’ in some way.
    3. I’d like to show the font of the message in the stationery “standard” format in my mailbox settings.

    Is this possible?

    The other issue I have had is that it only sends to the first person invited and not the others, for example. I send an email reminder to P1, P2, P3, P4 the email only goes to P1. I’d like it to go to all recipients – where am I going wrong?

    My (pigeon) text is below…

    Const PRP_NAME = "ReminderMsg"
       
    Dim WithEvents olkReminders As Outlook.Reminders
       
    Private Sub Application_Quit()
        Set olkReminders = Nothing
    End Sub
       
    Private Sub Application_Startup()
        Set olkReminders = Application.Reminders
    End Sub
       
    Private Sub olkReminders_ReminderFire(ByVal ReminderObject As Reminder)
        Dim olkApt As Outlook.AppointmentItem
        If ReminderObject.Item.Class = olAppointment Then
            Set olkApt = ReminderObject.Item
            If olkApt.MeetingStatus = olMeeting Then
                If InCategory(olkApt, "Meeting") Then
                    ReminderObject.Dismiss
                    SendMeetingReminder olkApt
                End If
            End If
        End If
        Set olkApt = Nothing
    End Sub
     
    Function InCategory(olkItm As Object, strCat As String) As Boolean
        Dim arrTmp As Variant, varCat As Variant
        arrTmp = Split(olkItm.Categories, ",")
        For Each varCat In arrTmp
            If varCat = strCat Then
                InCategory = True
                Exit For
            End If
        Next
    End Function
       
    Sub SendMeetingReminder(olkApt As Outlook.AppointmentItem)
        'On the next line change True to False if you want the reminder to send without giving you the chance to edit it.
        'Leave it set to True if you want an opportunity to edit the message before sending it.
        Const EDIT_FIRST = False
        'On the next line edit the message as desired.  Both %START% and %LOCATION% are parameters that will be replaced
        'with the meeting start time and location respectively before the message is displayed/sent.
        Const MSG_TEXT = "Just a quick reminder about this meeting.Start: <b>%START%</b>Location: <b>%LOCATION%</b>"
        Const MACRO_NAME = "Send Meeting Reminder"
        Dim olkRem As Outlook.MailItem, _
            olkRec As Outlook.Recipient
        On Error Resume Next
        Set olkRem = Application.CreateItem(olMailItem)
        With olkRem
            .Subject = "Meeting Reminder: " & olkApt.Subject
            .HTMLBody = MSG_TEXT & .HTMLBody
            .HTMLBody = Replace(.HTMLBody, "%START%", Format(olkApt.StartInStartTimeZone, "ddd, mmm d at h:mm AMPM") & " " & olkApt.StartTimeZone.Name)
            .HTMLBody = Replace(.HTMLBody, "%LOCATION%", olkApt.Location)
            For Each olkRec In olkApt.Recipients
                If (Not olkRec.Type = olResource) And (Not olkRec.Name = Session.CurrentUser.Name) Then
                    If Not olkRec.MeetingResponseStatus = olResponseDeclined Then
                        Set olkTmp = olkRem.Recipients.Add(olkRec.Name)
                            olkTmp.Type = olBCC
                    End If
                End If
            Next
            .Recipients.ResolveAll
            If EDIT_FIRST Then
                .Display
            Else
                .Send
            End If
        End With
        On Error GoTo 0
        Set olkApt = Nothing
        Set olkRem = Nothing
        Set olkRec = Nothing
    End Sub
       
    Sub ToggleReminder()
        Dim olkApt As Outlook.AppointmentItem, olkPrp As Outlook.UserProperty
        Select Case TypeName(Application.ActiveWindow)
            Case "Explorer"
                Set olkApt = Application.ActiveExplorer.Selection(1)
            Case "Inspector"
                Set olkApt = Application.ActiveInspector.CurrentItem
        End Select
        If TypeName(olkApt)  "Nothing" Then
            If olkApt.Class = olAppointment Then
                On Error Resume Next
                Set olkPrp = olkApt.UserProperties.Item(PRP_NAME)
                On Error GoTo 0
                If TypeName(olkPrp) = "Nothing" Then
                    Set olkPrp = olkApt.UserProperties.Add(PRP_NAME, olYesNo)
                    olkPrp.Value = True
                Else
                    olkPrp.Value = Not olkPrp.Value
                End If
                olkApt.Save
                MsgBox "The reminder message setting for this appoint is now " & IIf(olkPrp.Value = True, "on", "off") & ".", vbInformation + vbOKOnly, "Toggle Reminder Message"
            End If
        End If
        Set olkApt = Nothing
        Set olkPrp = Nothing
    End Sub
    
    • Hi, Sarah.

      Thank you for those very kind words.

      I’ve modified the code in the SendMeetingReminder subroutine to do most of what you asked for. Specifically it

      1. places the recipients on the BCC line
      2. displays the date in the format you gave
      3. should use the font you’ve set since it is creating a message from your profile and should therefore pick up any settings defined in your profile

      I can further modify it to use a signature or brand the message in some fashion. Do you have a signature already defined? I can use it if you do, or if you want to create one. Otherwise, I can add branding, I just need to know what that should look like. I can also copy in the body of the original appointment, if that’s what you’d prefer. A signature/brand would probably be better. I can also have the code attach a copy of the original appointment. That’d allow a recipient to add it to their calendar in case they didn’t have the original invite.

      Replace the SendMeetingReminder subroutine from the original code with the version below.

      Sub SendMeetingReminder(olkApt As Outlook.AppointmentItem)
          'On the next line change True to False if you want the reminder to send without giving you the chance to edit it.
          'Leave it set to True if you want an opportunity to edit the message before sending it.
          Const EDIT_FIRST = False
          'On the next line edit the message as desired.  Both %START% and %LOCATION% are parameters that will be replaced
          'with the meeting start time and location respectively before the message is displayed/sent.
          Const MSG_TEXT = "Just a quick reminder about this meeting:<br><br>Start: <b>%START%</b><br>Location: <b>%LOCATION%</b><br><hr>"
          Const MACRO_NAME = "Send Meeting Reminder"
          Dim olkRem As Outlook.MailItem, _
              olkRec As Outlook.recipient, _
              olkTmp As Outlook.recipient
          On Error Resume Next
          Set olkRem = Application.CreateItem(olMailItem)
          With olkRem
              .Subject = "Meeting Reminder: " & olkApt.Subject
              .HTMLBody = MSG_TEXT & .HTMLBody
              .HTMLBody = Replace(.HTMLBody, "%START%", VBA.Format(olkApt.StartInStartTimeZone, "ddd, mmm d at h:mm AMPM"))
              .HTMLBody = Replace(.HTMLBody, "%LOCATION%", olkApt.Location)
              For Each olkRec In olkApt.Recipients
                  If (Not olkRec.Type = olResource) And (Not olkRec.Name = Session.CurrentUser.Name) Then
                      If Not olkRec.MeetingResponseStatus = olResponseDeclined Then
                          Set olkTmp = olkRem.Recipients.Add(olkRec.Name)
                          olkTmp.Type = olBCC
                      End If
                  End If
              Next
              .Recipients.ResolveAll
              If EDIT_FIRST Then
                  .Display
              Else
                  .Send
              End If
          End With
          On Error GoTo 0
          Set olkApt = Nothing
          Set olkRem = Nothing
          Set olkRec = Nothing
      End Sub
      
    • Hi David,

      Great tool, thank you so much for sharing this.

      I’m trying to get this to work under the following specifications in an Outlook 2013 environment.

      1. Email message includes attachments
      2. Reminder email includes the original text in meeting appointment.
      3. Email message only goes to accepted and tentative attendees.
      4. Email is sent the business day before each meeting in an entire series

      #1 I think works fine because I used the text from another post here. I am trying to get #2-4 to work. Can you assist?

      Many thanks.

      Sub SendMeetingReminder()
      ‘On the next line change True to False if you want the reminder to send without giving you the chance to edit it.
      ‘Leave it set to True if you want an opportunity to edit the message before sending it.
      Const EDIT_FIRST = True
      ‘On the next line edit the message as desired. Both %START% and %LOCATION% are parameters that will be replaced
      ‘with the meeting start time and location respectively before the message is displayed/sent.
      Const MSG_TEXT = “Just a quick reminder about this meeting.Start: %START%Location: %LOCATION%
      Const MACRO_NAME = “Send Meeting Reminder”
      Const ERR_MSG = “You must select an appointment for this macro to work.”
      Dim olkApt As Object, _
      olkRem As Outlook.MailItem, _
      olkRec As Outlook.Recipient
      On Error Resume Next
      Select Case TypeName(Application.ActiveWindow)
      Case “Explorer”
      Set olkApt = Application.ActiveExplorer.Selection(1)
      Case “Inspector”
      Set olkApt = Application.ActiveInspector.CurrentItem
      End Select
      If TypeName(olkApt) “Nothing” Then
      If olkApt.Class = olAppointment Then
      Set olkRem = Application.CreateItem(olMailItem)
      With olkRem
      .Subject = “Meeting Reminder: ” & olkApt.Subject
      .HTMLBody = MSG_TEXT & .HTMLBody
      .HTMLBody = Replace(.HTMLBody, “%START%”, Format(olkApt.Start, “ddd, mmm d at h:mm AMPM”))
      .HTMLBody = Replace(.HTMLBody, “%LOCATION%”, olkApt.Location)
      ‘On the next four lines edit the path to the files you want to attach to the reminders.
      .Attachments.Add “c:\users\jared\documents\file1.xlsx”
      .Attachments.Add “c:\users\jared\documents\file2.xlsx”
      .Attachments.Add “c:\users\jared\documents\file3.xlsx”
      .Attachments.Add “c:\users\jared\documents\file4.xlsx”
      For Each olkRec In olkApt.Recipients
      If (olkRec.Type olResource) And (olkRec.Name Session.CurrentUser.Name) Then
      If Not olkRec.MeetingResponseStatus = olResponseDeclined Then
      olkRem.Recipients.Add olkRec.Name
      End If
      End If
      Next
      .Recipients.ResolveAll
      If EDIT_FIRST Then
      .Display
      Else
      .Send
      End If
      End With
      Else
      MsgBox ERR_MSG, vbCritical + vbOKOnly, MACRO_NAME
      End If
      Else
      MsgBox ERR_MSG, vbCritical + vbOKOnly, MACRO_NAME
      End If
      On Error GoTo 0
      Set olkApt = Nothing
      Set olkRem = Nothing
      Set olkRec = Nothing
      End Sub

    • Hi, Sean.

      You’re welcome. I’m glad you like the solution.

      All of your changes are simple save for #4. Are you saying you want the system to send the reminder automatically? If so, then that requires a different approach. As is, the solution is designed to be run manually or when Outlook reminds you of the meeting. That isn’t going to work for your requirement of “Email is sent the business day before each meeting in an entire series”. For that you want a solution that runs every morning and checks to see if there are any appointments on the next business day that require a reminder. The best approach for that is to take the script out of Outlook and run it from Windows Task Scheduler. Regardless of where the code runs from, there are a couple of issues you need to be aware of. First, your computer must be on the business day before the next meeting in order for the solution to work. If it’s not, then the solution cannot run and send a reminder. Second, while the solution can determine most non-business days, it may not be able to detect them all. Detecting Saturdays and Sundays is simple, but national holidays and office holidays are a problem. You’d need some means of identifying those for the solution so it can accurately determine the next business day.

  2. Very good stuff here. For my job, I hold multiple Cross-Functional meetings per week. I find that usually 40%-60% of attendees respond (Yes, they are not very fun meetings), which leads me to chase down those who have not responded one day before to see if there is enough quorum to actually hold the meeting.

    If there were a way to remind people 1 day before who either did not respond, or marked there response as tentative, it would make my life a lot easier! I’m actually kind of surprised this isn’t included as an Outlook function.

    • Hi, Eric.

      Thanks!

      Yes, that’s possible. Outlook doesn’t have a built-in means of running scripts on a schedule, so the best solution is to do this outside of Outlook. The solution I recommend is a script that’s scheduled to run using Windows’ built-in task scheduler. You could set the script to run each morning at some set time. It would process all of the appointments for the following day. On Fridays, it would process the appointments for Monday.

      Do you want the solution to send one message to all the invitees that didn’t respond or responded as tentative, or do you prefer individual messages?

  3. Hello David, this is very very useful! thank you so much for sharing your knowledge!😀

    I’ve used your original code and it works perfectly. However the reminder being sent out is a normal text email where participants would not be able to respond. I wonder if you could make it possible that in that reminder mail, the participants would be able to respond to the meeting invite (click accept, decline, tentative)?

    Thanks in advance!

    • Hi, Ruth.

      You’re welcome!

      The reminder only goes to people who have already accepted the meeting invite. Note that “tentative” is a form of acceptance. Why would you want the reminder to include an option for accepting a meeting they’ve already accepted?

    • Hello david! thanks for attending to my concern.🙂

      Im thinking of sending it out even to those who responded tentative so that in case by that time we remind them, they might be able to confirm whether they’re joining or not.

      Anyway, if in case the reminder would just be sent out to those who have not responded, is it possible to include that accept or decline button to the meeting invite so it would be convenient for them to respond?

      Thanks, Ruth

    • Hi, Ruth.

      No, there’s no way to include accept or decline buttons in an email. You could of course send an email that includes “Accept” and “Decline” voting buttons, but their responses would not update the meeting status. The only way to update the meeting status is to send a meeting update. Using a meeting update as a reminder isn’t a good solution. First, meeting updates go either to all meeting attendees or to those attendees that have been added or removed. In the context of a reminder, you’d probably send it to all attendees. That means attendees who have already accepted will be prompted to accept again. That’ll probably annoy many of them. Second, if you add a reminder message (e.g. Don’t forget about today’s meeting), then that text will be permanently added to the meeting itself.

      You could send a reminder email and attach a copy of the meeting to it. Your reminder would tell them that they can accept the meeting by opening the attached meeting and accepting it. That will add the meeting to their calendar, but I don’t believe it will update their status in the actual meeting.

  4. Hi David,

    What an amazing job you have done here.
    I have a question about the content of the reminder. I have changed the first three lines to .HTMLBody = olkApt.Body and it shows the body perfect, but is there anyways to also include the attachments in the body? I have to send out excel spread sheet with these meetings and i want them to automatically receive them along with the body message. Is there any possible way to do this?

    • Hi, Jared.

      Thanks!

      Sure, this is easily done. Will the attachments come from the appointment the reminder is for, or will they come from some other source?

    • Yes, i have to paste 4 different Excel Attachments in each appointment body, and i would like those to send out as well as the body of the appointment to each attendee.

      Just to give you an idea of what i am doing.
      I have to create an inventory counting schedule for four different warehouses and i have created a reoccurring schedule of what must be counted everyday for several months. Each excel attachment is a spread sheet of what items are included to count for that day. I would really like each appointment (or what they must count for that day) to send out when i have scheduled the appointment for. And for that to include the specific instructions (the body), as well at the 4 different attachments. So really i am needing a reoccuring email sent out to each attendee, at the beginning of the appointment, so they can have their spreadsheets without me having to email each person every single day.

      Hope this helps you understand a little bit more,

    • Hi, Jared.

      I’m assuming that you’re using the code from my original post and not one of the revisions. If so, then here’s a modified version of that code that allows for attachments.

      Sub SendMeetingReminder()
          'On the next line change True to False if you want the reminder to send without giving you the chance to edit it.
          'Leave it set to True if you want an opportunity to edit the message before sending it.
          Const EDIT_FIRST = True
          'On the next line edit the message as desired.  Both %START% and %LOCATION% are parameters that will be replaced
          'with the meeting start time and location respectively before the message is displayed/sent.
          Const MSG_TEXT = "Just a quick reminder about this meeting.<br><br>Start: <b>%START%</b><br>Location: <b>%LOCATION%</b><br><br>"
          Const MACRO_NAME = "Send Meeting Reminder"
          Const ERR_MSG = "You must select an appointment for this macro to work."
          Dim olkApt As Object, _
              olkRem As Outlook.MailItem, _
              olkRec As Outlook.Recipient
          On Error Resume Next
          Select Case TypeName(Application.ActiveWindow)
              Case "Explorer"
                  Set olkApt = Application.ActiveExplorer.Selection(1)
              Case "Inspector"
                  Set olkApt = Application.ActiveInspector.CurrentItem
          End Select
          If TypeName(olkApt) <> "Nothing" Then
              If olkApt.Class = olAppointment Then
                  Set olkRem = Application.CreateItem(olMailItem)
                  With olkRem
                      .Subject = "Meeting Reminder: " & olkApt.Subject
                      .HTMLBody = MSG_TEXT & .HTMLBody
                      .HTMLBody = Replace(.HTMLBody, "%START%", Format(olkApt.Start, "ddd, mmm d at h:mm AMPM"))
                      .HTMLBody = Replace(.HTMLBody, "%LOCATION%", olkApt.Location)
                      'On the next four lines edit the path to the files you want to attach to the reminders.
                      .Attachments.Add "c:\users\jared\documents\file1.xlsx"
                      .Attachments.Add "c:\users\jared\documents\file2.xlsx"
                      .Attachments.Add "c:\users\jared\documents\file3.xlsx"
                      .Attachments.Add "c:\users\jared\documents\file4.xlsx"
                      For Each olkRec In olkApt.Recipients
                          If (olkRec.Type <> olResource) And (olkRec.Name <> Session.CurrentUser.Name) Then
                              If Not olkRec.MeetingResponseStatus = olResponseDeclined Then
                                  olkRem.Recipients.Add olkRec.Name
                              End If
                          End If
                      Next
                      .Recipients.ResolveAll
                      If EDIT_FIRST Then
                          .Display
                      Else
                          .Send
                      End If
                  End With
              Else
                  MsgBox ERR_MSG, vbCritical + vbOKOnly, MACRO_NAME
              End If
          Else
              MsgBox ERR_MSG, vbCritical + vbOKOnly, MACRO_NAME
          End If
          On Error GoTo 0
          Set olkApt = Nothing
          Set olkRem = Nothing
          Set olkRec = Nothing
      End Sub
      
  5. Hi David, This is great! I only have one problem. I tried using the top two codes above, the automatic email and the non automatic. The problem I am running into is that in the email address code it lists it like this Amanda Sawabini . But when I click on the Macro button and it opens up a new email, it only lists out Amanda Sawabini, no email address. The same thing happens if I use the automatic, it says there is not a valid email address. These are students that are scheduling with me through an outside scheduling app. The email address comes in that way from the schedule app (timetrade). Is there a way to make it so that it grabs the email address and not just the name? Their name is not in my outlook address book because they are new or potential student appointments.

    • Hi, Brooke.

      Thanks!

      Sure, that’s possible. Change this line

      olkRem.Recipients.Add olkRec.Name
      

      to

      olkRem.Recipients.Add olkRec.Address
      
    • HI David,
      Thank you so much for the update. It is working. I have found that when my computer times out, like in the evening, it is not sending the automatic replies, even though I put “false” on the “Const EDIT_FIRST =” line. Is there a way to have it send the automatic emails, even when the computer is in sleep mode or timed out?

    • Hi, Brooke.

      You’re welcome.

      “Is there a way to have it send the automatic emails, even when the computer is in sleep mode or timed out?”
      I’m not sure what “timed out” means, so I can’t answer that one. No, it is not possible for the solution to work when the computer is asleep. The computer can’t do anything when it’s asleep. The computer must be on, awake, and Outlook must be open and running for the solution to work. In order for a solution to work when your computer is off, asleep, or when Outlook is not running it would have to run at a server that was always on. That would mean either installing Outlook on a server or developing a solution that runs as the mail server. The latter would require an expert Exchange developer, which I am not.

    • I forgot to add that I am leaving outlook open. I am not closing it down. I found that closing it down does not send the automatic replies either. I tried leaving it open all night, but as soon as the computer timed out or went into sleep mode, it stopped sending the reminders. Example: I left for the day at 3pm on Wednesday. I had appointment scheduled for Thursday at 4pm. I set the Thursday 4pm appointment to “reminder” category and “1 day” reminder. It did not send the email on Wednesday at 4pm to remind the student.

  6. Hi David,
    I used your revision that sends an email upon the Reminder Fire, and edited it to send it to a specific email.

    After applying the macro, I do get the email as I had hoped, but now the reminder does not pop up on my computer.

  7. Hi David,
    Thanks for this. Is it possible to modify the code so that it sends the reminder for people who either did not reply and tentatively accepted the meeting?

    • Hi, Jon.

      You’re welcome!

      Yes, that’s doable. Change this block of code

                      For Each olkRec In olkApt.Recipients
                          If (olkRec.Type <> olResource) And (olkRec.Name <> Session.CurrentUser.Name) Then
                              If Not olkRec.MeetingResponseStatus = olResponseDeclined Then
                                  olkRem.Recipients.Add olkRec.Name
                              End If
                          End If
                      Next
      

      to

                      For Each olkRec In olkApt.Recipients
                          If (olkRec.Type <> olResource) And (olkRec.Name <> Session.CurrentUser.Name) Then
                              Select Case olkRec.MeetingResponseStatus
                                  Case olResponseNone, olResponseTentative
                                      olkRem.Recipients.Add olkRec.Name
                              End Select
                          End If
                      Next
      

      With that change in place the solution will only send the reminder message to those recipients who have not responded or who gave a tentative response.

  8. Pingback: Problems With Reminders In Outlook 2010 - ORG.org

  9. Pingback: Outlook 2003 Not Sending Emails Problem - ORG.org

  10. Pingback: Outlook Calendar Appointment Reminder Email | OutlookRecoveryGuide.org

  11. Pingback: Outlook Calendar Appointment Reminder | OutlookRecoveryGuide.org

  12. Hi David,

    Great work. This is something I have been looking for to help my team. I wonder can this be modified to suit our purposes. We have three Outlook calendars we use for users to schedule meeting rooms and projector request. Plenty of times throughout the busy day we forget to check these calendars and the projectors are missed for the users meetings.

    That being said is there a way to have the script e-mail an email list or to one particular email but none that are in the meeting. I.E. the email goes to the Help Desk.

    Second could this process be automated once someone opens Outlook? Thanks in advance.

    • Hi, Will.

      Yes, it is possible to have the code run automatically and for it to send a message to a single address. The code below is knock-off of rev #2. It will send a message to the help desk address for every meeting reminder. Reminders are global, so for this to work the way you want it to (i.e. only get reminders for those three calendars) you have two choices. One, create a profile that contains only those calendars. Two, modify the code to check to see which calendar the appointment that generated the reminder is on. I can make that change, I just need to know which approach you want to go with.

      Dim WithEvents olkReminders As Outlook.Reminders
       
      Private Sub Application_Quit()
          Set olkReminders = Nothing
      End Sub
       
      Private Sub Application_Startup()
          Set olkReminders = Application.Reminders
      End Sub
       
      Private Sub olkReminders_ReminderFire(ByVal ReminderObject As Reminder)
          Dim olkApt As Outlook.AppointmentItem
          If ReminderObject.Item.Class = olAppointment Then
              Set olkApt = ReminderObject.Item
              If olkApt.MeetingStatus = olMeeting Then
                  ReminderObject.Dismiss
                  SendMeetingReminder olkApt
              End If
          End If
          Set olkApt = Nothing
      End Sub
       
      Sub SendMeetingReminder(olkApt As Outlook.AppointmentItem)
          'On the next line change True to False if you want the reminder to send without giving you the chance to edit it.
          'Leave it set to True if you want an opportunity to edit the message before sending it.
          Const EDIT_FIRST = True
          'On the next line edit the message as desired.  Both %START% and %LOCATION% are parameters that will be replaced
          'with the meeting start time and location respectively before the message is displayed/sent.
          Const MSG_TEXT = "Just a quick reminder about this meeting.<br><br>Start: <b>%START%</b><br>Location: <b>%LOCATION%</b><br><br>"
          Const MACRO_NAME = "Send Meeting Reminder"
          Dim olkRem As Outlook.MailItem, _
              olkRec As Outlook.RECIPIENT
          On Error Resume Next
          Set olkRem = Application.CreateItem(olMailItem)
          With olkRem
              .Subject = "Meeting Reminder: " & olkApt.Subject
              .HTMLBody = MSG_TEXT & .HTMLBody
              .HTMLBody = Replace(.HTMLBody, "%START%", Format(olkApt.Start, "ddd, mmm d at h:mm AMPM"))
              .HTMLBody = Replace(.HTMLBody, "%LOCATION%", olkApt.Location)
              .Recipients.Add "helpdesk@company.com"
              .Recipients.ResolveAll
              If EDIT_FIRST Then
                  .Display
              Else
                  .Send
              End If
          End With
          On Error GoTo 0
          Set olkApt = Nothing
          Set olkRem = Nothing
          Set olkRec = Nothing
      End Sub
      
  13. Hi David, This is a fantastic tool that we are trying to implement across the board. I have been playing with it to try and work for our organization and have hit a road bump.

    For our purposes we run workshops to groups of people who have independently signed up making privacy of our participants emails very important. I cant seem to find a way to automatically BCC instead of To for our input emails.

    We are hoping to fire off a reminder 48 hours before the appointment begins with a custom body of text as well as the location and time reminder.

    Thanks again for this wonderful macro that we will hopefully have implemented quite soon.

    • Hi, Daniel.

      Thanks!

      I want to make sure I correctly understand what you want. Are you asking for a modification that sends the reminder anonymously (i.e. the recipients are all BCC’d) to all attendees?

    • Daniel,

      That’s simple enough. This version of the code will add the recipients on the BCC line instead of the To line.

      Sub SendMeetingReminder()
          'On the next line change True to False if you want the reminder to send without giving you the chance to edit it.
          'Leave it set to True if you want an opportunity to edit the message before sending it.
          Const EDIT_FIRST = True
          'On the next line edit the message as desired.  Both %START% and %LOCATION% are parameters that will be replaced
          'with the meeting start time and location respectively before the message is displayed/sent.
          Const MSG_TEXT = "Just a quick reminder about this meeting.<br><br>Start: <b>%START%</b><br>Location: <b>%LOCATION%</b><br><br>"
          Const MACRO_NAME = "Send Meeting Reminder"
          Const ERR_MSG = "You must select an appointment for this macro to work."
          Dim olkApt As Object, _
              olkRem As Outlook.MailItem, _
              olkRec As Outlook.RECIPIENT, _
              olkTmp As Outlook.RECIPIENT
          On Error Resume Next
          Select Case TypeName(Application.ActiveWindow)
              Case "Explorer"
                  Set olkApt = Application.ActiveExplorer.Selection(1)
              Case "Inspector"
                  Set olkApt = Application.ActiveInspector.CurrentItem
          End Select
          If TypeName(olkApt) <> "Nothing" Then
              If olkApt.Class = olAppointment Then
                  Set olkRem = Application.CreateItem(olMailItem)
                  With olkRem
                      .Subject = "Meeting Reminder: " & olkApt.Subject
                      .HTMLBody = MSG_TEXT & .HTMLBody
                      .HTMLBody = Replace(.HTMLBody, "%START%", Format(olkApt.Start, "ddd, mmm d at h:mm AMPM"))
                      .HTMLBody = Replace(.HTMLBody, "%LOCATION%", olkApt.Location)
                      For Each olkRec In olkApt.Recipients
                          If (olkRec.Type <> olResource) And (olkRec.Name <> Session.CurrentUser.Name) Then
                              If Not olkRec.MeetingResponseStatus = olResponseDeclined Then
                                  Set olkTmp = olkRem.Recipients.Add(olkRec.Name)
                                  olkTmp.Type = olBCC
                              End If
                          End If
                      Next
                      .Recipients.ResolveAll
                      If EDIT_FIRST Then
                          .Display
                      Else
                          .Send
                      End If
                  End With
              Else
                  MsgBox ERR_MSG, vbCritical + vbOKOnly, MACRO_NAME
              End If
          Else
              MsgBox ERR_MSG, vbCritical + vbOKOnly, MACRO_NAME
          End If
          On Error GoTo 0
          Set olkApt = Nothing
          Set olkRem = Nothing
          Set olkRec = Nothing
          Set olkTmp = Nothing
      End Sub
      
  14. Hi David,
    I used the first code in your reply to john. When I run the macro, It mentions that the “Reminder for this meeting is on”, I don’t mind sending manual reminder as and when required to people who haven’t accepted the invite. Do let me know how to resolve this issue. I am using outlook 2013.

    • Hi, Raghu.

      Sorry, but I don’t understand the issue. Are you saying that you want to send a reminder for all meetings as opposed to choosing which meetings you send a reminder for?

  15. Is it possible to get this notification like 15 minutes before the meeting is beeing scheduled? Like a reminder but as an email.. I’m really tired of the Outlook notification in the bottom right of the screen.

    • Hi, Gustaf.

      The solution does send a reminder email. You can control how many minutes before the meeting the solution sends the reminder, by changing each appointment’s reminder time. For example, if you set the meeting reminder to 15 minutes, then the solution will send the reminder 15 minutes before the meeting begins.

  16. Hi David,

    Is it possible to create a reminder that sends the body text of the original appointment?

    I’m generally scheduling webinar meetings which have the instructions on how to log on. Sending a reminder with the body of the original appointment allows for easier access to the instructions.

    If that’s not possible is there a script to send a forward of the original appointment adding the reminder text?

    • Hi, Troy.

      Yes, that’s possible. To do that, replace these three lines

      .HTMLBody = MSG_TEXT & .HTMLBody
      .HTMLBody = Replace(.HTMLBody, "%START%", Format(olkApt.Start, "ddd, mmm d at h:mm AMPM"))
      .HTMLBody = Replace(.HTMLBody, "%LOCATION%", olkApt.Location)
      

      with this line

      .HTMLBody = olkApt.Body
      
  17. David we are trying to get this functionality on our Outlook. We use Outlook 2013/Office 365. I have tried all 3 revisions of the posted above code, and can’t seem to get it to work. The first code works partly, but sends the notification only after I click the button we created or select the macro or at the time of the event (not when we get our notifications). I want it to automatically fire the reminder email before the meeting time to users invited to the meeting, no matter if they have outlook. I tried version two of the code, and could never get it to work. A Macro didn’t even show up, and I made sure to have the “Reminder” category added. Still no luck with that on a meeting. The third code gives me the On/Off popup and seems to be working upon clicking okay on the pop-up, but even when it’s on it doesn’t send any email. The third one seems most aligned with the functionality we need. I would prefer it just notify without clicking a button, but the toggle button is fine if that’s the only way to get it to work. We need it to be able to send a notification earlier than the meeting time, and not have to go into each meeting and tell it to send.

    All Macro securities are off. I have added some of the functionality from the comments such as Time Zone added to it as well. The code is in the ThisOutlookSection of VB editor. Below is my code. Can you check and come up with any ideas I haven’t thought of? Thanks.

    Const PRP_NAME = "ReminderMsg"
     
    Dim WithEvents olkReminders As Outlook.Reminders
     
    Private Sub Application_Quit()
        Set olkReminders = Nothing
    End Sub
     
    Private Sub Application_Startup()
        Set olkReminders = Application.Reminders
    End Sub
     
    Private Sub olkReminders_ReminderFire(ByVal ReminderObject As Reminder)
        Dim olkApt As Outlook.AppointmentItem
        If ReminderObject.Item.Class = olAppointment Then
            Set olkApt = ReminderObject.Item
            If olkApt.MeetingStatus = olMeeting Then
                If ReminderRequested(olkApt) Then
                    ReminderObject.Dismiss
                    SendMeetingReminder olkApt
                End If
            End If
        End If
        Set olkApt = Nothing
    End Sub
     
    Function ReminderRequested(olkMtg As Outlook.AppointmentItem) As Boolean
        Dim olkPrp As Outlook.UserProperty
        On Error Resume Next
        Set olkPrp = olkMtg.UserProperties.Item(PRP_NAME)
        On Error GoTo 0
        If TypeName(olkPrp)  "Nothing" Then
            ReminderRequested = olkPrp.Value
        End If
        Set olkPrp = Nothing
    End Function
     
    Sub SendMeetingReminder(olkApt As Outlook.AppointmentItem)
        'On the next line change True to False if you want the reminder to send without giving you the chance to edit it.
        'Leave it set to True if you want an opportunity to edit the message before sending it.
        Const EDIT_FIRST = True
        'On the next line edit the message as desired.  Both %START% and %LOCATION% are parameters that will be replaced
        'with the meeting start time and location respectively before the message is displayed/sent.
        Const MSG_TEXT = "Just a quick reminder about this meeting.Start: <b>%START%</b>Location: <b>%LOCATION%</b>"
        Const MACRO_NAME = "Send Meeting Reminder"
        Dim olkRem As Outlook.MailItem, _
            olkRec As Outlook.Recipient
        On Error Resume Next
        Set olkRem = Application.CreateItem(olMailItem)
        With olkRem
            .Subject = "Meeting Reminder: " &amp; olkApt.Subject
            .HTMLBody = MSG_TEXT &amp; .HTMLBody
            .HTMLBody = Replace(.HTMLBody, "%START%", Format(olkApt.StartInStartTimeZone, "ddd, mmm d at h:mm AMPM") &amp; " " &amp; olkApt.StartTimeZone.Name)
            .HTMLBody = Replace(.HTMLBody, "%LOCATION%", olkApt.Location)
            For Each olkRec In olkApt.Recipients
                If (olkRec.Type  olResource) And (olkRec.Name  Session.CurrentUser.Name) Then
                    If Not olkRec.MeetingResponseStatus = olResponseDeclined Then
                        olkRem.Recipients.Add olkRec.Name
                    End If
                End If
            Next
            .Recipients.ResolveAll
            If EDIT_FIRST Then
                .Display
            Else
                .Send
            End If
        End With
        On Error GoTo 0
        Set olkApt = Nothing
        Set olkRem = Nothing
        Set olkRec = Nothing
    End Sub
     
    Sub ToggleReminder()
        Dim olkApt As Outlook.AppointmentItem, olkPrp As Outlook.UserProperty
        Select Case TypeName(Application.ActiveWindow)
            Case "Explorer"
                Set olkApt = Application.ActiveExplorer.Selection(1)
            Case "Inspector"
                Set olkApt = Application.ActiveInspector.CurrentItem
        End Select
        If TypeName(olkApt)  "Nothing" Then
            If olkApt.Class = olAppointment Then
                On Error Resume Next
                Set olkPrp = olkApt.UserProperties.Item(PRP_NAME)
                On Error GoTo 0
                If TypeName(olkPrp) = "Nothing" Then
                    Set olkPrp = olkApt.UserProperties.Add(PRP_NAME, olYesNo)
                    olkPrp.Value = True
                Else
                    olkPrp.Value = Not olkPrp.Value
                End If
                olkApt.Save
                MsgBox "The reminder message setting for this appoint is now " &amp; IIf(olkPrp.Value = True, "on", "off") &amp; ".", vbInformation + vbOKOnly, "Toggle Reminder Message"
            End If
        End If
        Set olkApt = Nothing
        Set olkPrp = Nothing
    End Sub
    
    • Hi, Jon.

      I found a couple of errors that may have more to do with copying and pasting than any changes you made. I’ve corrected them. Please try this version and let me know if it works for you.

      We can modify the code so it sends a reminder for every meeting without the need to toggle anything. That was a feature I added for another reader who wanted to pick and choose the meetings to send a reminder for.

      Const PRP_NAME = "ReminderMsg"
        
      Dim WithEvents olkReminders As Outlook.Reminders
        
      Private Sub Application_Quit()
          Set olkReminders = Nothing
      End Sub
        
      Private Sub Application_Startup()
          Set olkReminders = Application.Reminders
      End Sub
        
      Private Sub olkReminders_ReminderFire(ByVal ReminderObject As Reminder)
          Dim olkApt As Outlook.AppointmentItem
          If ReminderObject.Item.Class = olAppointment Then
              Set olkApt = ReminderObject.Item
              If olkApt.MeetingStatus = olMeeting Then
                  If ReminderRequested(olkApt) Then
                      ReminderObject.Dismiss
                      SendMeetingReminder olkApt
                  End If
              End If
          End If
          Set olkApt = Nothing
      End Sub
        
      Function ReminderRequested(olkMtg As Outlook.AppointmentItem) As Boolean
          Dim olkPrp As Outlook.UserProperty
          On Error Resume Next
          Set olkPrp = olkMtg.UserProperties.Item(PRP_NAME)
          On Error GoTo 0
          If TypeName(olkPrp) <> "Nothing" Then
              ReminderRequested = olkPrp.Value
          End If
          Set olkPrp = Nothing
      End Function
        
      Sub SendMeetingReminder(olkApt As Outlook.AppointmentItem)
          'On the next line change True to False if you want the reminder to send without giving you the chance to edit it.
          'Leave it set to True if you want an opportunity to edit the message before sending it.
          Const EDIT_FIRST = True
          'On the next line edit the message as desired.  Both %START% and %LOCATION% are parameters that will be replaced
          'with the meeting start time and location respectively before the message is displayed/sent.
          Const MSG_TEXT = "Just a quick reminder about this meeting.Start: <b>%START%</b>Location: <b>%LOCATION%</b>"
          Const MACRO_NAME = "Send Meeting Reminder"
          Dim olkRem As Outlook.MailItem, _
              olkRec As Outlook.RECIPIENT
          On Error Resume Next
          Set olkRem = Application.CreateItem(olMailItem)
          With olkRem
              .Subject = "Meeting Reminder: " & olkApt.Subject
              .HTMLBody = MSG_TEXT & .HTMLBody
              .HTMLBody = Replace(.HTMLBody, "%START%", Format(olkApt.StartInStartTimeZone, "ddd, mmm d at h:mm AMPM") & " " & olkApt.StartTimeZone.Name)
              .HTMLBody = Replace(.HTMLBody, "%LOCATION%", olkApt.Location)
              For Each olkRec In olkApt.Recipients
                  If (Not olkRec.Type = olResource) And (Not olkRec.Name = Session.CurrentUser.Name) Then
                      If Not olkRec.MeetingResponseStatus = olResponseDeclined Then
                          olkRem.Recipients.Add olkRec.Name
                      End If
                  End If
              Next
              .Recipients.ResolveAll
              If EDIT_FIRST Then
                  .Display
              Else
                  .Send
              End If
          End With
          On Error GoTo 0
          Set olkApt = Nothing
          Set olkRem = Nothing
          Set olkRec = Nothing
      End Sub
        
      Sub ToggleReminder()
          Dim olkApt As Outlook.AppointmentItem, olkPrp As Outlook.UserProperty
          Select Case TypeName(Application.ActiveWindow)
              Case "Explorer"
                  Set olkApt = Application.ActiveExplorer.Selection(1)
              Case "Inspector"
                  Set olkApt = Application.ActiveInspector.CurrentItem
          End Select
          If TypeName(olkApt) <> "Nothing" Then
              If olkApt.Class = olAppointment Then
                  On Error Resume Next
                  Set olkPrp = olkApt.UserProperties.Item(PRP_NAME)
                  On Error GoTo 0
                  If TypeName(olkPrp) = "Nothing" Then
                      Set olkPrp = olkApt.UserProperties.Add(PRP_NAME, olYesNo)
                      olkPrp.Value = True
                  Else
                      olkPrp.Value = Not olkPrp.Value
                  End If
                  olkApt.Save
                  MsgBox "The reminder message setting for this appoint is now " & IIf(olkPrp.Value = True, "on", "off") & ".", vbInformation + vbOKOnly, "Toggle Reminder Message"
              End If
          End If
          Set olkApt = Nothing
          Set olkPrp = Nothing
      End Sub
      
    • David,
      That worked great. Thank you. As far as adjusting it so it just automatically sends, can we set a certain amount of time, such as 15 or 30 minutes before an appointment, or do we have to tie it to the reminder feature? As of right now, it’s sending once I toggle it on within the create a new meeting menu, and the email is firing out once my reminder pops up. So if I set it to remind me 15 mins before, once Outlook reminds me the email fires off. Is there a way to make this automatic a certain amount of time before an appointment? Thanks again for your help with this.

    • You’re welcome, Jon.

      I’m afraid you’re stuck with the reminder feature unless you want to take a riskier approach. Here’s why. For Outlook, or for that matter any application, to take action automatically, there has to be an event to trigger the action. In Outlook, the only event we have to work with is the reminder. You can change when Outlook sends the reminder message by altering the reminder time either globally or on a per meeting basis. Unfortunately, Outlook doesn’t have a built-in timer. If it did, then I could re-write the code to check once a minute and send a reminder x minutes before an appointment starts. While Outlook doesn’t have a timer, Windows does have a timer API. If you like, I can create a version that uses it to do what I just described. I should warn you though that the timer API can crash Outlook at times and checking appointments once a minute could cause a noticeable slowdown in Outlook’s performance depending on how many appointments there are on your calendar. Do you want to give that a try, or do you prefer sticking with the reminder approach?

    • No worries. Thanks for the option. We can just stick with the toggling option. It seems to be working great. I’m going to implement on our systems after some additional testing. Thanks again, this is a really great enhancement to any Outlook user’s productivity.

    • If you’d like to eliminate the toggling, then I can modify the code to fire for every appointment with a reminder.

    • David, That might be nice. If it’s an easy change I could use that for sure. Right now I actually found a way to use the first code above to additionally to create a button in the calendar men. We will use that to highlight an upcoming meeting, click the button, and it blasts the reminder at that time. It’s nice to have both functionalities. One question with that is when I highlight a few of the meetings in the calendar at once, ctrl-click on several, it only emails a reminder to the last one I clicked on. Is there a way to make it understand I want that code to send to all of the ones I select or is this just a limitation of Outlook? Thanks.

    • Jon,

      This version does away with toggling. It sends a reminder for every meeting.

      Dim WithEvents olkReminders As Outlook.Reminders
         
      Private Sub Application_Quit()
          Set olkReminders = Nothing
      End Sub
         
      Private Sub Application_Startup()
          Set olkReminders = Application.Reminders
      End Sub
         
      Private Sub olkReminders_ReminderFire(ByVal ReminderObject As Reminder)
          Dim olkApt As Outlook.AppointmentItem
          If ReminderObject.Item.Class = olAppointment Then
              Set olkApt = ReminderObject.Item
              If olkApt.MeetingStatus = olMeeting Then
                  ReminderObject.Dismiss
                  SendMeetingReminder olkApt
              End If
          End If
          Set olkApt = Nothing
      End Sub
      
      Sub SendMeetingReminder(olkApt As Outlook.AppointmentItem)
          'On the next line change True to False if you want the reminder to send without giving you the chance to edit it.
          'Leave it set to True if you want an opportunity to edit the message before sending it.
          Const EDIT_FIRST = True
          'On the next line edit the message as desired.  Both %START% and %LOCATION% are parameters that will be replaced
          'with the meeting start time and location respectively before the message is displayed/sent.
          Const MSG_TEXT = "Just a quick reminder about this meeting.Start: <b>%START%</b>Location: <b>%LOCATION%</b>"
          Const MACRO_NAME = "Send Meeting Reminder"
          Dim olkRem As Outlook.MailItem, _
              olkRec As Outlook.RECIPIENT
          On Error Resume Next
          Set olkRem = Application.CreateItem(olMailItem)
          With olkRem
              .Subject = "Meeting Reminder: " & olkApt.Subject
              .HTMLBody = MSG_TEXT & .HTMLBody
              .HTMLBody = Replace(.HTMLBody, "%START%", Format(olkApt.StartInStartTimeZone, "ddd, mmm d at h:mm AMPM") & " " & olkApt.StartTimeZone.Name)
              .HTMLBody = Replace(.HTMLBody, "%LOCATION%", olkApt.Location)
              For Each olkRec In olkApt.Recipients
                  If (Not olkRec.Type = olResource) And (Not olkRec.Name = Session.CurrentUser.Name) Then
                      If Not olkRec.MeetingResponseStatus = olResponseDeclined Then
                          olkRem.Recipients.Add olkRec.Name
                      End If
                  End If
              Next
              .Recipients.ResolveAll
              If EDIT_FIRST Then
                  .Display
              Else
                  .Send
              End If
          End With
          On Error GoTo 0
          Set olkApt = Nothing
          Set olkRem = Nothing
          Set olkRec = Nothing
      End Sub
      

      In answer to your question about selecting and changing multiple items at once using the toggling approach, that’s doable, but not without some problems. Doing an item at a time isn’t a limitation of Outlook. It’s a design decision. The main reason I made that decision is because the act of toggling needs to report whether the toggle is on or off once you’ve flipped the switch. If I modify the code to handle multiple items at once, then how do you know what the toggle state is for any given item? Here’s an example. You select 10 appointments and click the button to toggle their reminder state. Nine of the items didn’t have a reminder set, while one of them did. You wanted a reminder for all ten, not realizing that you’d mistakenly selected an item that already had a reminder set. Now, nine of them have a reminder set and one doesn’t. How do you know which ones has the reminder turned off when it should be turned on? With the original code, you’d see the toggle state of each item after you’d flipped its switch. If I modify the code to handle multiple items, then the code would display ten dialog-boxes, one after the other. One of those dialogs would report that the toggle state was off, but you wouldn’t know which one. There are ways around that, but all of them involve either adding more code or doing things like modifying the view to show an additional field, the toggle state. Now, if you’re willing to use a category to manage the toggle state instead of a custom property, then this is easily done.

    • Sorry I should have been clearer with my explanation. I was actually using the first revision for that functionality, and it didn’t involve a toggle dialog box, but does send the message upon clicking the button. I have two sets of code. I have the first revision orginally posted above in my Modules 1 folder in the VB editor, and that’s tied to the button on the calendar page for highlighting an event and one click reminder emails. (It seems to work fine doing that, but only for one event at a time). The other code lives in the ThisOutookSession folder, and has the code for toggling the on/off reminder with reminders. There is a different button I have placed within a create a new meeting window that turns that functionality on. I was wondering if that first revision code could be altered, not the one with the toggle. This code for every meeting without the toggle is awesome. Thanks for that.

    • Jon,

      No worries. This version of the code will process all the selected items. Use it instead of the code in my original post.

      Sub SendMeetingReminder()
          Dim olkItm As Object
          Select Case TypeName(Application.ActiveWindow)
              Case "Explorer"
                  For Each olkItm In Application.ActiveExplorer.Selection
                      SendMeetingReminderMessage olkItm
                  Next
              Case "Inspector"
                  SendMeetingReminderMessage Application.ActiveInspector.CurrentItem
          End Select
          Set olkItm = Nothing
      End Sub
      
      Sub SendMeetingReminderMessage(olkApt As Object)
          'On the next line change True to False if you want the reminder to send without giving you the chance to edit it.
          'Leave it set to True if you want an opportunity to edit the message before sending it.
          Const EDIT_FIRST = True
          'On the next line edit the message as desired.  Both %START% and %LOCATION% are parameters that will be replaced
          'with the meeting start time and location respectively before the message is displayed/sent.
          Const MSG_TEXT = "Just a quick reminder about this meeting.<br><br>Start: <b>%START%</b><br>Location: <b>%LOCATION%</b><br><br>"
          Const MACRO_NAME = "Send Meeting Reminder"
          Const ERR_MSG = "You must select an appointment for this macro to work."
          Dim olkRem As Outlook.MailItem, _
              olkRec As Outlook.Recipient
          On Error Resume Next
          If TypeName(olkApt) <> "Nothing" Then
              If olkApt.Class = olAppointment Then
                  Set olkRem = Application.CreateItem(olMailItem)
                  With olkRe
                      .Subject = "Meeting Reminder: " & olkApt.Subject
                      .HTMLBody = MSG_TEXT & .HTMLBody
                      .HTMLBody = Replace(.HTMLBody, "%START%", Format(olkApt.Start, "ddd, mmm d at h:mm AMPM"))
                      .HTMLBody = Replace(.HTMLBody, "%LOCATION%", olkApt.Location)
                      For Each olkRec In olkApt.Recipients
                          If (olkRec.Type <> olResource) And (olkRec.Name <> Session.CurrentUser.Name) Then
                              If Not olkRec.MeetingResponseStatus = olResponseDeclined Then
                                  olkRem.Recipients.Add olkRec.Name
                              End If
                          End If
                      Next
                      .Recipients.ResolveAll
                      If EDIT_FIRST Then
                          .Display
                      Else
                          .Send
                      End If
                  End With
              Else
                  MsgBox ERR_MSG, vbCritical + vbOKOnly, MACRO_NAME
              End If
          Else
              MsgBox ERR_MSG, vbCritical + vbOKOnly, MACRO_NAME
          End If
          On Error GoTo 0
          Set olkRem = Nothing
          Set olkRec = Nothing
      End Sub
      
    • David,

      Thanks for putting that together. I put it in our Outlook, but it doesn’t seem to be sending any messages. I’m highlighting multiple items in the calendar part of outlook then using a button I tied to that code to blast an email to all of the various appts. For some reason though it’s not sending anything. The first version of the code will still work. I thought it might be copy/paste error, but no matter how I transfer the code it seems to not push emails.

    • David,

      I also have a Office 365/Outlook 2013 setup with a “Shared Calendar” and looking to send an email to individuals each week when they are “OnCall” For example every Tuesday the next person would be “OnCall” and would like to send a reminder email to a group letting everyone know that we have switched out On-Call person for a week. I’m using Jon’s as my code base from the May 9th comment. But I get a typed mis-match when I try to insert the To: field to email stuff with the base code from Jon’s May 9th comments. Any ideas?

  18. Hello, is there a way to modify the script in order to allow for only sending a reminder to contacts that did not yet accept the appointment. Can the status that is visible under the tracking option be used as a criteria for selectively sending emails to the invitees? Thank you kindly for your advice.

    • Hi, Andy.

      Yes, we can modify the script so it only sends to those who have not accepted the appointment. I’m assuming that “not accepted” in this context means that they haven’t responded, not that they’ve declined or tentatively accepted. All we need to do is change line 30 from

      If Not olkRec.MeetingResponseStatus = olResponseDeclined Then
      

      to

      If olkRec.MeetingResponseStatus = olResponseNotResponded Then
      
    • Dear David,

      thank you kindly, this is very helpful. I only had to exchange the olResponseNotResponded with olResponseKeine for enabling the script in the German Outlook version.

  19. Hello, thank you for this information. I created a shared calendar with exchange 365 for the whole company. I would like a reminder email to go out to each person that is a member (full details) for each event. Is this possible?

    • You’re welcome, Donna.

      Yes, that’s possible. It may not be practical though. Here’s why. For the solution to work, some computer has to be on and Outlook has to be open on it in order for the script to send the reminder. In other words, you’d need to dedicate a computer to this process. Not dedicated in the sense that it couldn’t be doing something else, but in the sense that it would have to be on all the time. If it were ever turned off, then the process would fail.

  20. I did as you instructed and no Msgbox appeared, just the normal calendar reminder.

    So, I reset the reminder and opened the VBA Editor. I placed the cursor on line 7 (Application_Startup) and pressed F5. When the reminder fired, the Msgbox appeared and the email was composed and open for editing, since I had the constant EDIT_FIRST set to TRUE.

    Next I disabled all COM Add-Ins, reset the reminder and restarted Outlook. The event fired. However, when I re-enabled the CodeTwo Public Folders Add-in, it failed to fire. (http://www.codetwo.com/public-folders/) I think we’ve found our culprit.

    • Andy,

      Good detective work. My best guess is that CodeTwo Public Folders (CTPF) is trapping the same event and cancelling it before my code has a chance to fire. I did some checking and it appears that CTPF has an option for controlling reminder behavior. See this page from CTPF’s web site for details.

  21. I’m having some trouble between Outlook versions.
    I’m using your code labeled ‘Revision 2’.
    – The code was pasted into “ThisOutlookSession”
    – I set macro security in the Trust Center to “enable all macros” (for testing, I will self sign when complete)
    It executes correctly in Outlook 2007.

    When I pasted the code into Outlook 2010, it didn’t work.
    – The event fired and a popup appeared.
    – I verified that there was a Category named “Reminder”
    – My code matches this Category:
    If InCategory(olkApt, “Reminder”) Then
    ReminderObject.Dismiss
    SendMeetingReminder olkApt
    End If

    After saving the Project, I restarted Outlook.
    The event still never generated an email, it just popped up.
    Is there anything I am missing? I am perplexed.

    P.S. I followed your recommendation for the map using Google API. It was a challenge, but I found it very rewarding.

    Thank you for taking the time to respond.

    Andy

    • Hi, Andy.

      Please clarify which revision you’re using. I know you said you’re using rev 3, but you mention using categories and rev 3 doesn’t use categories. It uses a custom property. If you re truly using rev 3, then setting a category won’t trigger the code.

    • I’m sorry, I must be getting confused about the versions. I am definitely using the version that filters based on a Category named “Reminder”.

      I know the code is fine – I ran it on my Outlook (2007) successfully. The receptionist’s Outlook (2010) doesn’t fire! When I manually run the Automatic_Startup via VBA Editor, then events fire and everything works just fine.

      I tried everything suggested by this link (http://goo.gl/WVLWpJ) with no success.

      I am wondering if compiling it would help. I have VB6 from a class I took long ago, but I’m not sure how to compile. I pasted the code into a class module, but got errors with the “WithEvents” line.

      I’m lost. Do you have any advice? Thank you in advance.

    • Andy,

      Compiling won’t work. The code isn’t designed to be compiled or to function outside of Outlook.

      What is macro security set to on the receptionist’s computer?

    • The more accurate answer for the macro security setting is:
      “Enable all macros (not recommended…)”

      Not that this would be my final intention, but I removed all security to determine if it was the cause for not firing. I plan to self-sign the code once I get it to work.

    • Andy,

      If you’re using the version that keys on categories, then you’re using rev 2.

      We need to determine if the event isn’t firing or if it’s firing but nothing is happening. To do that, add the following line of code

      Msgbox "Fired"
      

      immediately after line 12 of the code. Line 12 is this line of code

      Dim olkApt As Outlook.AppointmentItem
      

      in the olkReminders_ReminderFire subroutine. Once you’ve done that, set a meeting reminder and wait until it should fire. Let me know if a dialog-box pops up saying “Fired”.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s