在 Outlook 中使用用户定义字段
利用用户定义字段更好地组织电子邮件并跟踪信息
引言
任何将 Microsoft Outlook 作为主要电子邮件处理和组织应用程序的人都知道,它是一个非常易于自定义的工具。
少有人知道,您可以使用 VBA 来增强 Outlook 的体验,从而将其定制成您真正需要的应用程序。
更少有人知道用户定义字段 (UDF) 的真正强大之处。
如果您在一个需要处理电子邮件形式的入站请求的环境中工作,UDF 可以帮助您将邮箱变成您梦想中的请求处理工具。您可以跟踪哪个公司发送了电子邮件,自上次对该电子邮件采取行动以来过去了多少时间,甚至(这是我最新的添加)跟踪工作日志,以便您可以追溯该电子邮件发生了什么。
背景
请注意,我不是真正的程序员。我更像是所谓的“Googrammer”(在需要时使用 Google 查找程序代码和必要的知识)。尽管如此,我还是在过去几年中学到了很多东西。本文是我每天与同事们共同使用的代码的收集和自行开发。
假设
本文假设
- 您之前处理过 VBA 或 Visual Basic
- 您过去曾使用过 Microsoft Outlook
- 您的邮箱需要更多字段,这些字段可以是静态的或动态的
基础
自定义 Outlook:工具栏、宏和按钮
为了能够受益于我们即将创建的宏,最好将这些功能“放在手边”,而不是必须使用 Alt+F8 来运行宏。
在创建工具栏并将宏添加到工具栏后,您始终可以通过单击一次来使用它们。
请参考以下链接,了解如何创建工具栏并将宏添加到其中。
- http://www.howto-outlook.com/howto/customizetoolbar.htm
- http://office.microsoft.com/en-us/outlook-help/create-and-rename-custom-toolbar-HP001234185.aspx
要将宏添加到您刚刚创建的工具栏,只需从“类别”中选择“宏”选项,然后将该项拖放到工具栏上。

用户定义字段
用户定义字段(以下简称 UDF)是您可以创建并将其拖放到您的邮箱中的额外字段,用于存储您需要的额外信息。这可以是公司、用户ID、成本等...
您已经内置了相当多的字段,可以通过右键单击邮箱的标题栏并选择“字段选择器”来添加它们。
它将为您提供一个工具箱,您只需从那里将项目拖放到您的邮箱中。
如果您滚动到工具箱顶部下拉菜单的底部,您就可以找到“用户定义字段”。在这里,您可以创建您想要在将来使用的 UDF。
您可以单击“新建...”按钮创建一个新字段,然后进行设置
为了深入了解用户定义字段,请访问以下链接
- http://support.microsoft.com/kb/290656
- http://www.howto-outlook.com/faq/locatefeature.htm
- http://blog.meteorit.co.uk/2008/07/04/using-field-chooser-to-find-out-when-an-outlook-appointment-was-created/
好的,我明白了,下一步是什么?
添加字段后,您可以将 Outlook 设置为使这些字段在单击时可编辑,但我发现这相当不舒服,甚至看起来不好。所以,我们改用工具栏和宏来管理这些字段。
我们将使用一个相当简单的宏来实现所需的结果。我将向您展示一个简单的示例。
使用代码
好的。现在您已经熟悉了 UDF 和优化选项,让我们直接开始编写代码。
为了使代码正常工作,您需要添加对 Microsoft Forms 2.0 Object Library 的引用。
您可以通过在 Outlook 中打开 Visual Basic 编辑器(Alt+F11)来完成此操作。使用项目资源管理器向项目添加一个模块。双击模块。然后转到“工具”-“引用”,然后在“引用”旁边打勾,或者浏览找到“FM20.dll”。

如果以上步骤完成,您就可以开始编写代码了,您需要创建一个子程序
Sub Customer(Optional ByVal Value As String, Optional ByVal IsCustomEntry As Boolean = False)
这将允许您调用带有参数的 Sub,这样您就不必 spam 您的模块。您可以将其设置为添加一个固定值到一个字段,如下所示
Sub CustomerID_Customer1()
Call CustomerID("ABCD1234")
End Sub
或者,您可以向用户询问特定输入,这将触发一个输入框
Sub CustomerID_CustomerEntry()
Call CustomerID(, True)
End Sub
让我们继续讨论变量
Dim i As Long 'Cycle Counter
Dim myCollection As Object 'Collection of the selected emails
Dim msg As Outlook.MailItem 'Defining the Mail Item
Dim objProperty As Outlook.UserProperty 'Defining the UDF Item
Dim UserDefinedFieldName As String 'Defining the Field name
我使用 UserDefinedFieldName
,这样我就可以复制粘贴相同的函数,只更改一个变量的值来适应我想要管理的任何 UDF。
Set myCollection = Outlook.Application.ActiveExplorer.Selection
这将把选定的项目放入一个集合中。UDF 将应用于所有选定的 Mail Items。
UserDefinedFieldName = "CustomerID"
这设置了 UDF 的名称。
If IsCustomEntry = False Then ' No popup message
If Not myCollection Is Nothing Then ' Check if selection is not empty
For i = 1 To myCollection.Count ' Go through each item with each cycle
Set msg = myCollection.Item(i) ' Set the current cycle's email
Set objProperty = msg.UserProperties.Add(UserDefinedFieldName, Outlook.OlUserPropertyType.olTExt) ' Set UDF - Get UDF name from variable - Set UDF type
objProperty.Value = Value ' Add value in arguments to UDF
msg.Save ' Save MSG
Next i
End If
如果您选择了固定值,则上述循环将运行。如果您选择了自定义输入,则下面的循环将运行:
ElseIf IsCustomEntry = True Then ' With popup message
Value = InputBox("Please enter custom value", "Input custom field value") ' Get value from user
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
这是整个代码,不间断的。
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
'we selected multiple items
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
'we selected multiple items
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
完成后,您只需调用该函数,添加参数。您将在“自定义”菜单中找到该宏,并可以将其添加到为此目的创建的工具栏上。
要能够查看您添加的内容,您需要创建一个名为“CustomerID”的 UDF,然后将新的 UDF 拖放到邮箱中。
关注点
请不要忘记添加引用……它会产生一个烦人的错误消息,这不会帮助您识别问题。
您也许可以在宏中添加一些错误处理,以防您尝试编辑非邮件项(如日历邀请或任务)的 UDF。我认为最简单的方法
On Error Resume Next
是一个足够的解决方案,可以使代码跳转到下一项,或者您也可以添加一个决策树,您可以在其中检查 myCollection.Item(i)
是否为 MailItem。
结语
如果您巧妙地使用它,它可以极大地帮助您,例如在 Outlook 中创建一个包含最常用 UDF 及其值的下拉菜单,这样您就可以比以前更好、更快地管理您的电子邮件。
UDF 也可以作为分组标准。您可以将 UDF 设置为 MSGSTATUS,并添加值,例如:Active、Pending、Non-Action,然后将 Outlook 设置为根据 MSGSTATUS 字段对电子邮件进行分组。
您甚至不需要 UDF 可见,Outlook 仍然会使用其值进行分组!
如果您有任何问题,请随时与我联系!
历史
文章版本 1.0