首页 | 邮件资讯 | 技术教程 | 解决方案 | 产品评测 | 邮件人才 | 邮件博客 | 邮件系统论坛 | 软件下载 | 邮件周刊 | 热点专题 | 工具
网络技术 | 操作系统 | 邮件系统 | 客户端 | 电子邮箱 | 反垃圾邮件 | 邮件安全 | 邮件营销 | 移动电邮 | 邮件软件下载 | 电子书下载

邮件客户端

邮件技巧 | Outlook | Foxmail | Pegasus | Eudora | Becky! | DreamMail | IncrediMail | KooMail | 雷鸟 | 其它工具 | The bat! |
首页 > 邮件客户端 > Outlook/Outlook Express > Microsoft Office Outlook 2003 完全揭密 > 正文

Microsoft Office Outlook 2003 完全揭密

出处:MSDN 作者:Jim Boyc… 时间:2006-5-23 17:03:00
  本文改编自 Microsoft Office Outlook 2003 Inside Out(Microsoft Press 出版);ISBN 0-7356-1514-4,版权所有 Microsoft Press 2004;保留所有权利。其作者 Jim Boyce 是 WINDOWS Magazine 的前撰稿编辑兼每月专栏作者。Jim 已经著有并与他人合著了 45 本以上有关计算机软硬件的书籍,并且经常向 WinMagTechRepublicThe Office Letter及其他技术出版物投稿。自上世纪七十年代末以来,他一直作为程序员和系统管理员而涉足计算机的方方面面。他对 DOS、Microsoft Windows、Microsoft Windows NT、Windows 2000 和 UNIX 环境有着丰富的经验。除了全职写作职业,Jim 还是 Minnesota WebWorks一家面向中西部的 Web 开发公司)的创始人之一兼副总裁。

未经出版商事先书面许可,不得以任何形式或手段(包括电子的、静电的、机械的、影印、录制等等)复制或传播这些章节的任何部分,也不得将其存储到检索系统中(评论文章中的简短引用除外)。

购买本书

*

随附 CD 的内容:在 Outlook 中使用 VBA

本页内容
随附 CD 的内容:在 Outlook 中使用 VBA随附 CD 的内容:在 Outlook 中使用 VBA
了解 VBA 与 VBScript 的关系 了解 VBA 与 VBScript 的关系
VBA 开发环境概述 VBA 开发环境概述
了解 Outlook 对象模型 了解 Outlook 对象模型
用 VBA 创建 Outlook 应用程序 用 VBA 创建 Outlook 应用程序

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.BodyEnd 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.ApplicationDim objNameSpace As Outlook.NameSpaceDim fdrContacts As Outlook.MAPIFolderDim fdrNotes as Outlook.MAPIFolderSet objApplication = ApplicationSet objNameSpace = objApplication.GetNamespace("MAPI")Set fdrContacts = objNameSpace.GetDefaultFolder(olFolderContacts)Set fdrNotes = objNameSpace.GetDefaultFolder(olFolderNotes)'Set objApplication = NothingSet objNameSpace = NothingSet fdrContacts = NothingSet 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 = NothingEnd 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.ExplorerSet expActive = Application.ActiveExplorer()

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

Dim expContacts as Outlook.ExplorerSet expContacts = fdrContacts.GetExplorer

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

expContacts.Activate 

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

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

Dim insActive As Outlook.InspectorDim itmCurrent As ObjectSet insActive = Application.ActiveInspectorSet itmCurrent = insActive.CurrentItem

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

Dim insAppointments As Outlook.InspectorDim itmAppointment As Outlook.AppointmentItemSet 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 = NothingEnd 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 = NothingEnd 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 = NothingEnd 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  NextEnd 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 = bContinueEnd 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.ItemsIf Trim(objContact.CompanyName) <> Trim(strCompanyName) Then   cmbFrom.AddItem objContact.CompanyName    strCompanyName = objContact.CompanyName    End If  NextEnd 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 IfEnd 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 = arrContactsEnd 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") _      .GetDefaultF, older(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 IfEnd 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 = bContinueEnd FunctionPrivate 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 MeEnd Sub Private Sub cmdOK_Click()  bContinue = True  Unload MeEnd 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 MeEnd SubPrivate Sub cmdOK_Click()  Unload MeEnd SubPrivate 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 lstAffectedContactsEnd SubPrivate Sub cmdPrintList_Click()  Me.PrintFormEnd SubPrivate 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 = arrContactsEnd SubPublic Function Load(strCompany As String)  LoadList strCompany  'Show the form.  frmPrintContacts.ShowEnd Function 

16.

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

17.

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

Private Sub cmdViewContacts_Click()  frmPrintContacts.Load cmbFromEnd Sub

18.

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

19.

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

20.

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

相关文章 热门文章
  • Outlook 2003与Exchange 2010结合使用中可能出现的问题及建议的解决方法
  • 自定义 Outlook Web App (OWA) 2010的登录和注销页
  • 在Outlook的POP/IMAP4帐号中配置LDAP通讯录
  • Windows 2003域更名工具(Domain Rename Tool)
  • 查找Exchange Server 2003事件ID 1159的起因
  • Outlook 2003的运行模式和较大信息的处理
  • 自动产生邮件配置文件 使用CIW来自定义Outlook 2003安装过程
  • Outlook使用技巧
  • 使用Windows Server 2003的Netsh命令创建DHCP作用域
  • 增强OWA 2003附件安全性
  • 能否禁用Exchange Server 2003上的Message Transfer Agent(MTA)
  • 如何提高Exchange Server 2003 SP2中新的最大数据库大小限制?
  • outlook、foxmail备份教程
  • 精通Outlook Express
  • Outlook技巧六则
  • Outlook Express错误代码表
  • Outlook 可以接收但不能发送邮件
  • Outlook崩溃后如何抢救其中的邮件数据
  • 如何恢复outlook硬删除的文件
  • Outlook Express使用技巧大全(上)
  • 如何恢复在outlook express中误删除的邮件
  • Outlook Express使用技巧大全(下)
  • 如何恢复Outlook Express中误删的邮件
  • 将Outlook Express通讯簿联系人复制到 Outlook
  • 自由广告区
     
    最新软件下载
  • SharePoint Server 2010 部署文档
  • Exchange 2010 RTM升级至SP1 教程
  • Exchange 2010 OWA下RBAC实现的组功能...
  • Lync Server 2010 Standard Edition 标..
  • Lync Server 2010 Enterprise Edition...
  • Forefront Endpoint Protection 2010 ...
  • Lync Server 2010 Edge 服务器部署文档
  • 《Exchange 2003专家指南》
  • Mastering Hyper-V Deployment
  • Windows Server 2008 R2 Hyper-V
  • Microsoft Lync Server 2010 Unleashed
  • Windows Server 2008 R2 Unleashed
  • 今日邮件技术文章
  • 腾讯,在创新中演绎互联网“进化论”
  • 华科人 张小龙 (中国第二代程序员 QQ...
  • 微软推出新功能 提高Hotmail密码安全性
  • 快压技巧分享:秒传邮件超大附件
  • 不容忽视的邮件营销数据分析过程中的算..
  • 国内手机邮箱的现状与未来发展——访尚..
  • 易观数据:2011Q2中国手机邮箱市场收入..
  • 穿越时空的爱恋 QQ邮箱音视频及贺卡邮件
  • Hotmail新功能:“我的朋友可能被黑了”
  • 入侵邻居网络发骚扰邮件 美国男子被重..
  • 网易邮箱莫子睿:《非你莫属》招聘多过..
  • 中国电信推广189邮箱绿色账单
  • 最新专题
  • 鸟哥的Linux私房菜之Mail服务器
  • Exchange Server 2010技术专题
  • Windows 7 技术专题
  • Sendmail 邮件系统配置
  • 组建Exchange 2003邮件系统
  • Windows Server 2008 专题
  • ORF 反垃圾邮件系统
  • Exchange Server 2007 专题
  • ISA Server 2006 教程专题
  • Windows Vista 技术专题
  • “黑莓”(BlackBerry)专题
  • Apache James 专题
  • 分类导航
    邮件新闻资讯:
    IT业界 | 邮件服务器 | 邮件趣闻 | 移动电邮
    电子邮箱 | 反垃圾邮件|邮件客户端|网络安全
    行业数据 | 邮件人物 | 网站公告 | 行业法规
    网络技术:
    邮件原理 | 网络协议 | 网络管理 | 传输介质
    线路接入 | 路由接口 | 邮件存储 | 华为3Com
    CISCO技术 | 网络与服务器硬件
    操作系统:
    Windows 9X | Linux&Uinx | Windows NT
    Windows Vista | FreeBSD | 其它操作系统
    邮件服务器:
    程序与开发 | Exchange | Qmail | Postfix
    Sendmail | MDaemon | Domino | Foxmail
    KerioMail | JavaMail | Winwebmail |James
    Merak&VisNetic | CMailServer | WinMail
    金笛邮件系统 | 其它 |
    反垃圾邮件:
    综述| 客户端反垃圾邮件|服务器端反垃圾邮件
    邮件客户端软件:
    Outlook | Foxmail | DreamMail| KooMail
    The bat | 雷鸟 | Eudora |Becky! |Pegasus
    IncrediMail |其它
    电子邮箱: 个人邮箱 | 企业邮箱 |Gmail
    移动电子邮件:服务器 | 客户端 | 技术前沿
    邮件网络安全:
    软件漏洞 | 安全知识 | 病毒公告 |防火墙
    攻防技术 | 病毒查杀| ISA | 数字签名
    邮件营销:
    Email营销 | 网络营销 | 营销技巧 |营销案例
    邮件人才:招聘 | 职场 | 培训 | 指南 | 职场
    解决方案:
    邮件系统|反垃圾邮件 |安全 |移动电邮 |招标
    产品评测:
    邮件系统 |反垃圾邮件 |邮箱 |安全 |客户端
    广告联系 | 合作联系 | 关于我们 | 联系我们 | 繁體中文
    版权所有:邮件技术资讯网©2003-2010 www.5dmail.net, All Rights Reserved
    www.5Dmail.net Web Team   粤ICP备05009143号