There's a nice feature in Outlook that allows users to automatically accept appointments, and even decline conflicting appointments. Unfortunately, what it can't do is allow you to specify specific reasons for rejecting meeting invitations.


A particular pet hate of mine is when people send a meeting invitation entitled "Foo Discussions" or some such, and fail to specify a location or any content. It's even more irritating when I'm trying to be a good little corporate citizen and have my calendar auto-accept appointments, but they send it ten minutes before the thing actually starts. They're going to receive an acceptance notice (of course) but my phone's not going to synch for a good half-hour, and there's just no way I'm going to be there. Funnily enough, I'm not just sitting around on my backside, waiting for someone to invite me to a meeting.

Oh, a meeting! How exciting! I've been waiting for one of these all day!

Of course, if you simply decline offending appointments manually, people tend to get offended. (Which may or may not be a good thing, depending on who it is.) A better way, however, is to automate the process.

Nothing personal, old chap - my calendar just has automation rules that apply to everyone.

The rules for getting into my calendar are simple:

  1. Tell me everything I need to know about the meeting. This includes, specifically, its location. Outlook enforces pretty much everything else, but fails to enforce this one.

  2. Please do me the courtesy of checking my free/busy information and *do not *attempt to trump something that's already been organised. It shows a complete and utter disregard for my time and that of anyone with whom I've already agreed to meet.

  3. Do me the courtesy of giving me at least 24 hours' notice. Don't send me a meeting request at 7pm on Monday evening for 7:30am on Tuesday morning. I'm not going to read it, and I'm not going to be there.

I finally snapped today, after another imbecilic meeting request, and wrote these two quick methods. They enforce the three rules above, automatically accept the request if it passes and automatically decline otherwise. They appear to work for me; your mileage may vary. No warranties, express or implied, etc.

Sub AutoProcessMeetingRequest(oRequest As MeetingItem)

    ' bail if this isn't a meeting request
    If oRequest.MessageClass <> "IPM.Schedule.Meeting.Request" Then Exit Sub

    Dim oAppt As AppointmentItem
    Set oAppt = oRequest.GetAssociatedAppointment(True)

    Dim declinedReasons As String
    declinedReasons = ""

    If (oAppt.Location = "") Then
        declinedReasons = declinedReasons & " * No location specified." & vbCrLf
    End If

    If (HasConflicts(oAppt)) Then
        declinedReasons = declinedReasons & " * It conflicts with an existing appointment." & vbCrLf
    End If

    If (DateTime.DateDiff("h", DateTime.Now, oAppt.Start) < 24) Then
        declinedReasons = declinedReasons & " * The meeting's start time is too close to the current time. " & vbCrLf
    End If

    Dim oResponse As MeetingItem
    If (declinedReasons = "") Then
        Set oResponse = oAppt.Respond(olMeetingAccepted, True)
        Set oResponse = oAppt.Respond(olMeetingDeclined, True)
        oResponse.Body = _
            "This meeting request has been automatically declined for the following reasons:" & vbCrLf & _
    End If


End Sub

Function HasConflicts(oAppt As AppointmentItem) As Boolean
    Dim oCalendarFolder As Folder
    Set oCalendarFolder = ThisOutlookSession.Session.GetDefaultFolder(olFolderCalendar)

    Dim apptItem As AppointmentItem

    For Each apptItem In oCalendarFolder.Items
        If ((apptItem.BusyStatus <> olFree) And (oAppt <> apptItem)) Then
            If (apptItem.Start < oAppt.End) Then
                ' if this item starts before the given item ends, it must end before the given item starts
                If (apptItem.End > oAppt.Start) Then
                    HasConflicts = True
                    Exit Function
                End If
            End If
        End If

    HasConflicts = False
End Function

Just open the VBA editor from within Outlook (Alt-F11) and paste the subroutines into the ThisOutlookSession project.


Then go and create an Outlook rule that calls the AutoProcessMeetingRequest subroutine for every meeting request you receive:


Those of your colleagues who persistently refuse to learn how to use email (an essential business tool!) will receive responses along the following lines: