Calendar in Microsoft Outlook – Printing Multiple Calendars on One Page

Windows Server and IIS

Managing your calendar in Outlook can be extremely helpful. But what do you do if you need to print out a calendar page that shows information from multiple calendars in the Outlook system?

I have been a convert to using Microsoft Outlook’s calendars for many years. Since I’m in Outlook all day anyway, managing my email, the Calendar alerts tie in smoothly to that. It allows me to conveniently juggle my own schedule. In addition, and just as importantly, I can seamlessly integrate other peoples’ calendars in my display. In my case, I have a personal Outlook calendar with my own appointments and meetings. In addition, I have my display show a Google calendar of my boyfriend’s band, to know when their upcoming gigs are. I also show the Google calendar of the local art organization I manage, to keep track of their shows and events.

This is absolutely perfect for on-screen work. I can glance at that screen and see everything that is going on. However, when I try to print a monthly calendar to hang by my desk, the system breaks down. That’s because, for some completely unknown reason, YOU CAN ONLY PRINT ONE OUTLOOK CALENDAR AT A TIME.


I was absolutely sure the functionality of printing multiple calendars had to exist in Outlook. Nearly everyone I know who uses Outlook is managing multiple calendars. Why in the world would Outlook only allow you to print one single calendar onto a piece of paper?

Hopefully we can keep lobbying Microsoft to update Outlook to provide this functionality. In the meantime, here are some workarounds.

Print a Screenshot of your Outlook Calendar

Yes, this is ridiculous. But it is probably the easiest solution. Simply get your screen to look the way you want your printed version to look – week view, month view, or whatever. Then hit the PRINT SCREEN button on your keyboard. Open up Paint or Photoshop or Gimp and paste that image into a new file. Crop out the extra stuff. Print it. While this works, I do NOT like this solution because my printer isn’t great with colors (I need a new one) so the printout is hard to read.

Move All Appointments into One Calendar

This can be done with a macro or by hand, depending on how many appointments you have. If everything is in one calendar then it prints as usual. This is a royal pain but it clearly works and it prints just the way a standard calendar does.

Add-On Program from Microsoft – CalendarPrintAssistant.exe

This comes directly from Microsoft, and the latest release date I know of is December 2019. You have to add it on to Outlook. It then lets you have additional options for Calendar. Here is the direct link to Microsoft to learn more. Note this add-on only works with Microsoft Office 2007.

For-Pay Add-On Program from Outlook Calendar Print

This is a money-costing option. You buy the software for $49 and download it. This then lets you have a variety of options for printing from Outlook Calendar.

Outlook Calendar Print website.

Writing a Macro for Microsoft Outlook 365

If you want to write a macro to automate activities in Microsoft Office 365, first you have to tweak your trust settings to allow that testing to happen. To do this:

In Microsoft Outlook, click on File -> Options. Choose Trust Center -> Trust Center Settings. In the “Macro Settings” area, set it to “Notifications for all macros”. Save, then restart Outlook.

Next, you need the developer tab visible to work with macros in Outlook. For this, in Microsoft Outlook, click on File -> Options. Choose Customize Ribbon. On the left drop-down, choose “Main Tab”. Add the “Developer” option and save. You can now work with macros.

To paste in a new macro, click on the Visual Basic for Applications (VBA) option. You’ll start out with a default project, probably Project1 on the left. RIGHT click on this and use Insert-Module. Paste in the macro code you found (or write it yourself if you’re enthusiastic!). Save it.

To run the macro, open up the Calendar view as always. In the lower right where you show which calendars to display, make sure there’s a check box by each calendar in your set. You probably already have that done. Now click on Developer – Macros – Project1.PrintCalendarsAsOne.

A brand new calendar should appear in that list called “Print”. That should have everything from your other selected calendars for the next 92 days. So you can print that calendar to show all your meetings.

Here is the macro I am currently using. Its aim is to populate a temporary “everything” calendar out for the subsequent two months. That way I can print paper copies of the next two monthly calendar sheets to hang by my desk. I like to always keep paper calendars for this month and the next two months by my desk, to see those three months at a glance.

As a final note, once you are sure your macro is running nicely, it’s a good idea to digitally sign it. Open up VBA again. The process is under Tools -> Digital Signature. If you need to set up a certificate on your machine, here is how:

Microsoft Official Page on Self-Signed Projects

Dim CalFolder As Outlook.Folder
   Dim printCal As Outlook.Folder
' Base code initially from:
' Modified by Lisa Shea
' Run this macro
Sub PrintCalendarsAsOne()
    Dim objPane As Outlook.NavigationPane
    Dim objModule As Outlook.CalendarModule
    Dim objGroup As Outlook.NavigationGroup
    Dim objNavFolder As Outlook.NavigationFolder
    Dim objCalendar As Folder
    Dim objFolder As Folder
    Dim objDeletedItems As Outlook.Folder
    Dim objDeleteFolders As Outlook.Folders

    Dim i As Integer
    Dim g As Integer
    On Error Resume Next
    Set objCalendar = Session.GetDefaultFolder(olFolderCalendar)
    Set printCal = objCalendar.Folders("Print")
    Set objDeletedItems = Session.GetDefaultFolder(olFolderDeletedItems)
    Set objDeleteFolders = objDeletedItems.Folders

    Set printCal = objCalendar.Folders.Add("Print")
    Set Application.ActiveExplorer.CurrentFolder = objCalendar
    Set objPane = Application.ActiveExplorer.NavigationPane
    Set objModule = objPane.Modules.GetNavigationModule(olModuleCalendar)
  With objModule.NavigationGroups
    For g = 1 To .Count

    Set objGroup = .Item(g)
    For i = 1 To objGroup.NavigationFolders.Count
        Set objNavFolder = objGroup.NavigationFolders.Item(i)
     If objNavFolder.IsSelected = True Then
   'run macro to copy appt
        Set CalFolder = objNavFolder.Folder
    End If
    Next i
    Next g
    End With
    Set objPane = Nothing
    Set objModule = Nothing
    Set objGroup = Nothing
    Set objNavFolder = Nothing
    Set objCalendar = Nothing
    Set objFolder = Nothing
End Sub
Private Sub CopyAppttoPrint()
   Dim calItems As Outlook.Items
   Dim ResItems As Outlook.Items
   Dim sFilter As String
   Dim iNumRestricted As Integer
   Dim itm, newAppt As Object
   Set calItems = CalFolder.Items
   If CalFolder = printCal Then
     Exit Sub
   End If
' Sort all of the appointments based on the start time
   calItems.Sort "[Start]"
   calItems.IncludeRecurrences = True
  calName = CalFolder.Parent.Name
' to use category named for account & calendar name
' calName = CalFolder.Parent.Name & "-" & CalFolder.Name
'create the filter - this copies appointments today to 92 days from now
   sFilter = "[Start] >= '" & Date & "'" & " And [Start] < '" & Date + 92 & "'"
   ' Apply the filter
   Set ResItems = calItems.Restrict(sFilter)
   iNumRestricted = 0
   'Loop through the items in the collection.
   For Each itm In ResItems
      iNumRestricted = iNumRestricted + 1
Set newAppt = printCal.Items.Add(olAppointmentItem)
With newAppt
   .Subject = itm.Subject
   .Start = itm.Start
   .End = itm.End
   .ReminderSet = False
   .Categories = calName
End With

   ' Display the actual number of appointments created
    Debug.Print calName & " " & (iNumRestricted & " appointments were created")
   Set itm = Nothing
   Set newAppt = Nothing
   Set ResItems = Nothing
   Set calItems = Nothing
   Set CalFolder = Nothing
End Sub

Be the first to comment

Leave a Reply

Your email address will not be published.


This site uses Akismet to reduce spam. Learn how your comment data is processed.