Last reviewed on December 30, 2013   —  10 Comments

I have a couple of similar code samples on another page - one of the macros copies a cancelled meeting to an appointment, the other copies a meeting before the organizer cancels it. This macro just copies a meeting request to an appointment.

Why would you want to copy a meeting? In my case, to add it to the calendar that syncs with my blackberry. If I forward the meeting, my default address is exposed to the organizer. Meeting organizers might want a copy they can use to block off time before or after the meeting, or to use for meeting notes.

iCloud users may want to copy appointments instead of meeting to avoid issues with the iCloud sending out meeting invitations.

This code sample uses the GetCurrentItem function (included) and works with either selected meetings or opened meetings.

Copy Meeting to an Appointment

To use, open the VBA Editor and paste the code into a module. Select a meeting them run the macro.

Sub copyMeeting()
 
Dim oAppt As AppointmentItem
Dim cAppt As AppointmentItem
 
Set cAppt = GetCurrentItem()
Set oAppt = Application.CreateItem(olAppointmentItem)
     
     
    oAppt.Subject = "Copied: " & cAppt.Subject
    oAppt.Start = cAppt.Start
    oAppt.Duration = cAppt.Duration
    oAppt.Location = cAppt.Location
    oAppt.Save
     
    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

Copy appointments to a different calendar

If you are using this macro to copy meetings as appointments to another calendar, such as the iCloud, you need to tweak the code to use folders in other data stores.

You will need to get the code at Working with VBA and non-default Outlook Folders to set the folder to the iCloud folder. Paste it in the VB Editor, at the end of this code.

Note: This will work with any data file, not just iCloud. Change the path in the objCalendarFolder line to use the name of the data file (as seen in the Folder list) and calendar path.

Sub copyMeetingtofolder()

Dim objCalendarFolder As Outlook.Folder
Dim oAppt As AppointmentItem
Dim cAppt As AppointmentItem
 
Set cAppt = GetCurrentItem()
Set oAppt = Application.CreateItem(olAppointmentItem)
     
     
     Set objCalendarFolder = GetFolderPath("iCloud\calendar")
     
     
    oAppt.Subject = "Copied: " & cAppt.Subject
    oAppt.Start = cAppt.Start
    oAppt.Duration = cAppt.Duration
    oAppt.Location = cAppt.Location
    oAppt.Save

    oAppt.Move objCalendarFolder
     
    Set oAppt = Nothing
    Set cAppt = Nothing
 Set objCalendarFolder = 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

Block off travel time

You can use macros similar to the code on these pages to block off travel time by changing the fields.

    oAppt.subject = "downtime: " & cAppt.subject
    oAppt.Start = cAppt.End
    oAppt.Duration = 15

Comments

  1. JB says

    Cool stuff....but how do I cancel the meeting that I copied if I receive a cancellation request from the original sender?

    • Diane Poremsky says

      You can select and delete the copy you created. If you want to keep the copy for your records, edit the subject to say cancelled.

  2. David says

    I've copied the above code and the GetFolderPath() code into a module but during execution I get a Run-time error '13': Type mismatch upon returning from the GetCurrentItem() function. I stepped into GetCurrentItem() and it seems to run OK.

    I do not have anything in ThisOutlookSession().

    Any idea what I'm missing?

  3. David says

    The issue seems to be that GetCurrentItem() returns an Object which cannot be directly assigned to the cAppt variable which is declared as an AppointmentItem. Changing cAppt to be of type Object and inlining the code from GetCurrentItem() resolves my original issue. However, I like the idea of the GetCurrentItem() function but cannot figure out how to cast the Object returned to an object of type AppointmentItem.

    • Diane Poremsky says

      It *should* work exactly as written. (It does here.) What version of Outlook do you use?

    • Diane Poremsky says

      What did you do to fix the error? It might help someone else.

      Color categories would be:
      oAppt.Categories = cAppt.Categories

Leave a Reply

Please post long or more complicated questions at OutlookForums by Slipstick.com.

If the Post Comment button disappears, press your Tab key.