Stock Event Code

On my blog and on various messageboards such as VBA Express, I find myself using the same event code repeatedly. So here is the stock event code I use when someone asks "How do I do X automatically?"

This code is perfect for questions like

  • How do I move messages automatically depending on the sender or subject?
  • How do save new attachments to different folders?
  • How do I open or print attachments depending on the time of day?

There are many other conditions as well, such as

  • message importance
  • the number or type of attachments
  • specific words contained in the body
  • whether you were CC'd or BCC'd

You can customize your event to handle any of these conditions and more.

All you need to do is cut and paste the code below into your ThisOutlookSession module in Outlook's VBIDE. (Press Alt+F11 to get there from Outlook.) Then customize to your liking. See the comments for the spots that you need to edit.

Private WithEvents Items As Outlook.Items

Private Sub Application_Startup()
Dim olApp As Outlook.Application
Dim objNS As Outlook.NameSpace
Set olApp = Outlook.Application
Set objNS = olApp.GetNamespace("MAPI")
' (1) default Inbox
Set Items = objNS.GetDefaultFolder(olFolderInbox).Items
End Sub

Private Sub Items_ItemAdd(ByVal item As Object)

On Error Goto ErrorHandler

  Dim Msg As Outlook.MailItem

	' (2) only act if it's a MailItem
	If TypeName(item) = "MailItem" Then
		Set Msg = item

		' (3) do something here

	End If

ProgramExit:
  Exit Sub
ErrorHandler:
  MsgBox Err.Number & " - " & Err.Description
  Resume ProgramExit
End Sub

You'll need to edit three spots:

  1. The folder you want to monitor for new messages;
    • If you want a default folder, replace olFolderInbox with one of the olDefaultFolders Constants:

      • olFolderDeletedItems – Deleted Items
      • olFolderOutbox – Outbox
      • olFolderSentMail – Sent Mail
      • (olFolderInbox – Inbox)
      • olFolderCalendar – Calendar
      • olFolderContacts – Contacts
      • olFolderJournal – Journal
      • olFolderNotes – Notes
      • olFolderTasks – Tasks
      • olFolderDrafts – Drafts

      For a non-default folder, you'll need to walk down the folder hierarchy and set a reference as follows:

      ' set a reference to Inbox\MyItems folder
      Set Items = objNS.Folders("Inbox").Folders("My Items").Items

      Or

      ' set a reference to Inbox\MyItems folder
      Set Items = objNS.GetDefaultFolder(olFolderInbox).Folders("My Items").Items
  2. The type of item you want to watch for (message, meeting request, task);
    • "MailItem"
    • "MeetingItem"
    • "TaskRequestItem"
    • which corresponds to

    • Email messages
    • Meeting requests
    • Delegated/Assigned Tasks
    • There are other types of items as well, such as TaskRequestAcceptItem (when someone accepts your task), or PostItem, which can also be added to any folder, and ReportItem, which is a system-generated delivery report. I've chosen to focus on the most common ones, however, but feel free to request additional samples using these objects.

  3. The action you want to take when a matching item comes into the specified folder.
  4. This is left to your imagination. You can move messages to a folder, forward them to another recipient, or save attachments and run a macro on them. My blog has additional samples you can apply using this stock code.

Site last updated: April 19, 2014

Peltier Tech Charting Utilities for Excel