Outlook 2010 中的 VBA 入门

**摘要:**本文向非程序员介绍一些使用 Visual Basic for Applications (VBA) 编程来扩展 Microsoft Outlook 2010 的方法。本主题提供了 VBA 语言概述、有关如何访问 Outlook 2010 中的 VBA 的说明、面向实际 Outlook VBA 编程问题的详细解决方案以及有关编程和调试的提示。

上次修改时间: 2011年4月5日

适用范围: Office 2010 | Outlook 2010 | VBA

本文内容
Outlook 2010 中的 VBA 编程
VBA 编程 101
宏和 Visual Basic 编辑器
使宏可供访问
联系人编辑宏
分发代码
摘要
其他资源

目录

  • Outlook 2010 中的 VBA 编程

  • VBA 编程 101

  • 宏和 Visual Basic 编辑器

  • 联系人编辑宏

  • 分发代码

  • 摘要

  • 其他资源

Outlook 2010 中的 VBA 编程

您是否面临从 Outlook 2010 中重复清除多个联系人的难题?是否必须将大量电子邮件附件逐一保存到硬盘?是否想从某些电子邮件消息中自动创建日历项目?还是不知道如何将 Microsoft Outlook 2010 中的联系人高效地导入 Microsoft Excel 2010 电子表格?

使用 Visual Basic for Applications (VBA) 可以执行上述任务并实现更多功能,VBA 是一种简单而又强大的编程语言,可为 Office 2010 应用程序扩展新功能,还可以自动执行重复性任务。

本文面向有经验的 Outlook 用户,他们希望了解有关 VBA 的信息,还希望深入了解编程对其根据需要定制 Outlook 2010 有何帮助。

在阅读本文之前,您可能要阅读介绍性文章Office 2010 中的 VBA 入门,其中详细介绍了有关 VBA 编程的基础知识。

Office 2010 中的 VBA 编程的强大功能在于,使用 VBA 可以完成用鼠标、键盘或对话框可以执行的几乎所有操作。而且,如果使用 VBA 可以执行一次,就可以轻松地执行上百次、上千次。(实际上,自动执行重复性任务是 VBA 在 Office 中的一种最常见用法。)

除了可通过编写 VBA 脚本来加速执行日常任务,还可以使用 VBA 为 Office 2010 应用程序添加新功能,或以特定于您的业务需要的方式来提示文档用户并与之交互。例如,在 Outlook 2010 中,您可以使用 VBA 通过标准用户界面中未提供的方式对联系人、电子邮件、日历项目或任务执行排序、导出和修改操作。

本文中的教程可使用 VBA 实现 Outlook 的自动化。该教程是一个实际示例,研究为有经验的 Outlook 用户提供的编程、VBA 和开发工具。

选择方法

VBA 编程是一种功能强大的解决方案,但并不总是最佳方法。有时候使用其他途径来实现目标更合适。

关键问题在于是否有更简单的方法。在开始 VBA 项目之前,请考虑内置工具和标准功能。例如,如果需要在 Outlook 中执行一项费时的操作,可考虑使用规则来解决此问题。是否可以执行一次任务然后使用 Ctrl+Y(重做)来重复该任务?

Outlook 2010 是一种功能强大的应用程序;您需要的解决方案可能已经准备就绪了。花些时间了解有关 Outlook 2010 的更多信息,再跳转到编程过程。

在开始 VBA 项目之前,确保您有时间使用 VBA。需要关注编程,编程结果可能无法预知。尤其是初学者,除非有时间仔细研究,否则切勿依靠编程。当期限迫近会造成极大压力时,可尝试编写"快速脚本"来解决问题。如果您的时间很紧,可以使用较传统的方法,即使这些方法单调又重复,也必须这样做。

VBA 编程 101

通过代码使应用程序执行操作

您可能认为编写代码是一项神秘而又复杂的工作,但基本原则是使用日常推理,并且很容易掌握。Office 2010 应用程序的创建方式如下:公开可以接收指令的对象,类似于为了与电话交互而设计带按键的电话。按下按键时,电话会识别指令并按照拨号顺序包括对应的号码。在编程时,您是通过向应用程序中的各个对象 发送指令来与应用程序交互。这些对象是可扩展的,但有限制。这些对象只能执行为其设计的操作,并且只按照您的指令执行操作。

例如,请考虑这样的用户:他在 Outlook 中创建电子邮件、选择收件人、键入邮件主题,然后单击"发送"。在 VBA 编程中,Outlook 会公开一个 MailItem 对象。使用 VBA 代码,您可以设置 MailItem 的主题和正文,并告诉它执行"保存"或"发送"操作。阅读本文后,您将了解有关这些对象、这些对象的组织方式及其描述和操作方式的更多信息。

对象、方法和属性

开发人员通过层次结构来组织编程对象,该层次结构称为应用程序的对象模型。例如,Outlook 中的"收件箱"是 Outlook Namespace 对象中的一个 Folder 对象。Folder 对象包含 MailItem 对象,等等。对象模型概略地对用户界面中显示的内容进行镜像,对象模型是应用程序及其功能的概念图。从编程角度而言,Folder 对象可以包含任意类型的项目对象,但通常 Outlook 用户界面中的几个文件夹都主要由特定类型的项目对象组成。例如,Outlook 用户界面提供一个主要包含 ContactItem 对象的"联系人"文件夹,和一个主要包含 AppointmentItem 和 MeetingItem 对象的"日历"文件夹。

对象的定义称为类,因此您可能会看到互换使用这两个术语的情况。从技术上讲,类是用于创建或实例化 对象的说明或模板。

只要对象存在,便可通过设置其属性 和调用其方法 来处理该对象。如果您认为对象是一个名词,则属性是描述该名词的形容词,方法是为名词赋予行动的动词。更改属性会更改对象的外观或行为的质量。调用对象的一个方法可使对象执行某个操作。

在了解 Outlook 中对象模型的基本布局以及 Application、Explorer 和 Folder 对象的一些关键属性(允许您访问当前状态)后,便可以开始使用 VBA 扩展和处理 Outlook 了。

宏和 Visual Basic 编辑器

既然您已了解 Outlook 2010 应用程序如何公开其对象模型,可能已等不及要尝试调用对象方法、设置对象属性以及响应对象事件。为此,您必须在一个位置以 Office 可以理解的方法编写代码;通常使用是 Visual Basic 编辑器。尽管该编辑器是在默认情况下安装的,但在功能区中启用该编辑器之前,许多用户都不知道该编辑器的存在。

打开"开发工具"选项卡

所有 Office 2010 应用程序都使用功能区。功能区中有一个"开发工具"选项卡,在此可以访问 Visual Basic 编辑器和其他开发人员工具。由于 Office 2010 在默认情况下不显示"开发工具"选项卡,因此必须使用以下过程启用该选项卡:

启用"开发工具"选项卡

  1. 在"文件"选项卡上,选择"选项"打开"Outlook 选项"对话框。

  2. 单击该对话框左侧的"自定义功能区"。

  3. 在该对话框左侧的"从下列位置选择命令"下,选择"常用命令"。

  4. 在该对话框右侧的"自定义功能区"下,选择"主选项卡",然后选中"开发工具"复选框。

  5. 单击"确定"。

备注

在 Office 2007 中,显示"开发工具"选项卡的方法是单击 Office 按钮、单击"选项",然后在"选项"对话框中的"常用"类别下选中"在功能区显示‘开发工具’选项卡"复选框。

启用"开发工具"选项卡后,可以轻松找到"Visual Basic"和"宏"按钮。

图 1. Outlook 2010 中的"开发工具"选项卡

Outlook 2010 中的开发人员选项卡

安全问题

默认情况下,为了使您免受病毒和其他恶意代码的侵害,Outlook 中会禁用 VBA 宏。若要启用这些宏,请使用以下过程:

启用宏

  1. 在"文件"选项卡上,选择"Outlook 选项"打开"Outlook 选项"对话框,然后单击"信任中心"。

  2. 单击"信任中心设置",然后单击左侧的"宏设置"选项。

  3. 选择"为所有宏提供通知",然后单击"确定"。该选项允许在 Outlook 中运行宏,但在宏运行之前,Outlook 会提示您确认是否要运行宏。

  4. 重新启动 Outlook 以使配置更改生效。

Visual Basic 编辑器

在显示"开发工具"选项卡后,可以打开 Visual Basic 编辑器,该编辑器是用于编写和编辑用于 Outlook 的 VBA 代码的内置工具。使用以下过程可以打开 Visual Basic 编辑器:

打开 Visual Basic 编辑器

  1. 单击"开发工具"选项卡上的"宏"按钮。

  2. 在随后出现的"宏"对话框中的"宏名称"下键入 Test。

  3. 单击"创建"按钮打开 Visual Basic 编辑器,其中包含已键入的新宏的大纲。

Visual Basic 编辑器包含下列代码。

    Sub Test()
    End Sub

Sub 代表"Subroutine"(子例程),可将其暂时定义为"宏"。运行 Test 宏将运行 Sub Test() 与 End Sub 之间的所有代码。

现在,请编辑宏,使其类似如下代码。

    Sub Test()
       MsgBox("Hello world")
    End Sub

图 2. 在 Visual Basic 编辑器中测试宏

在 Visual Basic Editor 中测试宏

注意 Visual Basic 编辑器的左面板。Test 宏位于 Project1 的 Module1 中。一个项目模块包含多个模块,每个模块包含可以作为 .bas 文件导入或导出的 VBA 代码的集合。

只要对象存在,便可通过设置其属性 和调用其方法 来处理该对象。您编辑过的子例程中包含一个方法,该方法是用于执行操作的代码。该子例程中的 Test() 方法现在是对象 Project1 的一个成员。

备注

其他 Office 应用程序可能会在 Visual Basic 编辑器中列出多个项目,但在 Outlook VBA 中,只列出一个项目,并且该项目始终名为 Project1。

返回到 Outlook 中的"开发工具"选项卡,再次单击"宏"按钮。在随后出现的列表中选择"Project1.Test"宏,然后单击"运行"显示包含文本"Hello, world!"的小消息框。

祝贺您!您刚刚在 Outlook 中创建并实现了 VBA 代码!在消息框中单击"确定"关闭消息框并完成宏的运行。

如果未出现消息框,请检查宏安全性设置并重新启动 Outlook。

使宏可供访问

如果您经常使用宏,可能会发现用键盘快捷方式或"快速访问工具栏"按钮访问宏更为方便。

若要在"快速访问工具栏"中为"Test"宏创建按钮,请使用以下过程:

在"快速访问工具栏"中为宏创建按钮

  1. 单击"文件"选项卡。

  2. 单击"选项"打开"Outlook 选项"对话框,然后单击"快速访问工具栏"。

  3. 在"从下列位置选择命令:"下的列表中,选择"宏"。在随后出现的列表中查找类似于"Project1.Module1.Test"的文本,并选择该文本。

  4. 单击"添加 >>"按钮将宏添加到右侧的列表中,然后单击"修改…"按钮选择与该宏关联的按钮图像。

  5. 单击"确定"。现在,您应在"快速访问工具栏"中的"文件"选项卡上方看到新按钮。

现在,您不必使用"开发工具"选项卡,便可随时快速运行宏,赶快试试吧。

图 3. 向快速访问工具栏分配宏

向快速访问工具栏分配宏

联系人编辑宏

假设您在名为 Example Systems 的公司中有多个联系人,每个联系人的电子邮件地址都包含 @example.com 域。现在,假定 Example Networks 收购了 Example Systems,并将所有员工的电子邮件地址更改为 @example.net。如果您只有一个或两个联系人在 Example Systems,则手动更改这些地址是很简单的工作。但如果有 20、50 或 100 个联系人,则自动执行此类重复性任务便是 VBA 在 Office 中的常见用途了。

本文探讨如何使用 Outlook 中的 VBA 修改联系人,还对一些 VBA 概念做了解释。

访问联系人文件夹

按照您创建 Test 宏时使用的步骤创建名为 CompanyChange 的新宏并在 Visual Basic 编辑器中打开该宏。

第一个任务是在 Outlook 中访问"联系人"文件夹对象,然后将对该对象的引用存储在一个变量中。

在编程中,变量是一个临时的命名对象,可保存值或对对象的引用。下面的示例代码使用一个名为 ContactsFolder 的变量。该代码指示 VBA,它将把一个 Folder 对象放入其中并运行 Session 对象的 GetDefaultFolder 方法,以查找 Contacts 文件夹并将对它的引用存储在该变量中。

Visual Basic 编辑器中包含一种有帮助的自动代码条目,名为"智能感知"。在键入 Session.GetDefaultFolder 时要仔细查看,然后按下左括号作为其参数。在执行此操作期间,Visual Basic 编辑器会显示选项列表。使用下拉箭头或鼠标选择 olFolderContacts(这是一种可用的文件夹类型),然后按下 Tab 键将其选中。

图 4. 使用"智能感知"选取文件夹类型

使用"智能感知"选取文件夹类型

虽然在处理代码时使用复制和粘贴功能是可以有效避免键入错误的极好做法,但直接在 Visual Basic 编辑器中键入代码可以亲自体验编辑器对您有何帮助。

    Sub CompanyChange()
        Dim ContactsFolder as Folder
        Set ContactsFolder = Session.GetDefaultFolder(olFolderContacts)
    End Sub

再添加一行,以获取一些反馈并在宏的运行过程中测试宏。(而且可以像在"使宏可供访问"一节中那样,花一分钟的时间为 CompanyChange 创建一个"快速访问工具栏"按钮。)

    Sub CompanyChange()
        Dim ContactsFolder as Folder
        Set ContactsFolder = Session.GetDefaultFolder(olFolderContacts)
        MsgBox ("Contacts Found: " & ContactsFolder.Items.Count)
    End Sub

Items 是 Folder 对象的一个属性,Count 是 Items 属性的一个属性。

运行宏;Outlook 中的联系人数应出现在消息框中。

如果尚未执行此操作,请打开"联系人"文件夹,创建一些为虚构的 Example Systems 公司工作的示例联系人。为每个示例联系人给定公司名称 Example Systems,并为每个联系人创建一个与 someone@example.com 相似的不同电子邮件地址。

对象集合

集合 是现代编程语言(如 VBA)中最强大的功能之一。集合 是可以存储在属性中的一组对象,通过轻松"演练"可以访问每个对象。在该示例中,代码必须遍历联系人的集合以查找 Example Systems 的人员。

如上所述,ContactsFolder 变量可提供对 Folder 的 Items 集合的访问权限。联系人 Folder 的 Items 集合将返回 ContactItem 类型的对象。创建一个变量,来保存对每个 ContactItem 的引用。

    Dim Contact As ContactItem

请注意,如果您不知道从集合中返回何种类型的对象,也可以使用通用 Object 类型。但如果您知道对象的类型,精确指定类型有许多优点。

    Dim Contact As Object

在拥有 ContactItem 后,必须检查每个人的公司名称。由于 ContactItem 对象用于存储有关联系人的信息,因此必须存在一个用于存储公司名称的属性,但由于您不知道该属性的名称,因此必须使用下列两种方法之一来查找该名称。

确定属性名称

为了在 VBA 中充分利用对象,必须了解其属性和方法。虽然使用在 Web 中找到的示例代码可以执行许多任务,但您可以通过系统地检查所使用的对象来增加选项、减少调试和节省时间。

例如,您可以通过在代码中选择 ContactItem 并按下 F1 来在"帮助"的"Outlook 开发人员参考"中查找有关 ContactItem 的信息,也可以在"帮助"中搜索 ContactItem。请务必研究各个主题中的链接,以深入了解相关对象。

"开发人员参考"是用于 VBA 编程的强大工具,也是查找您的代码所需属性的一种方法。在阅读有关 ContactItem 对象的一般信息后,可单击"ContactItem 对象成员"链接查看方法和属性的列表(属性和方法统称为成员)。

如果您继续查看该列表,您会看到一个 CompanyName 属性。此属性听起来似乎很有用。

除了使用"Outlook 开发人员参考"查找属性或方法外,还可以使用 Visual Basic 编辑器中的智能感知功能。在将变量 Contact 定义为 ContactItem 后,键入 Contact 和句点可以显示与"帮助"中所列内容相同的成员列表。若要选择一个智能感知选项,请使用向上和向下箭头或鼠标突出显示该选项,然后使用 Tab 键将其选中。

智能感知不提供各个成员的说明,因此当上下文使您的选择很明显或您已了解成员的名称但无法记住其准确拼写时,使用此方法将很有帮助。成员名称拼写错误会产生 Visual Basic 编辑器在您运行宏之前一直无法标记的错误。

循环访问集合

现在,您有一个集合,您了解该集合中包含的对象类型,并且要访问找到的对象中的一个属性。您已准备好要使用 For Each 循环来遍历集合并处理它所包含的对象。

在伪代码 中,您准备执行下列操作。

    For Each [object variable] in [a collection that contains that type of object]
    [do something with] [object variable].Property
    Next

在实际代码中,上述代码转换为下列代码,其中涉及包含 MsgBox 语句的行。

    For Each Contact In ContactsFolder.Items
       Debug.Print Contact.CompanyName
    Next

再次运行宏之前,请在 Visual Basic 编辑器中打开立即窗口。为此,请在菜单栏中单击"视图",然后单击"立即窗口"。前面,您使用 MsgBox 从脚本中获取反馈。虽然 MsgBox 很有用,但它总是等待您单击"确定",然后才显示下一条消息。相反,Debug.Print 每次都向立即窗口发送一行输出,而不等待您确认。运行此脚本后,您应该能够在立即窗口中看到公司名称的列表。注意,该列表对于开发人员非常有用,但与您共享此宏的用户看不到该列表。

使用 If 语句做决定

在您已完成的解决方案中,您希望宏只更改在 Example Systems 工作的联系人,而不更改其他联系人。这种条件逻辑正是编程的优势所在。这里,您可以使用 If 语句告知 VBA 仅在所提供条件为真时运行代码;否则,它应跳到 End If 语句之后的代码。

    If [some condition is true] Then
    ' do things
    End If
    ' continue on whether or not the condition was true

在您所处理的问题中,决定条件是当前 ContactItem 的 CompanyName 属性是否设置为字符串"Example Systems"。

在下面的代码中,请注意双引号。字符串值(即文本值)与数字值相反,始终包含在双引号内。VBA 忽略单引号,单引号用于您和其他开发人员的注释中。

在代码中添加条件,使完整脚本类似于如下代码。

    Sub CompanyChange()
        Dim ContactsFolder As Folder
        Set ContactsFolder = Session.GetDefaultFolder(olFolderContacts)
        MsgBox ("Contacts Found:" & ContactsFolder.Items.Count)
        
        Dim Contact As ContactItem
    
        For Each Contact In ContactsFolder.Items
            If Contact.CompanyName = "Example Systems" Then
                Debug.Print "Found: " & Contact.FullName
            End If
        Next
    End Sub

运行代码后,应在立即窗口中看到 Example Systems 联系人的姓名。

图 6. 使用立即窗口进行输出

使用输出的立即窗口

注意 Debug.Print 和前面的 MsgBox 为了清晰起见而合并已修复字符串的方法,例如 "Found: " 后跟属性返回的值。为使此方法起作用,必须使用字符串连接运算符 (&) 来合并这两个文本字符串。

重要说明重要说明

重要信息:在继续此教程的过程中,请务必谨慎。您使用的是实际的 Outlook 联系人列表,其中包含几个来自 Example Systems 的虚构联系人。将每个联系人的公司名称都修改为"Example Networks"并不合适。

更改公司名称

该操作已接近尾声。您已经加载了联系人,现在可以循环访问这些联系人并将您的联系人与来自 Example Systems 的联系人相区分。若要对 Example Networks 进行更改,您可以更改 CompanyName 属性并调用 Save 方法来提交更改。

    If Contact.CompanyName = "Example Systems" Then
        Contact.CompanyName = "Example Networks"
        Contact.Save
        Debug.Print "Changed: " & Contact.FullName
    End If

运行宏,然后查看 Example Systems 联系人;现在,这些联系人的公司名称应该已改为 Example Networks。请注意,为了以后测试脚本,必须手动将公司名称更改回 Example Systems 或创建可为您执行该更改的另一个宏。

虽然 Debug.Print 语句不是脚本运行所必需的语句,但请将其保留。您和您的用户从宏中获取的反馈越多越好。

更改电子邮件地址

更改 CompanyName 属性只是简单更改整个字符串。若要将电子邮件地址的域由 @example.com 更改为 @example.net,需要执行字符串操作。每个字符串都有一个内置的编号系统,其中每个字符都有一个从 1 开始的索引号。您可以使用各种 VBA 函数来处理部分或全部字符串。由于存在许多需要检查子字符串或更改部分字符串的编程情况,因此了解这些字符串操作可显著增加您作为 VBA 程序员时的选择。(在 Web 中搜索"VBA 字符串函数"可提供许多有用的列表和示例。)

可以使用 Replace 函数来执行将一个子字符串替换为另一个子字符串的简单替换,但您可能经常会面临需要用更复杂的代码来处理字符串的情况。在紧邻代码之前的位置添加下面的行,将调用 Contact.Save。

    Contact.Email1Address = Replace(Contact.Email1Address, "example.com", "example.net")

请从左至右认真阅读代码。该代码指示将联系人的 Email1Address 属性(第一个电子邮件地址)设置为新值。提供新值的方法是让 Replace 函数在当前的 Contact.Email1Address 属性中查找字符串"example.com"并将其替换为"example.net"。

确保虚构联系人的公司名称已设置为 Example Systems,然后运行该脚本。电子邮件地址应全都更改为 @example.net,公司名称应全都更改为 Example Networks。

使代码通用

现在,您有一个强大的宏,但功能有限,因为指定新公司名称的唯一方法是编辑代码。若要使您的代码更加有用,可以使用 InputBox 函数提示用户输入。

下列代码是最终脚本。这是一个有用并且完整的 Outlook 解决方案。

    Sub CompanyChange()
        Dim ContactsFolder As Folder
        Set ContactsFolder = Session.GetDefaultFolder(olFolderContacts)
        Dim OldCompanyName As String
        Dim NewCompanyName As String
        Dim OldEmailDomain As String
        Dim NewEmailDomain As String
        Dim ContactsChangedCount As Integer
        
        ' Ask user for inputs
        MsgBox ("This script will change all of your contacts from one company to another.")
        OldCompanyName = InputBox("Under what name are the contacts listed in Outlook now?")
        NewCompanyName = InputBox("What is the new company name to set them to?")
        OldEmailDomain = InputBox("What is the e-mail domain name currently listed after the @ sign? e.g. mycompany.com")
        NewEmailDomain = InputBox("What should the e-mail domain be set to? Leave blank and click OK if no change")
        ContactsChangedCount = 0
        
        Dim Contact As ContactItem
     
        ' loop through Contacts and set those who need it
        For Each Contact In ContactsFolder.Items
            If Contact.CompanyName = OldCompanyName Then
                Contact.CompanyName = NewCompanyName
                If NewEmailDomain <> "" Then
                    Contact.Email1Address = Replace(Contact.Email1Address, OldEmailDomain, NewEmailDomain)
                End If
                Contact.Save
                ContactsChangedCount = ContactsChangedCount + 1
                Debug.Print "Changed: " & Contact.FullName
            End If
        Next
        ' confirm and clean up
        MsgBox (ContactsChangedCount & " contacts were changed from '" & OldCompanyName & "' to '" & NewCompanyName)
        Set Contact = Nothing
        Set ContactsFolder = Nothing
    End Sub

分发代码

从开发所在计算机向其他计算机移动代码的过程被称为部署,这是编程项目的一个重要部分。本节介绍如何将新宏移动到其他计算机中。

首先需要一个小型后台。Outlook Visual Basic for Applications 代码设计用作个人宏开发环境;并非设计用于部署或分发。因此,无法像处理其他 Office 应用程序(如 Excel 或 Word)那样在文档内保存宏。

若要将 Outlook VBA 宏从一台计算机移至另一台计算机,可从第一台计算机中导出代码模块并将其导入第二台计算机。也可以使用 Visual Basic 编辑器将项目的源代码复制并粘贴到第二台计算机上的 Project1 中。

如果您开发的解决方案要分发给多人,则应将 Visual Basic for Applications 代码转换为 Outlook COM 加载项。但是,与创建简短的宏相比,开发 COM 加载项通常需要更多的编程知识,因此,如果您的 Visual Basic for Applications 项目相对简单,并且没有过多人需要使用该项目,则可向其发送包含说明的代码,说明将解释如何打开 Visual Basic 编辑器并手动导入您的代码模块。

导入和导出模块

尝试在 Module1 中导出和导入新宏。在"项目"窗格中选择"Module1",然后在 Visual Basic 编辑器中单击"文件"菜单并选择"导出文件…"。Visual Basic 编辑器应提示您将该文件保存为 Basic 文件 (.bas)。请将该文件保存为 Contacts.bas。(如果默认文件扩展名为其他某种类型,请验证是否已选择"Module1",然后重新打开"导出文件"对话框。)

在记事本中打开 Contacts.bas,以查看带有标题行的代码,当您导入代码时,Visual Basic 编辑器将使用该标题行来命名模块。

    Attribute VB_Name = "Module1"

Module1 用于本地脚本和实验,因此可将该名称更改为可对模块中的宏进行描述的名称。例如,可以使用 Contacts 作为与 .bas 文件的名称并行存在的模块名称。以后,如果编写用于自动对联系人执行某种操作的其他宏,可在此处添加代码,并将宏的一个逻辑分组放在一个模块中。

    Attribute VB_Name = "Contacts"

现在,返回到 Visual Basic 编辑器。依次单击"文件"和"导入文件",然后选择"Contacts.bas"以将其导入。

双击在"项目"窗格的"模块"列表中出现的新"联系人"模块,以查看您的代码。

在 Outlook 中,单击"开发工具"选项卡上的"宏"按钮。您应该会看到用于"…Project1.Contacts.CompanyChange"的一个条目。

到此便完成了向组织的其他成员分发宏代码的最简单方法。当然,若要在 Visual Basic 编辑器中导入 Contacts.bas 并添加"联系人"模块,这些成员仍必须在 Outlook 2010 中启用"开发工具"选项卡。在导入 Contacts.bas 之后,他们可从"开发工具"选项卡运行您的宏,或打开"Outlook 选项"并将该宏分配给一个"快速访问工具栏"按钮或功能区本身。有关更复杂的部署选项的详细信息,请参阅"其他参考资料"部分。

摘要

本文介绍了 Microsoft Outlook 中的 Visual Basic for Applications (VBA) 的强大功能。VBA 可以自动执行重复性任务和扩展 Outlook 2010。本文使用实际 VBA 编程示例说明如何打开"开发人员"工具栏,如何创建宏,然后运行、编辑并调试这些宏。而且,本文还讨论了 VBA 变量、对象模型和函数,如 If 和 For Each。

其他资源

有关详细信息,请参阅以下资源: