Introduction
Anybody using Microsoft Outlook as their primary email handling and organizing application knows, that it a very easily customizable tool.
Less people know, that you can use the VBA to enhance your experience with Outlook, to tailor it to be the application you really need.
And even fewer people know the true power behind User Defined Fields (UDF).
If you are working in an environment where you have to action the incoming request that are in the form of an email, UDF can help you make your mailbox the request handling tool of your dreams. You can keep track which company sent it, how much time elapsed since the last time you took an action on the email, and even (this is my latest addition) keep track of a worklog, so you can track back, what happened to that email.
Background
Make no mistake, I'm not a real programmer. I'm more of what you call a Googrammer (Using Google to find the program code, and necessary knowledge on-demand). Still I managed to learn a lot of things in the past years. And this article is my collection and own development on the code being used by me and my colleagues every day.
Assumptions
This article assumes that:
- You have dealt with VBA or Visual Basic before
- You have been using Microsoft Outlook in the past
- You need more fields in you mailbox, that are either static or dynamic
Basics
Customizing Outlook: Toolbars, Macros and Buttons
In order to benefit from the macro that we are about to create, its better if you have these functions "at hand" rather then having to use Alt+F8 to run the macros.
After the toolbars are created, and the macros are added to the toolbar, you can always use them with a single click.
Please review the below links to get an understanding on how to create toolbars and add macros to them.
To add a macro to the toolbar you have just created, simply select the Macros option from Categories, and drag and drop the item on the toolbar.
User Defined Fields
User Defined Fields (or UDFs moving forward) are extra filed that you can create and then drag and drop to you mailbox, to store extra information you require. This can be Company, UserID, Cost etc...
You have quite the extensive fields built in,and you can add them from the filed chooser by right-clicking on the title bar of you mailbox, and selecting field chooser.
It will give you a toolbox, from where you can just drag and drop items to your mailbox.
If you scroll to the bottom in the dropdown menu at the top of the toolbox, you can get to User Defined Fields. This is where you can create UDFs that you want to use in the future.
You can click the New... button to create a new field and then set
In order to get in depth detail on User Defined Fields, please visit the below links:
Ok, I understand, whats the next step?
After adding the fields, you can set outlook that these fields become editable on-click , but I found that rather uncomfortable, and even bad looking. So instead, we are going to use toolbars and macros to mange these fields.
We will be using a rather simple macro to achieve the desired result. I will show you one simple example
Using the code
Ok. So now that you are familiar with the UDFs and the Optimization options, let's jump to the code right away.
In order for the code to work, you need to add a reference to the Microsoft Forms 2.0 Object Library.
You do that by opening the Visual Basic editor in Outlook (Alt+F11). Add a module to the Project using the project explorer. Doubleclick the module. Now go to Tools - References and either search for the Reference and check the checkbox next to it, or browse for the FM20.dll.
If the above step is done, you can get to writing the code, you start by creating the sub:
Sub Customer(Optional ByVal Value As String, Optional ByVal IsCustomEntry As Boolean = False)
This will allow you to call the Sub with arguments, so you don't have to spam your module. You can set it to add a fix value toa field , like this:
Sub CustomerID_Customer1()
Call CustomerID("ABCD1234")
End Sub
Or, you can as the user for a specific input, which will trigger an inputbox:
Sub CustomerID_CustomerEntry()
Call CustomerID(, True)
End Sub
Let's move onto the variables:
Dim i As Long Dim myCollection As Object Dim msg As Outlook.MailItem Dim objProperty As Outlook.UserProperty Dim UserDefinedFieldName As String
I use UserDefinedFieldName
so I can copy-paste the same function, and only change one variable's value to adapt to any UDF that I want to manage.
Set myCollection = Outlook.Application.ActiveExplorer.Selection
This will set the selected items into one collection. The UDF will be applied to all Mail Itemsselected
UserDefinedFieldName = "CustomerID"
This sets the UDF's name
If IsCustomEntry = False Then If Not myCollection Is Nothing Then For i = 1 To myCollection.Count Set msg = myCollection.Item(i) Set objProperty = msg.UserProperties.Add(UserDefinedFieldName, Outlook.OlUserPropertyType.olTExt) objProperty.Value = Value msg.Save Next i
End If
If you have chosen to go with a fix value, the above cycle will run. If you chosen custom entry, the below cycle will run:
ElseIf IsCustomEntry = True Then
Value = InputBox("Please enter custom value", "Input custom field value")
If Not myCollection Is Nothing Then
For i = 1 To myCollection.Count
Set msg = myCollection.Item(i)
Set objProperty = msg.UserProperties.Add(UserDefinedFieldName, Outlook.OlUserPropertyType.olTExt)
objProperty.Value = Value
msg.Save
Next i
End If
End If
And of course the necessary closing line
End Sub
Here is the whole code without interruption
Sub CustomerID(Optional ByVal Value As String, Optional ByVal IsCustomEntry As Boolean = False)
Dim i As Long
Dim myCollection As Object
Dim msg As Outlook.MailItem
Dim oMail As Outlook.MailItem
Dim objProperty As Outlook.UserProperty
Dim UserDefinedFieldName As String
Set myCollection = Outlook.Application.ActiveExplorer.Selection
UserDefinedFieldName = "CustomerID"
If IsCustomEntry = False Then
If Not myCollection Is Nothing Then
For i = 1 To myCollection.Count
Set msg = myCollection.Item(i)
Set objProperty = msg.UserProperties.Add(UserDefinedFieldName, Outlook.OlUserPropertyType.olTExt)
objProperty.Value = Value
msg.Save
Next i
End If
ElseIf IsCustomEntry = True Then
Value = InputBox("Please enter custom value", "Input custom field value")
If Not myCollection Is Nothing Then
For i = 1 To myCollection.Count
Set msg = myCollection.Item(i)
Set objProperty = msg.UserProperties.Add(UserDefinedFieldName, Outlook.OlUserPropertyType.olTExt)
objProperty.Value = Value
msg.Save
Next i
End If
End If
End Sub
So after your done, you just call the function, add the arguments. You will have the macro available in the Customize menu, and you will be able to add it to the Toolbar you created fro this purpose
To be able to view what you have added, you have to create a UDF called "CustomerID", and than drag and drop the new UDF in the mailbox.
Points of Interest
Please do not forget to add the reference... It gives an annoying error message, that will not help you to identify the problem.
You could probably add some error handling, in the macro, in case you try to edit a UDF of a non-Mail item, like a calendar invite or a task. I think a the simplest
On Error Resume Next
Is a sufficient solution to make the line jump to the next item, or you can also add a decision tree where you check whether myCollection.Item(i)
is a MailItem or not.
Final words
If you use this cleverly, it can help you life a lot, like creating a dropdown menu in Outlook with the most common UDFs and their values, so you can manage you emails better and faster then before.
The UDFs can also grouping criteria. You can set a UDF to MSGSTATUS and add the values e.g.: Active, Pending, Non-Action, and then set Oultook to group emails according to the MSGSTATUS field.
You don't even need the UDF to be visible, Outlook will still group it using it's values!
If you have any questions, please feel free to contact me!
History
Article version 1.0