Outlook: Decline Meeting Invite but Save a Copy

Outlook doesn’t offer a built-in feature to decline a meeting invitation whilst keeping a copy of the meeting in your calendar. In this blog post I’ll explain how to add this in.

Why is this even useful though? Sometimes I get invited to a meeting that I can’t / won’t attend but want to keep the attached papers for, or at least a record of when the meeting took place and who was invited. I’d like to let the organiser know that I’ve received their invitation but won’t be attending, however Outlook’s “Decline” response auto-deletes the invitation and appointment – so I’ve lost all that good information. Alas there’s no option to change the behaviour of “Decline”.

What I want is a button I can click (from the meeting invitation email) that will send a “decline” response back to the organiser, keep (a copy of) the meeting in my calendar, and mark the appointment as “Free”.

This is actually pretty easy in Outlook 2013, and I’ve drawn on some neat code to accept or decline a meeting request using VBA from Diane Pomersky at Slipstick, and a handy sub-routine to copy attachments on Outlook items from Sue Mosher.

Here’s the VBA code you need to add:

Public Sub SaveAndDecline()
    Dim oAppt As AppointmentItem
    Dim cAppt As AppointmentItem
    Dim oResponse

    Set cAppt = GetCurrentItem.GetAssociatedAppointment(True)
    Set oAppt = Application.CreateItem(olAppointmentItem)

    With oAppt
        .Subject = "DECLINED: " & cAppt.Subject
        .Location = cAppt.Location
        .Body = cAppt.Body
        .Categories = cAppt.Categories
        .Importance = cAppt.Importance
        .Start = cAppt.Start
        .Duration = cAppt.Duration
        .BusyStatus = olFree
        .RequiredAttendees = cAppt.RequiredAttendees
        .OptionalAttendees = cAppt.OptionalAttendees
        .Resources = cAppt.Resources
        .ReminderSet = cAppt.ReminderSet
        .ReminderMinutesBeforeStart = cAppt.ReminderMinutesBeforeStart
        .ResponseRequested = cAppt.ResponseRequested
        .AllDayEvent = cAppt.AllDayEvent
        Call CopyAttachments(cAppt, oAppt)
        .Save
    End With

    Set oResponse = cAppt.Respond(olMeetingDeclined, True)
    oResponse.Send

    Set cAppt = Nothing
    Set oAppt = Nothing
End Sub

Function GetCurrentItem() As Object
    Dim objApp As Outlook.Application
 
    Set objApp = Application
    On Error Resume Next
    Select Case TypeName(objApp.ActiveWindow)
    Case "Explorer"
    Set GetCurrentItem = objApp.ActiveExplorer.Selection.Item(1)
    Case "Inspector"
    Set GetCurrentItem = objApp.ActiveInspector.CurrentItem
    End Select
    Set objApp = Nothing
End Function

Sub CopyAttachments(objSourceItem, objTargetItem)
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set fldTemp = fso.GetSpecialFolder(2) ' TemporaryFolder
    strPath = fldTemp.Path & "\"

    For Each objAtt In objSourceItem.Attachments
        strFile = strPath & "outlook_att_copy-" & objAtt.FileName
        objAtt.SaveAsFile strFile
        objTargetItem.Attachments.Add strFile, , , objAtt.DisplayName
        fso.DeleteFile strFile
    Next

    Set fldTemp = Nothing
    Set fso = Nothing
End Sub

Notice that I’ve copied quite a few more properties of the appointment over – setting the Free/Busy status to Free on the way.

Once you’ve added this to a VBA module in Outlook you can associated it with a button on the Main / Home ribbon for easy access when reading email.

Follow-up / Review Meetings in Outlook

Sometimes you use Outlook to arrange a meeting with a bunch of people, and the last action you take is to organise a review or follow-up meeting a few days later. Wouldn’t it be handy if you could “clone” the existing meeting request to another date with small adjustments to the timing, location, and invitee list?

The trouble is, whilst the Copy command in Outlook allows you to create a duplicate event, this has limited use for all-day events, and doesn’t enable you to amend meeting details before it is saved to your calendar. Outlook provides handy Quick Action operations to let you create a new Task from a Message, or create a new meeting with preset Subject and Recipients, but nothing to help with creating new meetings based on an existing appointment.

The good news is that help is at hand! The good folk over at HowTo-Outlook have provided a guide to adding a Create new meeting based on this meeting button for all recent versions Outlook.

Their simple guide provides a short piece of VBA code that you can cut-and-paste into Outlook and link to a new “Clone meeting” button on your toolbar/ribbon. It took me about 2 minutes to get this in place, and it’s already saved more time than that.

Towards the end of their guide, HowTo-Outlook show how you can make modifications to the fields that are copied to the new appointment. I found that a number of key fields were missing from the original code, so here’s my modified block under With olApptCopy:

With olApptCopy
        .Subject = olAppt.Subject
        .Location = olAppt.Location
        .Body = olAppt.Body
        .Categories = olAppt.Categories
        .Importance = olAppt.Importance
        .Duration = olAppt.Duration
        .RequiredAttendees = olAppt.RequiredAttendees
        .OptionalAttendees = olAppt.OptionalAttendees
        .Resources = olAppt.Resources
        .ReminderSet = olAppt.ReminderSet
        .ReminderMinutesBeforeStart = olAppt.ReminderMinutesBeforeStart
        .ResponseRequested = olAppt.ResponseRequested
        .AllDayEvent = olAppt.AllDayEvent
End With

This will copy over you attendee lists, any resources needed, the meeting duration, importance flag, reminders, and whether a response from attendees is requested.