Some users like to keep a history of all appointments, including canceled meetings. However, when you delete the cancellation notice from your Inbox, it deletes the meeting from the calendar too.
I want to keep canceled meetings on my calendar as it is useful when reviewing my calendar and wondering why I didn’t attend other meetings.
Most people want to clear out their Inbox and delete the cancellation notice, but to avoid removing the canceled meeting from your calendar, you need to keep the meeting cancellation notice. As long as the meeting cancellation notice remains in your mailbox and out of the Deleted Items folder, the meeting item remains on your calendar.
Solutions
Meeting invitees have two options: They can create a folder to move the meeting cancellation notices into or they can use use a run a script rule to convert canceled meetings into appointments when the cancellation notices arrive. This will allow to you delete the meeting cancellation notice.
These options won't work for the meeting organizer. While you can get the cancelled meeting from the Deleted Items folder and move it back to the calendar, it's still a meeting. If you decide to delete it, Outlook will want to send another cancellation.
If the organizer needs to keep a copy of canceled meetings, he needs to create a copy of the meeting before canceling it. In Outlook 2010, right click and drag the meeting to a different calendar folder to create a copy. On page 2, we have a code sample organizers can use to copy the meeting request before canceling it.
Canceled meetings are left on Resource calendars. See Remove Canceled Meeting Requests from Resource Calendarfor a VBA sample that can remove the cancellation notices from Resource calendars.
Run a Script Rule to Convert a Canceled Meeting to an Appointment
Open Outlook's VBA editor (Alt+F11), expand Microsoft Office Outlook Objects then double click on ThisOutlookSession. Type or paste the code into the module, then create the rule with the 'run script' Action and select this script.
Sub CopyMeetingtoAppointment(oRequest As MeetingItem) If oRequest.MessageClass <> "IPM.Schedule.Meeting.Canceled" Then Exit Sub End If Dim oAppt As AppointmentItem Dim cAppt As AppointmentItem Set cAppt = oRequest.GetAssociatedAppointment(True) Set oAppt = Application.CreateItem(olAppointmentItem) 'I added (Rule) to the subject so I could see the rule was working. oAppt.Subject = "(Rule) Canceled: " & cAppt.Subject oAppt.Start = cAppt.Start oAppt.Duration = cAppt.Duration oAppt.Location = cAppt.Location oAppt.Display oAppt.Save Set oAppt = Nothing Set cAppt = Nothing End Sub
Macro for Organizers to Copy then Cancel Meetings
Organizers would use this code to copy the details to an appointment form before canceling the appointment. To avoid clicking one button to copy the meeting details and then the cancel and send buttons to complete the steps, the code does that for you. However, if you want the option of just copying a meeting as an appointment, without canceling it, remove the three lines that cancels & sends the update then deletes the meeting from your calendar.
This code works with either selected meetings or opened meeting forms.
Open Outlook's VBA editor (Alt+F11), expand Microsoft Office Outlook Objects then double click on ThisOutlookSession. Type or paste the code into the module, then create a button in Outlook's main interface and on an opened appointment form and assign the macro to it.
Sub CopyBeforeCancel() Dim oAppt As AppointmentItem Dim cAppt As AppointmentItem Set cAppt = GetCurrentItem() Set oAppt = Application.CreateItem(olAppointmentItem) oAppt.Subject = "(Rule) Canceled: " & cAppt.Subject oAppt.Start = cAppt.Start oAppt.Duration = cAppt.Duration oAppt.Location = cAppt.Location oAppt.Save 'This code cancels the meeting and sends the cancellation. cAppt.MeetingStatus = olMeetingCanceled cAppt.Send cAppt.Delete Set oAppt = Nothing Set cAppt = 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
This next piece code code copies a meeting to an appointment and moves it to a different calendar. This is useful for iCloud users whose meetings are resent when they add them to the iCloud.
Copy a meeting to a different calendar
This code sample opens the folder picker dialog for you to select the Calendar folder.
Sub CopyMeetingasApt() Dim objDestCal As Outlook.MAPIFolder Dim objNS As Outlook.NameSpace Dim oAppt As AppointmentItem Dim cAppt As AppointmentItem Set objNS = Application.GetNamespace("MAPI") Set cAppt = GetCurrentItem() Set oAppt = Application.CreateItem(olAppointmentItem) oAppt.Subject = "(Rule) Canceled: " & cAppt.Subject oAppt.Start = cAppt.Start oAppt.Duration = cAppt.Duration oAppt.Location = cAppt.Location oAppt.Save Set objDestCal = objNS.PickFolder oAppt.Move objDestCal Set objDestCal = Nothing Set objNS = Nothing Set oAppt = Nothing Set cAppt = 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
More Information
More Run a Script Samples:
- Autoaccept a Meeting Request using Rules
- Automatically Add a Category to Accepted Meetings
- Blocking Mail From New Top-Level Domains
- Convert RTF Messages to Plain Text Format
- Create a rule to delete mail after a number of days
- Create a Task from an Email using a Rule
- Create an Outlook Appointment from a Message
- Create Appointment From Email Automatically
- Delegates, Meeting Requests, and Rules
- Delete attachments from messages
- Forward meeting details to another address
- How to Change the Font used for Outlook's RSS Feeds
- How to Process Mail After Business Hours
- Keep Canceled Meetings on Outlook's Calendar
- Macro to Print Outlook email attachments as they arrive
- Move messages CC'd to an address
- Open All Hyperlinks in an Outlook Email Message
- Outlook AutoReplies: One Script, Many Responses
- Outlook's Rules and Alerts: Run a Script
- Process messages received on a day of the week
- Read Outlook Messages using Plain Text
- Receive a Reminder When a Message Doesn't Arrive?
- Run a script rule: Autoreply using a template
- Run a script rule: Reply to a message
- Run a Script Rule: Send a New Message when a Message Arrives
- Run Rules Now using a Macro
- Run-a-Script Rules Missing in Outlook
- Save all incoming messages to the hard drive
- Save and Rename Outlook Email Attachments
- Save Attachments to the Hard Drive
- Save Outlook Email as a PDF
- Sort messages by Sender domain
- Talking Reminders
- To create a rule with wildcards
- Use a Macro to Copy Data in an Email to Excel
- Use a Rule to delete older messages as new ones arrive
- Use a run a script rule to mark messages read
- Use VBA to move messages with attachments
Outlook outright stinks when it comes to managing meetings. Period. However there are some workarounds. I have weekly meetings scheduled until the end of the year. If there is no business, then I "cancel" the meeting. But if I did it the Outlook way, it would disappear off my calendar and I'd have no record that the meeting was scheduled, but there was no business. If I just send an empty agenda, all the members would still have it pop up on their calendar to attend. Here's what I do: I open the weekly occurrence and edit the agenda (this changes with each meeting) to say Cancelled. I then Delete ALL the names in the Required filed (alt-a, delete). I then replace their names with only mine. (You can save a step by doing alt-a and just typing your name.) I delete all the names in the Optional: field. Then Send Update. The attendees get a cancellation notice and it removes it from their calendar. It stays in my calendar, so if someone asks for the notes from the Dec 2 meeting, I can see that it was cancelled, and there are no notes. I will also do similar with individual names removed if there's… Read more »
Hee,
I have been looking for Run a Script Rule to Convert a Canceled Meeting to an Appointment for quite some time and this seems to be exactly what I need. However I have no clue how to make the macro. Basically the part where you say "then create the rule with the 'run script' Action and select this script." is completely blank for me. Could you guide me to what I should actually do there?
I'm familiar with programming and I see the function takes an argument, but I have no clue what I should provide as argument when calling the function.
I hope you can give me some hints.
Regards,
Claire
You just need to add the script to the VBA editor then create a run a script rule. I have instructions here:
https://www.slipstick.com/outlook/rules/outlooks-rules-and-alerts-run-a-script/
Hello,
I'm new to scripting.
How do I modify this to keep my declined meetings in outlook 2016 calendar?
Thanks,
-jaime
It doesn't need modified - it will work with 2016/2019/365 desktop software. You'll need to set the registry key to use the run a script rule.
Is there a way I can modify this script to change outlook calendar based on if one attendee declines change to yellow, if more than two attendees declined change to orange and if all attendees decline change to red?
It should be possible, but would require setting a category or custom field with he declined count. I'll put on my thinking cap and see if i can come up with a good way of doing this.
Oh ok. thank you I appreciate the help.
Is there any update regarding this script?
Not useable for standard pebkac's
Thanks Diane,
This script is really helpful, much obliged
I've just added a few lines to set the Busy status to Free,copy the original Body and Attendees:
oAppt.BusyStatus = olFree
oAppt.RequiredAttendees = cAppt.RequiredAttendees
oAppt.Body = cAppt.Body
Hello All, somebody knows what I need to do in order to Keep the previous meeting on Outlook's Calendar even I perform a new scheduling, meaning today I had a meeting them the topic was not closed so I sent a new invitation for tomorrow, but the meeting from today disappears from the calendar... Thanks,
Nevermind, I had a faulty linebreak. However, it doesn't work for me even though it seems to be implemented.
Did you either restart Outlook or click in the Application_Startup macro to kick start it?
When I try to run the script I get the error message "unexpected function or variable". I've followed the guide here and on your other page Outlook's Rules and Alerts: Run a Script. I don't think there is anything wrong with my rules. I choose grade tree in the macro security center, and I think I have accepted the macro - so that would be running. Might the problem be with the general security? I am not using outlook at home.