Microsoft Office Outlook 2003 完全揭密

Microsoft Office Outlook 2003 完全揭密

 本页内容

Microsoft Visual Basic for Applications (VBA) 是从完整的 Microsoft Visual Basic 语言派生的,它包含在许多产品中。最明显的是,它是所有 Microsoft Office 应用程序以及其他产品(如 Microsoft Visio 和 Great Plains 软件)的主要编程语言。

本章将介绍 VBA 环境以及使用 VBA 所需的一些重要概念。此后,您将看到一些示例,它们介绍了在 Microsoft Office Outlook 2003 中使用 VBA 自动执行常见任务的简单方法。如果您熟悉编程语言,将会有所帮助,但是只需按照说明操作也可以运行这些示例。

您将在随附 CD 的“Author Extras”部分中找到用于创建本章中的 VBA 应用程序的代码。

无论您是新手还是更高级的用户,都可以获得许多有关 VBA 的绝佳书籍。查看 Microsoft Press Books Overview 和您喜欢的书店中是否有符合您需要的书名。

对象模型一览

VBA 旨在集成到其他应用程序中。它允许用户方便地使用其父语言 Visual Basic 的功能,还允许用户访问外部函数和应用程序。要了解如何最大限度地发挥 VBA 的作用,一定要了解对象模型的概念。

术语对象模型 是指应用程序的公开函数(属于可从代码内访问的应用程序的函数)。这些函数是作为一组对象公开的,其中的每个对象都具有属性、方法和事件。对象模型包含一组可用于创建对象的定义或

您可以将类想象为设计。请考虑架构师的房屋规划。这些规划定义房屋的外观以及它应该执行的功能,但是在建筑师建造房屋之前,该规划除了描述房屋之外不做任何事情。在建筑师建造房屋时,他或她就是在创建架构师设计的实例。尽管建筑师可能会在构建房屋开发时创建该设计的许多实例,但是在某个房屋(实例)构建之后,它就会独立于开发中的任何其他房屋。

对象模型在 VBA 中的使用方法类似于使用规划建造房屋的方法。选择所需的函数集,然后创建对它们进行定义的类的实例。为此,请使用 VBA 关键字和语法。

引用对象

要在 VBA 中使用对象,必须添加对它们的引用。这会告诉 VBA 有一组特定的对象存在,以及为这些对象定义了哪些类。要添加引用,请启动 VBA 编辑器并依次选择 ToolsReferences。屏幕上会显示一列对象。要添加对对象定义的引用,只需选中列表中相应项目旁边的复选框。

通过查看帮助文件,通常可以找到为执行某些操作而需要设置哪些引用。对于本章和下一章中的示例来说,一些重要的引用是对其他 Office 应用程序的对象模型的引用。这些引用以下列名称出现在列表中:

Excel_Microsoft Excel 11.0 Object Library
Word_Microsoft Word 11.0 Object Library
要从另一个应用程序访问 Outlook 功能,请设置对 Outlook 对象模型的引用:Outlook_Microsoft Outlook 11.0 Object Library
对于数据访问,使用 ActiveX 数据对象 (ADO) 非常有用:
数据访问_Microsoft ActiveX Data Objects 2.7 Library
可以使用许多 ADO 对象模型;最新的对象模型是 ADO 2.8

声明和实例化对象

要创建对象的实例,应首先使用 Dim 语句来声明对象。该语句可设置该对象类型变量的维数。例如,以下语句可声明一个 Word.Application 类型的新变量:

Dim objWord as Word.Application 

在声明某个对象以后,您可以使用 Set 和 New 关键字来创建该对象的实例。您先前声明的变量会指定给该实例,之后您就可以开始使用该实例了:

Set objWord = New Word.Application 

现在,您可以通过新定义的实例来访问 Word.Application 对象的所有函数和属性。

完全揭密提示:处置实例

当您创建某个对象(特别是外部应用程序对象)的实例时,请记住在使用完之后处置它。可以通过将对象变量设置为 Nothing 来处置它:

Set objWord = Nothing

当所有的对象引用都超出范围时,VBA 将自动清除并处置它们,但是这通常不会发生。随后会留下没有关联项但仍然占用内存的对象。如果所创建的对象是占用大量内存的大型应用程序(如 Microsoft Word),则这种情况十分槽糕。

属性、方法和事件

属性 是与对象关联的值。对象名称就是属性的一个示例。属性可以是只读的,也可以是读写的。您通常使用属性来告诉某个对象如何表示自身或者如何操作。

方法 与代码中的函数等效,但是它属于特定对象,并且只能通过该对象访问(而不是可通用)。您可以调用对象的方法来执行任务(并可能会返回结果)。方法可以使用参数。事件 由已经实例化的对象使用,以告诉应用程序在正常程序流外部发生的事情。大量 Microsoft Windows 体系结构都基于事件(即,与 Windows 相关的消息)的可用性。

了解 VBA 与 VBScript 的关系

在 Microsoft Outlook 2000 之前,在 Outlook 中开发代码应用程序的唯一选择就是使用 Microsoft Visual Basic Scripting Edition (VBScript)。尽管这允许进行某些自定义,但是在 Outlook 2000 中引入 VBA 可允许开发人员对整个产品进行更高级别的控制,以及与 Office 家族的其他成员进行更方便的集成。VBA 在许多重要方面都不同于 VBScript。最明显的是,VBA 是一个更友好的工作环境。这是因为存在随 VBA 引擎提供的编辑器,还因为 VBA 比 VBScript 更接近功能完善的编程语言(如 Visual Basic)。

在 Outlook 中,VBA 和 VBScript 之间的重要区别与您在何处使用这两种语言有关。与 VBScript 相比,VBA 可让您对 Outlook 进行更强的控制,前者只允许您在特定的自定义窗体后面工作。在 VBA 中,您可以在应用程序级别工作,在该级别,您可以控制 Outlook 各个区域之间的许多交互,还可以自动执行几乎所有的界面操作。

VBA 开发环境概述

在许多启用了 VBA 的应用程序中,如果您在其中的某个应用程序中进行过编程,则会比较熟悉 Outlook 中的 VBA 环境。该环境与所有 Office 产品以及许多第三方应用程序中所使用的环境相同。

VBA 环境是作为独立于主 Outlook 应用程序环境的窗口来寄宿的。要从 Outlook 中打开 VBA 编辑器窗口,请依次选择 ToolsMacroVisual Basic Editor

该环境由许多窗口和工具栏组成,图 A2-1 显示了其中的一些窗口和工具栏。“项目”、“属性”和“调试”窗口是 VBA 环境所必需的,并且可以停靠在该环境的边缘。代码编辑器和窗体编辑器作为多文档界面 (MDI) 窗口运行,这类似于多个文档在 Word 或 Microsoft Excel 中的显示方法。它们全都出现在外壳程序中,您可以使用“窗口”菜单在它们之间进行方便的切换。要查看或隐藏其中的任何窗口,请使用“视图”菜单。


图 A2-1. VBA 环境包含许多窗口和工具栏。

“项目”窗口

“项目”窗口显示您使用的项目和文件。构成一个项目的文件以树的形式排列在“项目”窗口的“项目”条目下。

下面是项目树中不同部分的说明:

Microsoft Outlook Objects 项目树的该分支始终存在,并且总是至少包含一个名为 ThisOutlookSession 的对象。该对象用于放置在 Outlook 的应用程序级别工作的代码。它表示 Outlook 的当前实例并允许您访问该应用程序,以便可以为 Outlook 中发生的某些事件添加代码。例如,如果您希望某个任务在 Outlook 启动时执行,请将代码放到 ApplicationStartup 事件中。

Forms 项目树的该分支用来存放您所构建的所有窗体的条目。这些是 VBA 窗体,它们与 Outlook 窗体不同。您将向应用程序中添加 VBA 窗体,以允许用户执行与 Outlook 的任何自定义区域不相关的任务。例如,要执行某个特定任务,您可能需要从用户收集信息。您可以构建一个自定义的 VBA 窗体,使其在用户执行某个特定任务时显示,并要求用户提供某些信息。

有关以这种方式使用自定义 VBA 窗体的说明,请参阅下面的“添加窗体”。

Modules 在项目树的该分支下,您可以找到所有包含通用代码的代码模块。这是一个用来放置公共代码的好位置,因此必须对应用程序的许多区域可用。它还是用来储存宏代码的好位置,按钮使用这些宏代码来启动 Outlook 应用程序的各个部分。在本章后面,当您探究如何实现自定义工具栏按钮时,将发现用于此目的的代码放在模块中。在一个项目中可以有许多模块;标准做法是,将代码分成多个逻辑功能区域,然后将每个功能区域实现为不同的模块。例如,您可以具有一些针对联系人信息执行操作的函数、针对日历项执行操作的函数、与错误处理有关的函数,以及一些可由任何功能区域使用的通用代码函数。在这种情况下,您应当实现名为 basContacts、basCalendar、basErrorHandling 和 basGeneral 的四个模块。(bas 前缀是有历史的,它是指这些文件包含 BASIC 代码。)

Class Modules 在该区域中,您可以构建在整个代码中使用的类模块。尽管它们允许您构建函数,但是类模块(与一般模块不同)要求您为了使用函数,必须创建类的实例(而不仅仅是调用函数名)。类模块用于将类似的功能封装在单个区域中,以便可以像任何其他对象那样用在 Outlook 中。

由于对如何以及为何使用类模块来以面向对象的方式开发应用程序的讨论非常复杂,因此本文不对此进行介绍。我建议您查询有关开发面向对象应用程序的书籍,以便了解相应的方法,并通过使用类在 Outlook 应用程序中应用这些技巧。有关该主题的一本有用的书是 Programming Microsoft Visual Basic .NET(Microsoft Press,2002 年),其作者是 Francesco Balena。

按照下列步骤向 VBA 项目中添加新文件:

1.

右键单击“属性”窗口的主区域并选择“插入”。

2.

选择三种文件类型(UserForm、Module、Class Module)中的一种。在项目树的相应分支下,显示一个具有通用名称的新文件。

3.

使用“属性”窗口重命名该文件。

有关重命名的说明,请参阅下面的“属性窗口”。

尽管“项目”窗口中的文件都作为单独的项目显示和列出,但是它们并不作为单独的文件存储,而是作为它们在 Outlook 中存储的占位符存储。然而,您可以将它们作为单独的文件导入和导出,以允许在其他应用程序中使用它们。请按照下列步骤导出文件:

1.

在“项目”窗口中,选择要导出的文件。

2.

依次选择 FileExport File,或者右键单击并选择 Export File

3.

选择要向其中导出文件的目录。

4.

命名该文件。

还可以将任何 VB 或 VBA 模块或者类文件导入到 Outlook 项目中。请按照下列步骤导入文件:

1.

右键单击“项目”窗口中的任何位置,或者依次选择 FileImport File

2.

查找要导入的文件,并在对话框中选择它。导入的文件出现在项目树的相应分支下。

您开发的所有 VBA 代码都保存在 VBAProject.OTM 文件中。在默认情况下,该 OTM 文件位于 C:/Documents And Settings/<username>/Application Data/Microsoft/Outlook 中。

如果您希望分发某个应用程序,则应当将该应用程序作为组件对象模型 (COM) 外接程序(而非 VBA 应用程序)来开发。

“属性”窗口

在“属性”窗口中,可以检查和修改所选对象的任何可配置属性。对于在“项目”窗口中选择的任何文件,Name 属性都会出现在“属性”窗口中,您可以在其中更改文件的名称。此窗口在您构建 VB 窗体时会变得相当复杂,这是因为该窗体以及放到其上的每个控件都与许多属性相关联。

例如,在向该项目中添加 Module 类型文件后,应该按照下列步骤来更改文件的 Name 属性:

1.

在“项目”窗口中,选择要重命名的项目文件。“项目”窗口改为显示有关所选文件的信息 — 在本例中为名称。

2.

选择 Name 属性,并将它更改为有意义的名称,如 basCommonFunctions

3.

在 VBA 环境的任何其他位置,在 Name 属性以外的地方单击。“项目”窗口中文件的名称会发生更改,以反映修改过的属性。

为了演示一组更复杂的属性,现在向该项目中添加一个 UserForm 类型文件。请注意,现在“属性”窗口填满了可自定义的属性(请参见 A2-2)。


图 A2-2. 窗体和控件具有许多可在“属性”窗口中更改的属性。

调试窗口

您可以使用许多调试工具来调试 VBA 应用程序。使用这些工具,可以在执行中的代码内检查和修改对象的状态。这些工具连同相应的信息一起出现在屏幕底部的不同调试窗口中。您可以通过选择“视图”然后选择相应的工具来打开调试窗口。代码必须处于中断模式,才能使用调试工具。要在代码执行时进入中断模式,可按 Ctrl+Break,或者通过选择感兴趣的一行代码并按 F9 来设置断点。当正在执行的代码到达断点时,环境将进入中断模式,您就可以使用调试工具了。

调试工具包含下列窗口:

“立即”窗口 在中断模式下查看值并执行语句。

“监视”窗口 查看您在 VBA 中设置的监视活动。监视 是在程序执行时进行求值的表达式。该工具允许您监视值的变化,而不必像在“立即”窗口中那样手动重新执行它。

“局部变量”窗口 查看所有局部变量和对象的值。

要查看“立即”窗口,请参见下面的图 A2-1。“立即”窗口显示在 VBA 环境的底部。

有关如何使用调试工具的深入讨论,请查阅 Microsoft Office 2000/Visual Basic for Applications Fundamentals(Microsoft Press,1999 年),该书的作者是 David Boctor。

“代码”窗口

当您在“项目”窗口中双击某个文件时,会在屏幕的主区域中打开一个新窗口。如果您选择了 ModuleClassModuleThisOutlookSession,则会显示“代码”窗口。使用此窗口,可以向 Outlook 中添加代码。

“对象”窗口

如果您在“项目”窗口中双击某个窗体,就会打开“对象”窗口,并显示该窗体的图形视图。要显示该窗体的代码,请执行下列操作之一:

双击该窗体或它上面的控件。

在“项目”窗口中右键单击窗体条目并选择 View Code

依次选择 ViewCode

VBA 工具栏

在构建 VBA 应用程序时可以使用三个特殊的工具栏。大多数通过单击工具栏按钮就可以使用的功能也可以在菜单上使用,并且通常也可以通过快捷组合键来访问。

“调试”工具栏使您可以方便地访问调试工具。

“编辑”工具栏包含的工具可使您更高效地编写代码。

“用户窗体”工具栏可帮助您构建 VB 窗体。

了解 Outlook 对象模型

在对 VBA 环境感到满意后,就可以查看 Outlook 的对象模型了。如果您熟悉其他 Office 应用程序中的对象模型,就会注意到 Outlook 对象模型稍有不同。这主要是由于 VBA 出现得比较晚,而且 Outlook 作为应用程序所扮演的角色有所不同。然而,其他 Office 应用程序(如 Word 和 Excel)是在其中宿主和操作其他对象(文档、工作簿和工作表)的框架,而 Outlook 本身就很像是一个应用程序。

整本书可能对 Outlook 对象模型中的 30 多种对象和集合进行了描述。本部分只介绍最初开发应用程序时所必需的关键对象和集合。使用 Microsoft Visual Basic 帮助(在 VBA 编辑器中通过按 F1 来访问),可以找到有关 Outlook 对象模型中其他对象的信息。

下面简要介绍一些关键对象:

项目Outlook 中的基本信息单位。电子邮件、日历上的约会以及联系人条目都是项目的例子。

文件夹基本存储单位。文件夹包含项目。Outlook 具有许多文件夹,如“收件箱”、“已发送邮件”和“任务”文件夹。

资源管理器文件夹中项目的视觉表示形式。Outlook 使用资源管理器来显示项目。资源管理器的例子有:与收件箱关联的电子邮件窗格,以及在选择“日历”文件夹时看到的每日日历视图。任何一个文件夹都可以与许多资源管理器相关联。例如,“日历”文件夹有好几个资源管理器,以便您可以用不同的方式来显示日历项。

检查器用于显示项目的 Outlook 窗体。检查器之于项目就与资源管理器之于文件夹一样:即,检查器是信息在 Outlook 中的图形表示形式。

下一部分更全面地介绍了这些对象。但是,在更详细地了解这些重要的 Outlook 对象之前,一定要了解集合这一术语的含义。对象模型的某些部分只被标记为对象,而其他部分被标记为对象和集合。集合是一组具有相同类型的对象。例如,收件箱包含有许多电子邮件。每封邮件都是一个邮件项对象,而“收件箱”文件夹包含的是这些邮件项的集合。您可以通过以下方法获得集合的特定成员:使用集合的 Item 方法,并为它提供一个索引,该索引可以是一个整数值或者与集合中对象的默认属性相匹配的值。例如,下面的代码可返回收件箱中的第二封电子邮件:

Set emlSecond = fdrInbox.Items.Item(2) 

或者,可以使用引用该对象的名称。本例将返回 Folders 集合中名为 Outlook Book 的电子邮件文件夹:

Set fdrOutlookBook = myFolders.Item("Outlook Book") 

要使显示第二封电子邮件的代码正确工作,请执行下列操作:

1.

启动 Outlook,依次选择 ToolsMacroVisual Basic Editor(或者按 Alt+F11)以打开 VBA 编辑器。

2.

在“项目”窗口中,选择 Project1 并展开该树,直到看到 ThisOutlookSession

3.

选择 ThisOutlookSession 并按 F7 以打开“代码”窗口。

4.

在“代码”窗口中输入以下代码:

Sub GetEmailItem()
 Dim emlSecond As MailItem
 Dim nsMyNameSpace As NameSpace
 Dim fdrInbox As MAPIFolder

 Set nsMyNameSpace = Application.GetNamespace("MAPI")
 Set fdrInbox = _ nsMyNameSpace.GetDefaultFolder(olFolderInbox)
 Set emlSecond = fdrInbox.Items.Item(2)
 MsgBox "Second e-mail : " & vbCrLf & vbCrLf & _
        emlSecond.Subject & vbCrLf & emlSecond.Body
End Sub 

5.

返回到主 Outlook 窗口,然后依次选择 ToolsMacroMacros

6.

选择 ThisOutlookSession.GetEmailItem 并单击“运行”按钮。系统会打开一个包含该电子邮件的对话框。

应用程序、命名空间和文件夹

Outlook 对象模型的核心是 Application 对象,之所以称其为根对象,是因为层次结构的其余部分都源自它。Application 对象提供对其他所有 Outlook 对象的访问。如果您要从外部应用程序访问 Outlook 对象层次结构,则必须先创建 Application 对象的实例,才能访问任何其他对象。如果您在 Outlook 中工作,则 Application 对象的实例始终存在;要访问它,请使用 Application 关键字。

尽管 Application 对象允许您访问 Outlook 中的许多基础构造块对象,但是如果要访问 Outlook 数据,则必须创建 Namespace 对象的实例。Namespace 对象是 Outlook 数据源的抽象根,这意味着,尽管您不直接使用它,也可以通过它访问对象树中其下面的对象。目前,所支持的唯一数据源就是邮件应用程序编程接口 (MAPI),MAPI 允许访问存储在用户邮件文件中的所有 Outlook 数据。要获得 Outlook 应用程序的 Namespace 对象,请使用 Application 对象的 GetNameSpace 方法:

Application.GetNamespace("MAPI") 

正如您知道的那样,Outlook 中的信息是在文件夹中维护的。某些文件夹(如收件箱、发件箱和已发送邮件)包含邮件项;其他文件夹则包含其他类型的项目。在获取 Namespace 对象的实例以后,就可以方便地连接到 Outlook 中的任何文件夹。Namespace 对象有一个 GetDefaultFolder 方法,该方法使用类型为 olDefaultFolders 的参数。类型 olDefaultFolders 表示某个默认的 Outlook 文件夹,并且可以是 A2-1 中所示的任何一个常数。

表 A2-1. olDefaultFolders 常数
常数用途

olFolderCalendar

返回一个包含所有日历项的文件夹

olFolderContacts

返回一个包含所有联系人项目的文件夹

olFolderDeletedItems

返回一个包含所有已删除邮件项目的文件夹

olFolderDrafts

返回一个包含所有草稿邮件项目的文件夹

olFolderInbox

返回一个包含所有收件箱邮件项目的文件夹

olFolderJournal

返回一个包含所有日记项目的文件夹

olFolderNotes

返回一个包含所有便笺项目的文件夹

olFolderOutbox

返回一个包含所有发件箱邮件项目的文件夹

olFolderSentMail

返回一个包含所有已发送邮件项目的文件夹

olFolderTasks

返回一个包含所有任务项目的文件夹

olPublicFoldersAllPublicFolders

返回一个包含所有公用文件夹项目的文件夹

例如,您可以使用以下代码来创建表示所有联系人项目的对象:

Dim fdrContacts As Outlook.MAPIFolder 
Set fdrContacts = Application.GetNamespace("MAPI") _
    .GetDefaultFolder(olFolderContacts) 

fdrContacts 变量已声明为 MAPIFolder,并且被指定了“联系人”文件夹。您还可以声明 Application 对象和 Namespace 对象,但是除非您打算重复使用它们,否则其效率与使用已定义的 Application属性和 GetNamespace 方法调用一样高。

高效使用 Application 和 Namespace 对象

如果您希望检索许多要使用的文件夹,则以下代码非常高效,这是因为它对 Application 对象和 Namespace 对象只检索一次,然后重复使用它们:

Dim objApplication As Outlook.Application
Dim objNameSpace As Outlook.NameSpace
Dim fdrContacts As Outlook.MAPIFolder
Dim fdrNotes as Outlook.MAPIFolder

Set objApplication = Application
Set objNameSpace = objApplication.GetNamespace("MAPI")
Set fdrContacts = objNameSpace.GetDefaultFolder(olFolderContacts)
Set fdrNotes = objNameSpace.GetDefaultFolder(olFolderNotes)

'

Set objApplication = Nothing
Set objNameSpace = Nothing
Set fdrContacts = Nothing
Set fdrNotes = Nothing

下列步骤可指导您完成代码的创建过程,该代码用于为“便笺”和“日历”文件夹设置对象,然后允许您显示每个文件夹中的内容:

1.

启动 Outlook,并依次选择 ToolsMacroVisual Basic Editor(或按 Alt+F11)以打开 VBA 编辑器。

2.

在“项目”窗口中,选择 Project1 并展开该树,直到看到 ThisOutlookSession 标题。

3.

选择 ThisOutlookSession 并按 F7 以打开“代码”窗口。

4.

在“代码”窗口中输入以下代码:

Sub ContactsAndNotes()
  Dim objApplication As Outlook.Application
  Dim objNameSpace As Outlook.NameSpace

  Dim fdrContacts As Outlook.MAPIFolder
  Dim fdrNotes As Outlook.MAPIFolder

  Set objApplication = Application
  Set objNameSpace = objApplication.GetNamespace("MAPI")
  Set fdrContacts = _

  objNameSpace.GetDefaultFolder(olFolderContacts)
  Set fdrNotes = _ objNameSpace.GetDefaultFolder(olFolderNotes)
  MsgBox fdrNotes.Name & " (" & fdrNotes.Parent & ")"  
  MsgBox fdrContacts.Name & " (" & fdrContacts.Parent & ")"
  Set objApplication = Nothing
  Set objNameSpace = Nothing
  Set fdrContacts = Nothing
  Set fdrNotes = Nothing

End Sub 

5.

返回到主 Outlook 窗口,并依次选择 ToolsMacroMacros

6.

选择 ThisOutlookSession.ContactsAndNotes 并单击 Run。会显示两个对话框。第一个对话框包含 Notes 文件夹的名称,后跟其父文件夹的名称;第二个对话框包含 Contacts 文件夹的名称,后跟其父文件夹的名称。

资源管理器、检查器和项目

到目前为止,已经向您介绍了访问 Outlook 数据所需的 Outlook 对象。一个项目就是一段 Outlook 数据。例如,日历上的约会以约会项的形式存储在 Outlook 中。当您使用 Outlook 查看文件夹中的项目时,您实际是在使用该特定项目类型的 Explorer 对象。Outlook 可为不同类型的项目提供不同的资源管理器。如果您使用 Outlook 界面来查看日历、联系人、便笺和日记项目,则会发现各个项目的资源管理器大大不同。

Application 对象包含资源管理器的集合,这些资源管理器表示 Outlook 中所有不同的资源管理器。您可以使用多种方法从 Outlook 中检索特定的 Explorer 对象:

使用资源管理器集合的 Item 方法。

使用 ActiveExplorer 方法,该方法可返回 Outlook 中当前活动的资源管理器(如果有的话):

Dim expActive As Outlook.Explorer
Set expActive = Application.ActiveExplorer()

对于特定的文件夹,使用 GetExplorer 方法返回该文件夹的资源管理器实例:

Dim expContacts as Outlook.Explorer
Set expContacts = fdrContacts.GetExplorer

在拥有 Explorer 对象以后,可以通过调用 Activate 方法来显示该资源管理器:

expContacts.Activate 

Explorer 对象用于显示项目的集合,检查器用于显示具体项目。您可以将检查器视为在查看特定类型的项目时所看到的窗体。如果您希望创建自己的项目,然后允许用户自定义它,那么能够在代码中访问检查器会非常有用。与资源管理器一样,检查器集合与 Application 对象相关联。您可以通过多种方法来检索特定的检查器:

如果某个检查器处于打开状态,则对 ActiveInspector 方法的调用会返回该检查器。您可以使用 CurrentItem 方法来访问该检查器中所显示的项的详细信息:

Dim insActive As Outlook.Inspector
Dim itmCurrent As Object

Set insActive = Application.ActiveInspector
Set itmCurrent = insActive.CurrentItem

您可以使用 GetInspector 方法来访问与某个项相关联的检查器:

Dim insAppointments As Outlook.Inspector
Dim itmAppointment As Outlook.AppointmentItem
Set insAppointments = itmAppointment.GetInspector

在拥有 Inspector 对象以后,您可以通过调用 Activate 方法来显示它及其相关项:

insAppointments.Activate 

用于创建 Inspector 对象的替换方法是:新建一个项目,然后调用该项目的 Display 方法以显示该项目,从而显示该项目的检查器:

Dim fdrCalendar As Outlook.MAPIFolder 
Dim itmAppointment As Outlook.AppointmentItem 
Set fdrCalendar = _
    Application.GetNamespace("MAPI").GetDefaultFolder(olFolderCalendar) 
Set itmAppointment = fdrCalendar.Items.Add 
With itmAppointment 
 .Subject = "Custom Appointment generated from Code"
 .Body = "Created in code and then displayed for you to edit"
 .Display 
End With 

要使显示资源管理器和检查器的代码工作,请按照下列步骤操作:

1.

启动 Outlook,依次选择 ToolsMacroVisual Basic Editor(或者按 Alt+F11)以打开 VBA 编辑器。

2.

在“项目”窗口中,选择 Project1 并展开该树,直到看到 ThisOutlookSession

3.

选择 ThisOutlookSession 并按 F7 以打开“代码”窗口。

4.

在“代码”窗口中输入以下代码:

Sub ShowExplorers()
  Dim objApplication As Outlook.Application
  Dim objNameSpace As Outlook.NameSpace
  Dim fdrContacts As Outlook.MAPIFolder

  Dim expContacts As Outlook.Explorer
  Set objApplication = Application
  Set objNameSpace = objApplication.GetNamespace("MAPI")
  Set fdrContacts = _
      objNameSpace.GetDefaultFolder(olFolderContacts)
  Set expContacts = fdrContacts.GetExplorer

  expContacts.Activate
  Set objApplication = Nothing
  Set objNameSpace = Nothing
  Set fdrContacts = Nothing
  Set expContacts = Nothing

End Sub 
Sub ShowContactsInspector()
  Dim itmContact As Outlook.ContactItem
  Dim insContact As Outlook.Inspector
  Dim fdrContacts As Outlook.MAPIFolder

  Set fdrContacts = _
      GetNamespace("MAPI").GetDefaultFolder(olFolderContacts)
  Set itmContact = fdrContacts.Items.Add

  With itmContact
   .FirstName = "Auto"
   .LastName = "Created"
   .Body = _
         "Created using the GetInspector method of an item"
  End With
  Set insContact = itmContact.GetInspector
  insContact.Activate
  Set itmContact = Nothing
  Set insContact = Nothing
  Set fdrContacts = Nothing

End Sub 
Sub ShowAppointmentInspector()
  Dim fdrCalendar As Outlook.MAPIFolder
  Dim itmAppointment As Outlook.AppointmentItem

  Set fdrCalendar = _
      GetNamespace("MAPI").GetDefaultFolder(olFolderCalendar)

  Set itmAppointment = fdrCalendar.Items.Add
  With itmAppointment
    .Subject = "Custom Appointment generated from Code"
    .Body = _
          "Displayed by using the Display method of the item"
    .Display
  End With

  Set fdrCalendar = Nothing
  Set itmAppointment = Nothing

End Sub 

5.

返回到主 Outlook 窗口,然后依次选择 ToolsMacroMacros

6.

从刚刚生成的三个新函数(ThisOutlookSession.ShowExplorers、ThisOutlookSession.ShowContactsInspector 或 ThisOutlookSession.ShowAppointmentInspector)中选择一个,然后单击 Run。ShowExplorers 显示联系人资源管理器;ShowContactsInspector 显示联系人检查器(允许您添加新联系人);ShowAppointmentInspector 显示约会检查器(允许您输入新的日历约会)。

疑难解答:宏不显示

如果您在 VBA 中编写了一个宏,但是当您打开“宏”对话框(从主 Outlook 窗口按 Alt+F8)时,该宏没有显示,则可以执行一些检查:

只有 Sub 过程出现在“宏”对话框中。确保您编写的过程是以 Sub (而非 Function )开头的。

Sub 过程必须是公共的。如果您的过程声明为 Private Sub ,则它将不会出现。

在“宏”对话框中,只能看到在 ThisOutlookSession 模块或代码模块中声明的 Sub 过程。即使在类中声明的公共 Sub 过程也看不到,因为您必须先实例化类才能使用它们。对于在窗体中声明的 Sub 过程也是如此。

用 VBA 创建 Outlook 应用程序

在您了解 VBA 编辑器如何工作以及 Outlook 对象模型如何允许您与 Outlook 进行交互之后,就可以讨论如何使用这些知识在 Outlook 中构建应用程序了。通过开发自定义的 Outlook 应用程序,可以在许多方面增强 Outlook。一种方法就是使用 Outlook 的功能来执行不是 Outlook 特定任务但是可以在 Outlook 界面中实现的任务。例如,可以增强 Outlook 日历系统,以便用户可以将他们所执行工作的信息记录在贵公司的时间录入系统中。如果用户已经使用日历记录了他们在这一天的约会,那么您就可以添加自定义的应用程序代码,以便检查该信息,并将它作为时间录入系统的数据导出,这意味着,用户将不必重复输入该信息。

可从构建自定义 Outlook 应用程序获益的另一种方法是,自动执行 Outlook 中原本要求用户执行大量工作的任务。例如,用户常常将数百个联系人存储在他们的 Outlook 副本中。如果他们与大公司打交道,那么可能会有一个公司的许多联系人。如果该公司改成新名,那么该公司的所有联系人都需要进行更新。

本章的其余部分说明如何添加 Outlook 自定义功能,以自动执行刚刚提到的示例中所涉及的过程。该应用程序由许多元素组成:

Outlook 数据访问功能,用于操作联系人详细信息

两个自定义窗体,用于输入信息和查看详细信息

一个自定义的工具栏和按钮,使用户能够访问该功能

打印功能,以便用户可以查看该信息

访问 Outlook 数据

之所以向 Outlook 中添加自定义的 VBA 代码,主要原因之一就是允许访问存储在 Outlook 中的一些数据。使用前面介绍的对象,您可以轻松地访问存储在 Outlook 中的数据,然后在另一个窗体中利用它。在本例中,您需要更新来自特定公司的所有联系人的公司名,因为该公司已经更名。

以下代码有两个字符串,它们分别表示原始的公司名以及它的新名。对于公司名与 strFrom 变量相匹配的每个项目,将该名称更改为 strTo 中包含的字符串,并调用该项目的 Save 方法:

Public Sub UpdateCompanyName(ByRef strFrom As String, ByRef strTo As String)
  Dim fdrContacts As Outlook.MAPIFolder
  Dim objContactItem as Outlook.ContactItem

  'Create an instance of the Contacts folder.
  Set fdrContacts = _
      Application.GetNamespace("MAPI")_
       .GetDefaultFolder(olFolderContacts)

  'Loop through all contact items checking the CompanyName and
  'changing it if necessary.
  For Each objContactItem In fdrContacts.Items
    If objContactItem.CompanyName = strFrom Then
       objContactItem.CompanyName = strTo
       objContactItem.Save

    End If
  Next

End Sub 

上面的方法可单独查找每个联系人项目。但是,这样做的效率不是很高,特别是当您的联系人很多时。要提高效率,请尝试用以下代码来代替 For.?.?.Each 循环。以下代码不是检查每个项目,而是使用文件夹对象的 Items 集合的 Restrict 方法,以便允许您在使用这些项目之前先对其应用筛选器。在本例中,应当只包括符合以下条件的项目:CompanyName 属性等于传递到该过程的 strFrom 变量的值。对于包含 400 个项目的联系人列表,这会将处理时间从 4 秒减到 1 秒:

'Loop through the appropriate Contact items changing the CompanyName. 
For Each objContactItem In _
  fdrContacts.Items.Restrict("[CompanyName] = '" & strFrom & "'")
  objContactItem.CompanyName = strTo
  objContactItem.Save 
Next 

添加窗体

上一部分中的过程将一个字符串值转换为另一个。查找这些值的一种方法是,通过向应用程序中添加自定义窗体来询问用户。要在项目中添加窗体,请在“项目”窗口中右键单击,然后依次选择 InsertUserForm。新窗体将连同其属性和控件工具箱一起显示。向该窗体中添加控件,直到它看上去像图 A2-3 中所示的窗体。

有关向窗体中添加控件的信息,请参阅第 644 页的“Adding and Arranging Controls”。


图 A2-3. 使用这个 VBA 窗体告诉程序该公司的原始名称和更改后的名称。

将以下代码添加到该窗体的“代码”窗口中。它调用 Load 函数以实例化该窗体,并将 strFrom 和 strTo 变量传递到 UpdateCompanyName 过程:

Dim bContinue as Boolean 
Public Function Load(strFrom As String, strTo As String) As Boolean
  'Initialize the cancel boolean. bContinue = True
  BuildComboList
  'Show the form.
  frmCompanyNameChange.Show

  If bContinue Then
     strFrom = cmbFrom
     strTo = txtTo

  End If
  Load = bContinue
End Function 

该代码维护 bContinue 布尔值,该值存储有关在窗体退出时是否继续处理代码的信息。它还负责调用一个用最新的公司名填充组合框的函数,并显示该窗体。下面显示用来构建现有公司的组合框列表的代码如下所示:

Private Sub BuildComboList()
  Dim fdrContacts As Outlook.MAPIFolder
  Dim objContact As Outlook.ContactItem
  Dim strCompanyName As String

  'Create an instance of the Contacts folder.
  Set fdrContacts = _
      Application.GetNamespace("MAPI") _
      .GetDefaultFolder(olFolderContacts)

  fdrContacts.Items.Sort "[CompanyName]", False
  'Loop through the contact items extracting unique company names.
  For Each objContact In fdrContacts.Items
If Trim(objContact.CompanyName) <> Trim(strCompanyName) Then
   cmbFrom.AddItem objContact.CompanyName 
   strCompanyName = objContact.CompanyName
    End If
  Next
End Sub

以上代码使用文件夹的 Items 集合的 Sort 方法来按顺序排列公司名。这将允许该函数依次通过每个值,并放弃重复值。

最后,为了允许您执行刚刚在 Outlook 中创建的函数,可以添加以下过程,该过程与工具栏按钮相关联。该过程调用 CompanyNameChange 窗体的 Load 方法,然后调用 UpdateCompanyName过程来更改公司名:

Public Sub ChangeCompany()
  Dim strFrom As String
  Dim strTo As String

  If frmCompanyNameChange.Load(strFrom, strTo) Then
     UpdateCompanyName strFrom, strTo
  End If

End Sub 

创建自定义的工具栏按钮

在编写了一些代码之后,还需要一种让用户访问这些函数的方法。其中的一些代码可以由 Outlook 中出现的事件自动完成,但通常需要向主 Outlook 界面中添加元素,以允许用户执行一段代码。这样做的一个绝佳方法是向 Outlook 应用程序中添加命令栏和工具栏按钮。

可以使用两个方法来自定义命令栏。第一个方法是,按照第 25 章“Customizing the Outlook Interface”中的说明,从 Outlook 界面添加和更改命令栏。如果所作的更改是针对您自己的 Outlook 副本并且是永久更改时,该方法很好。

有关从 Outlook 界面修改命令栏的信息,请参阅第 665 页的“Creating Custom Command Bars”。

第二种方法是使用 VBA 添加命令栏。这使您可以在添加和删除工具栏时获得更大的控制,如果您希望命令栏或工具栏按钮只出现特定的次数,该方法尤其有用。要向 Outlook 界面中添加命令栏,可以使用以下代码:

Dim tlbCustomBar As CommandBar 
Set tlbCustomBar = Application.ActiveExplorer.CommandBars_
    .Add(Name:="Custom Applications", Position:=msoBarTop, _
    Temporary:=True) 
tlbCustomBar.Visible = True 

以上代码声明了类型为 CommandBar 的对象,该对象将在局部使用以执行命令栏上的命令。要新建命令栏,可以使用 CommandBars 集合的 Add 方法;这是 Explorer 对象的属性。要自定义新命令栏,可以向 Add 方法传递许多参数。Temporary:=True 告诉命令栏只在 Outlook 处于打开状态时存在。如果您关闭 Outlook 并再次打开它,但是没有重新运行该过程,那么该命令栏将不复存在。

向环境中添加命令栏之后,还需要添加按钮。在向命令栏中添加按钮时,请按照以下三个基本步骤操作:

1.

向命令栏中添加按钮。

2.

将该按钮与某个函数相关联。

3.

格式化该按钮。

要向命令栏中添加按钮,请使用以下代码:

Dim btnNew As CommandBarButton 
Set btnNew = tlbCustomBar.Controls.Add(Type:=msoControlButton) 

您可以将某个按钮与 Outlook 中任何其他按钮或菜单的操作相关联,或者与您用 VBA 编写的自定义函数相关联。要将该按钮与内置函数相关联,您必须将另一个参数传递给 Add 方法:

Set btnNew = tlbCustomBar.Controls.Add(Type:=msoControlButton, _
    Id:=Application.CommandBars("Edit").Controls("Paste").ID) 

本例向自定义工具栏中添加将执行 Paste 函数的按钮。ID 属性使用整数值,在本例中,该值是从现有控件检索的;您可以使用 id:=22 来实现相同的结果。

如果您希望允许工具栏按钮调用自定义的 VBA 过程,则必须设置 OnAction 属性。确保您的函数被声明为公共函数,然后在创建按钮以便将它与命名函数相关联之后,输入以下代码:

Set btnNewCustom = _
    tlbCustomBar.Controls.Add(Type:=msoControlButton)
btnNewCustom.OnAction = "ChangeCompany"

以上代码将新按钮与名为 ChangeCompany 的过程相关联。

最后,在添加按钮时,可以通过以下方法来设置它的格式:设置样式,赋予它标题,并且可以为它提供图标。按钮可以有许多确定其如何显示的样式。要更改样式,请使用 Style 属性:

btnNewCustom.Style = msoButtonIconAndCaption 

要添加标题,请使用 Caption 属性。Caption 属性指定在按钮上显示的文本(如果选定的按钮样式具有一个标题):

btnNewCustom.Caption = "Change Company Name" 

打印

对于为该公司的所有联系人更改公司名的过程,最后一个增强就是实现某个打印功能。这将允许用户在操作发生之前查看所有将受到影响的联系人,并为他们提供打印名称列表、单个联系人详细信息或者所有联系人详细信息的选项。

在使用代码从 Outlook 中打印信息时,请记住,所有打印方法都使用执行它们的计算机的默认打印机。如果没有默认打印机或者打印机不可用,就会发生错误。在本例中,您可以创建如图 A2-4 中所示的 VBA 窗体。


图 A2-4. 该窗体允许用户查看和打印所有受到公司名更改影响的联系人的详细信息。

列表框包含受到公司名更改影响的联系人姓名列表。这些按钮允许用户打印列表(通过打印该窗体)、打印一个联系人的详细信息或者打印所有联系人。要打印该窗体,可以使用该窗体的 PrintForm 方法。将以下代码放在按钮的 click 事件处理程序中。Me 是指当前的窗体:

Me.PrintForm 

以下函数可打印联系人信息。以下代码将联系人姓名视为字符串,然后使用 Contacts 文件夹的 Find 方法来返回 ContactItem 对象。该项目的 PrintOut 方法用于打印此对象:

Private Sub PrintContact(strContactFullName As String)
  Dim fdrContacts As Outlook.MAPIFolder
  Dim objContactItem As Outlook.ContactItem
  Dim strFullName As String
  'Create an instance of the Contacts folder.
  Set fdrContacts = _
      Application.GetNamespace("MAPI")_
      .GetDefaultFolder(olFolderContacts)

  Set objContactItem = _
      fdrContacts.Items.Find _
      ("[FullName] = '" & strContactFullName & "'")

  objContactItem.PrintOut 
End Sub 

要完成此窗体,请使用以下代码来用相关项目填充列表框:

Public Sub LoadList(strCompany As String)
  Dim fdrContacts As Outlook.MAPIFolder
  Dim objContactItem As Object
  Dim i As Integer
  Dim arrContacts() As String

  'Create an instance of the Contacts folder
  Set fdrContacts = _
      Application.GetNamespace("MAPI") _
      .GetDefaultFolder(olFolderContacts)

  For Each objContactItem In fdrContacts.Items _
    .Restrict("[CompanyName] = '" & strCompany & "'")

    If TypeOf objContactItem Is Outlook.ContactItem Then
      i = i + 1
      ReDim Preserve arrContacts(2, i)
    End If 
    arrContacts(0, i - 1) = objContactItem.FullName
  Next

  lstAffectedContacts.Column = arrContacts
End Function 

该函数使用 Restrict 方法再次创建文件夹,但是这一次,它依次通过所返回的联系人,并构建一个可用作列表框列表的联系人姓名的数组。

要添加对某个公司的联系人姓名进行更改的代码,请按照下列步骤操作:

1.

启动 Outlook,依次选择 ToolsMacroVisual Basic Editor(或者按 Alt+F11)以打开 VBA 编辑器。

2.

在“项目”窗口中,选择 Project1

3.

依次选择 InsertModule,以便在项目中添加自定义模块。

4.

在“项目”窗口中选择新模块,然后转至“属性”窗口。(如果该窗口不可见,请按 F4 显示它。)

5.

将模块名更改为 basChangeCompanyName

6.

按 F7 打开该模块的“代码”窗口。

7.

在“代码”窗口中输入以下代码:

Public Sub UpdateCompanyName(ByRef strFrom As String, ByRef
                             strTo As String)

  Dim fdrContacts As Outlook.MAPIFolder
  Dim objContactItem As Outlook.ContactItem

  'Create an instance of the Contacts folder
  Set fdrContacts = _
      Application.GetNamespace("MAPI") _
      .GetDefaultFolder(olFolderContacts)

  'Loop through the appropriate Contact items changing the
  'Company Name
  For Each objContactItem In _
      fdrContacts.Items.Restrict("[CompanyName] = '" & _
      strFrom & "'")
    objContactItem.CompanyName = strTo
    objContactItem.Save
  Next 
End Sub 
Public Function ChangeCompany()
  Dim strFrom As String
  Dim strTo As String

  If frmCompanyNameChange.Load(strFrom, strTo) Then
     UpdateCompanyName strFrom, strTo
  End If

End Function 
Sub AddToolbar()
  Dim tlbCustomBar As CommandBar
  Dim btnNew As CommandBarButton
  Dim btnNewCustom As CommandBarButton

  Set tlbCustomBar = Application.ActiveExplorer _
      .CommandBars _
      .Add(Name:="Custom Applications", _ 
      Position:=msoBarTop, Temporary:=True)

  tlbCustomBar.Visible = True
  Set btnNew = _ 
      tlbCustomBar.Controls.Add(Type:=msoControlButton)

  Set btnNew = _
      tlbCustomBar.Controls.Add(Type:=msoControlButton, _
      ID:=ActiveExplorer.CommandBars("Edit") _
      .Controls("Paste").ID)

  Set btnNewCustom = _
      tlbCustomBar.Controls.Add(Type:=msoControlButton)

  btnNewCustom.OnAction = "ChangeCompany"
  btnNewCustom.Style = msoButtonIconAndCaption
  btnNewCustom.Caption = "Change Company Name"

End Sub 

8.

通过选择 InsertUserForm 来向项目中添加自定义窗体。

9.

将四个标签控件、一个组合框控件、一个文本框控件和两个按钮拖到该窗体上。重新查看图 44-3,看看如何排列这些控件以及相应地更改它们的标题。按以下方法对其命名:

将组合框控件命名为 cmbFrom

将文本框控件命名为 txtTo

将“OK”按钮命名为 cmdOK

将“Cancel”按钮命名为 cmdCancel

10.

将该窗体命名为 frmCompanyNameChange。

11.

按 F7 从“窗体”视图切换到“代码”视图,然后在“代码”窗口中输入以下代码:

Dim bContinue As Boolean 
Public Function Load(strFrom As String, 
                strTo As String) As Boolean
  'Initialize the cancel boolean.
  bContinue = True

  BuildComboList
  'Show the form
  frmCompanyNameChange.Show

  If bContinue Then
     strFrom = cmbFrom
     strTo = txtTo

  End If
  Load = bContinue
End Function

Private Sub BuildComboList()
  Dim fdrContacts As Outlook.MAPIFolder
  Dim objContact As Outlook.Object
  Dim strCompanyName As String

  'Create an instance of the Contacts folder.
  Set fdrContacts = _
      Application.GetNamespace("MAPI") _
      .GetDefaultFolder(olFolderContacts)

  fdrContacts.Items.Sort "[CompanyName]", False
  'Loop through the contact items extracting unique company
  'names
  For Each objContact In fdrContacts.Items
    If TypeOf objContact Is Outlook.ContactItem Then 
      If Trim(objContact.CompanyName) <> Trim(strCompanyName) _ 
      Then
        cmbFrom.AddItem objContact.CompanyName
        strCompanyName = objContact.CompanyName
      End If
    End If

  Next 
End Sub 
Private Sub cmdCancel_Click()
  bContinue = False
  Unload Me
End Sub 
Private Sub cmdOK_Click()
  bContinue = True
  Unload Me
End Sub 

12.

通过选择 InsertUserForm 来向项目中添加第二个自定义窗体。

13.

将一个列表框控件和五个按钮拖到该窗体上。排列它们并更改它们的标题,以便它们看上去像图 A2-4 中所示的窗体。按以下方法对其命名:

将列表框控件命名为 lstAffectedContacts

将“Print List”按钮命名为 cmdPrintList

将“Print Contact”按钮命名为 cmdPrintContact。

将“Print All”按钮命名为 cmdPrintAll

将“Cancel”按钮命名为 cmdCancel

将“OK”按钮命名为 cmdOK

14.

将该窗体命名为 frmPrintContacts。

15.

按 F7 从“窗体”视图切换到“代码”视图,然后在“代码”窗口中输入以下代码:

Private Sub cmdCancel_Click()
  Unload Me
End Sub

Private Sub cmdOK_Click()
  Unload Me
End Sub

Private Sub cmdPrintAll_Click()
  Dim i As Integer

  For i = 0 To lstAffectedContacts.ListCount -1
    PrintContact lstAffectedContacts.List(i)
  Next i 
End Sub 
Private Sub cmdPrintContact_Click()
  PrintContact lstAffectedContacts
End Sub

Private Sub cmdPrintList_Click()
  Me.PrintForm
End Sub

Private Sub PrintContact(strContactFullName As String)
  Dim fdrContacts As Outlook.MAPIFolder
  Dim objContactItem As Outlook.ContactItem
  Dim strFullName As String

  'Create an instance of the Contacts folder.
  Set fdrContacts = _
    Application.GetNamespace("MAPI") _
    .GetDefaultFolder(olFolderContacts)

  Set objContactItem = _
    fdrContacts.Items.Find("[FullName] = '" & _
      strContactFullName & "'")

  objContactItem.PrintOut
  Set objContactItem = Nothing 
End Sub 
Public Sub LoadList(strCompany As String) 
  Dim fdrContacts As Outlook.MAPIFolder
  Dim objContactItem As Outlook.ContactItem

  Dim i As Integer
  Dim arrContacts() As String

  'Create an instance of the Contacts folder
  Set fdrContacts = _
    Application.GetNamespace("MAPI") _
      .GetDefaultFolder(olFolderContacts)

  For Each objContactItem In fdrContacts.Items _
    .Restrict("[CompanyName] = '" & strCompany & "'")
    If TypeOf objContactItem Is Outlook.ContactItem Then
      i = i + 1
      ReDim Preserve arrContacts(2, i)

      arrContacts(0, i -1) = objContactItem.FullName
    End If
  Next

  lstAffectedContacts.Column = arrContacts
End Sub

Public Function Load(strCompany As String)
  LoadList strCompany
  'Show the form.
  frmPrintContacts.Show

End Function 

16.

将另一个按钮添加到 frmCompanyNameChange 窗体中,该按钮的标题为 View Contacts,名称为 cmdViewContacts。使用此按钮打开第二个窗体。

17.

双击“查看内容”以打开“代码”窗口,然后输入以下代码:

Private Sub cmdViewContacts_Click()
  frmPrintContacts.Load cmbFrom
End Sub

18.

返回到主 Outlook 窗口,从列表中依次选择 ToolsMacroMacros. Select AddToolbar,然后单击 Run。现在,在 Outlook 中应该能看到两个新工具栏按钮。一个按钮的图标为 Paste,另一个按钮标记为 Change Company Name

19.

单击第二个按钮,即会显示第一个窗体。

20.

在该框中选择一个公司,在文本框中键入公司的新名称,然后单击 OK。这样,所有联系人的公司名都会发生更改。

 
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值