最权威的Outlook 2010 中的 VBA 入门参考模板_第1页
最权威的Outlook 2010 中的 VBA 入门参考模板_第2页
最权威的Outlook 2010 中的 VBA 入门参考模板_第3页
最权威的Outlook 2010 中的 VBA 入门参考模板_第4页
最权威的Outlook 2010 中的 VBA 入门参考模板_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Outlook 2010 中的 VBA 编程您是否面临从 Outlook 2010 中重复清除多个联系人的难题?是否必须将大量电子邮件附件逐一保存到硬盘?是否想从某些电子邮件消息中自动创建日历项目?还是不知道如何将 Microsoft Outlook 2010 中的联系人高效地导入 Microsoft Excel 2010 电子表格? 使用 Visual Basic for Applications (VBA) 可以执行上述任务并实现更多功能,VBA 是一种简单而又强大的编程语言,可为 Office 2010 应用程序扩展新功能,还可以自动执行重复性任务。本文面向有经验的 Outlook 用户

2、,他们希望了解有关 VBA 的信息,还希望深入了解编程对其根据需要定制 Outlook 2010 有何帮助。在阅读本文之前,您可能要阅读介绍性文章Office 2010 中的 VBA 入门,其中详细介绍了有关 VBA 编程的基础知识。Office 2010 中的 VBA 编程的强大功能在于,使用 VBA 可以完成用鼠标、键盘或对话框可以执行的几乎所有操作。而且,如果使用 VBA 可以执行一次,就可以轻松地执行上百次、上千次。(实际上,自动执行重复性任务是 VBA 在 Office 中的一种最常见用法。)除了可通过编写 VBA 脚本来加速执行日常任务,还可以使用 VBA 为 Office 201

3、0 应用程序添加新功能,或以特定于您的业务需要的方式来提示文档用户并与之交互。例如,在 Outlook 2010 中,您可以使用 VBA 通过标准用户界面中未提供的方式对联系人、电子邮件、日历项目或任务执行排序、导出和修改操作。本文中的教程可使用 VBA 实现 Outlook 的自动化。该教程是一个实际示例,研究为有经验的 Outlook 用户提供的编程、VBA 和开发工具。选择方法VBA 编程是一种功能强大的解决方案,但并不总是最佳方法。有时候使用其他途径来实现目标更合适。关键问题在于是否有更简单的方法。在开始 VBA 项目之前,请考虑内置工具和标准功能。例如,如果需要在 Outlook 中

4、执行一项费时的操作,可考虑使用规则来解决此问题。是否可以执行一次任务然后使用 Ctrl+Y(重做)来重复该任务?Outlook 2010 是一种功能强大的应用程序;您需要的解决方案可能已经准备就绪了。花些时间了解有关 Outlook 2010 的更多信息,再跳转到编程过程。1 / 16在开始 VBA 项目之前,确保您有时间使用 VBA。需要关注编程,编程结果可能无法预知。尤其是初学者,除非有时间仔细研究,否则切勿依靠编程。当期限迫近会造成极大压力时,可尝试编写“快速脚 本”来解决问题。如果您的时间很紧,可以使用较传统的方法,即使这些方法单调又重复,也必须这样做。VBA 编程 101通过代码使应

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

6、象。使用 VBA 代码,您可以设置 MailItem 的主题和正文,并告诉它执行“保存”或“发送”操作。阅读本文后,您将了解有关这些对象、这些对象的组织方式及其描述和操作方式的更多信息。对象、方法和属性开发人员通过层次结构来组织编程对象,该层次结构称为应用程序的对象模型。例如,Outlook 中的“收件箱”是 Outlook Namespace 对象中的一个 Folder 对象。Folder 对象包含 MailItem 对象,等等。对象模型概略地对用户界面中显示的内容进行镜像,对象模型是应用程序及其功能的概念图。从编程角度而言,Folder 对象可以包含任意类型的项目对象,但通常 Outloo

7、k 用户界面中的几个文件夹都主要由特定类型的项目对象组成。例如,Outlook 用户界面提供一个主要包含 ContactItem 对象的“联系人”文件夹,和一个主要包含 AppointmentItem 和 MeetingItem 对象的“日历”文件夹。对象的定义称为类,因此您可能会看到互换使用这两个术语的情况。从技术上讲,类是用于创建或实例化 对象的说明或模板。只要对象存在,便可通过设置其属性 和调用其方法 来处理该对象。如果您认为对象是一个名词,则属性是描述该名词的形容词,方法是为名词赋予行动的动词。更改属性会更改对象的外观或行为的质量。调用对象的一个方法可使对象执行某个操作。在了解 Out

8、look 中对象模型的基本布局以及 Application、Explorer 和 Folder 对象的一些关键属性(允许您访问当前状态)后,便可以开始使用 VBA 扩展和处理 Outlook 了。宏和 Visual Basic 编辑器既然您已了解 Outlook 2010 应用程序如何公开其对象模型,可能已等不及要尝试调用对象方法、设置对象属性以及响应对象事件。为此,您必须在一个位置以 Office 可以理解的方法编写代码;通常使用是 Visual Basic 编辑器。尽管该编辑器是在默认情况下安装的,但在功能区中启用该编辑器之前,许多用户都不知道该编辑器的存在。打开“开发工具”选项卡所有 O

9、ffice 2010 应用程序都使用功能区。功能区中有一个“开发工具”选项卡,在此可以访问 Visual Basic 编辑器和其他开发人员工具。由于 Office 2010 在默认情况下不显示“开发工具”选项卡,因此必须使用以下过程启用该选项卡:启用“开发工具”选项卡1. 在“文件”选项卡上,选择“选项”打开“Outlook 选项”对话框。2. 单击该对话框左侧的“自定义功能区”。3. 在该对话框左侧的“从下列位置选择命令”下,选择“常用命令”。4. 在该对话框右侧的“自定义功能区”下,选择“主选项卡”,然后选中“开发工具”复选框。5. 单击“确定”。注释:在 Office 2007 中,显示

10、“开发工具”选项卡的方法是单击 Office 按钮、单击“选项”,然后在“选项”对话框中的“常用”类别下选中“在功能区显示开发工具选项卡”复选框。启用“开发工具”选项卡后,可以轻松找到“Visual Basic”和“宏”按钮。图 1. Outlook 2010 中的“开发工具”选项卡安全问题默认情况下,为了使您免受病毒和其他恶意代码的侵害,Outlook 中会禁用 VBA 宏。若要启用这些宏,请使用以下过程:启用宏1. 在“文件”选项卡上,选择“Outlook 选项”打开“Outlook 选项”对话框,然后单击“信任中心”。2. 单击“信任中心设置”,然后单击左侧的“宏设置”选项。3. 选择“

11、为所有宏提供通知”,然后单击“确定”。该选项允许在 Outlook 中运行宏,但在宏运行之前,Outlook 会提示您确认是否要运行宏。4. 重新启动 Outlook 以使配置更改生效。Visual Basic 编辑器在显示“开发工具”选项卡后,可以打开 Visual Basic 编辑器,该编辑器是用于编写和编辑用于 Outlook 的 VBA 代码的内置工具。使用以下过程可以打开 Visual Basic 编辑器:打开 Visual Basic 编辑器1. 单击“开发工具”选项卡上的“宏”按钮。2. 在随后出现的“宏”对话框中的“宏名称”下键入 Test。3. 单击“创建”按钮打开 Visu

12、al Basic 编辑器,其中包含已键入的新宏的大纲。Visual Basic 编辑器包含下列代码。VBASub Test()End SubSub 代表“Subroutine”(子例程),可将其暂时定义为“宏”。运行 Test 宏将运行 Sub Test() 与 End Sub 之间的所有代码。现在,请编辑宏,使其类似如下代码。VBASub Test() MsgBox("Hello world")End Sub图 2. 在 Visual Basic 编辑器中测试宏注意 Visual Basic 编辑器的左面板。Test 宏位于 Project1 的 Module1 中。一个

13、项目模块包含多个模块,每个模块包含可以作为 .bas 文件导入或导出的 VBA 代码的集合。只要对象存在,便可通过设置其属性 和调用其方法 来处理该对象。您编辑过的子例程中包含一个方法,该方法是用于执行操作的代码。该子例程中的 Test() 方法现在是对象 Project1 的一个成员。 注释:其他 Office 应用程序可能会在 Visual Basic 编辑器中列出多个项目,但在 Outlook VBA 中,只列出一个项目,并且该项目始终名为 Project1。返回到 Outlook 中的“开发工具”选项卡,再次单击“宏”按钮。在随后出现的列表中选择“Project1.Test”宏,然后单

14、击“运行”显示包含文本“Hello, world!”的小消息框。祝贺您!您刚刚在 Outlook 中创建并实现了 VBA 代码!在消息框中单击“确定”关闭消息框并完成宏的运行。如果未出现消息框,请检查宏安全性设置并重新启动 Outlook。使宏可供访问如果您经常使用宏,可能会发现用键盘快捷方式或“快速访问工具栏”按钮访问宏更为方便。若要在“快速访问工具栏”中为“Test”宏创建按钮,请使用以下过程:在“快速访问工具栏”中为宏创建按钮1. 单击“文件”选项卡。2. 单击“选项”打开“Outlook 选项”对话框,然后单击“快速访问工具栏”。3. 在“从下列位置选择命令:”下的列表中,选择“宏”。

15、在随后出现的列表中查找类似于“Project1.Module1.Test”的文本,并选择该文本。 4. 单击“添加 >>”按钮将宏添加到右侧的列表中,然后单击“修改”按钮选择与该宏关联的按钮图像。 5. 单击“确定”。现在,您应在“快速访问工具栏”中的“文件”选项卡上方看到新按钮。 现在,您不必使用“开发工具”选项卡,便可随时快速运行宏,赶快试试吧。图 3. 向快速访问工具栏分配宏联系人编辑宏假设您在名为 Example Systems 的公司中有多个联系人,每个联系人的电子邮件地址都包含 域。现在,假定 Example Networks 收购了 Example Systems,并

16、将所有员工的电子邮件地址更改为 。如果您只有一个或两个联系人在 Example Systems,则手动更改这些地址是很简单的工作。但如果有 20、50 或 100 个联系人,则自动执行此类重复性任务便是 VBA 在 Office 中的常见用途了。 本文探讨如何使用 Outlook 中的 VBA 修改联系人,还对一些 VBA 概念做了解释。访问联系人文件夹按照您创建 Test 宏时使用的步骤创建名为 CompanyChange 的新宏并在 Visual Basic 编辑器中打开该宏。 第一个任务是在 Outlook 中访问“联系人”文件夹对象,然后将对该对象的引用存储在一个变量中。在编程中,变量

17、是一个临时的命名对象,可保存值或对对象的引用。下面的示例代码使用一个名为 ContactsFolder 的变量。该代码指示 VBA,它将把一个 Folder 对象放入其中并运行 Session 对象的 GetDefaultFolder 方法,以查找 Contacts 文件夹并将对它的引用存储在该变量中。Visual Basic 编辑器中包含一种有帮助的自动代码条目,名为“智能感知”。在键入 Session.GetDefaultFolder 时要仔细查看,然后按下左括号作为其参数。在执行此操作期间,Visual Basic 编辑器会显示选项列表。使用下拉箭头或鼠标选择 olFolderConta

18、cts(这是一种可用的文件夹类型),然后按下 Tab 键将其选中。图 4. 使用“智能感知”选取文件夹类型虽然在处理代码时使用复制和粘贴功能是可以有效避免键入错误的极好做法,但直接在 Visual Basic 编辑器中键入代码可以亲自体验编辑器对您有何帮助。VBASub CompanyChange() Dim ContactsFolder as Folder Set ContactsFolder = Session.GetDefaultFolder(olFolderContacts)End Sub再添加一行,以获取一些反馈并在宏的运行过程中测试宏。(而且可以像在“使宏可供访问”一节中那样,花一

19、分钟的时间为 CompanyChange 创建一个“快速访问工具栏”按钮。)VBASub CompanyChange() Dim ContactsFolder as Folder Set ContactsFolder = Session.GetDefaultFolder(olFolderContacts) MsgBox ("Contacts Found: " & ContactsFolder.Items.Count)End SubItems 是 Folder 对象的一个属性,Count 是 Items 属性的一个属性。运行宏;Outlook 中的联系人数应出现在消息

20、框中。 如果尚未执行此操作,请打开“联系人”文件夹,创建一些为虚构的 Example Systems 公司工作的示例联系人。为每个示例联系人给定公司名称 Example Systems,并为每个联系人创建一个与 someone 相似的不同电子邮件地址。对象集合集合 是现代编程语言(如 VBA)中最强大的功能之一。集合 是可以存储在属性中的一组对象,通过轻松“演练”可以访问每个对象。在该示例中,代码必须遍历联系人的集合以查找 Example Systems 的人员。如上所述,ContactsFolder 变量可提供对 Folder 的 Items 集合的访问权限。联系人 Folder 的 Ite

21、ms 集合将返回 ContactItem 类型的对象。创建一个变量,来保存对每个 ContactItem 的引用。VBADim Contact As ContactItem请注意,如果您不知道从集合中返回何种类型的对象,也可以使用通用 Object 类型。但如果您知道对象的类型,精确指定类型有许多优点。VBADim Contact As Object在拥有 ContactItem 后,必须检查每个人的公司名称。由于 ContactItem 对象用于存储有关联系人的信息,因此必须存在一个用于存储公司名称的属性,但由于您不知道该属性的名称,因此必须使用下列两种方法之一来查找该名称。确定属性名称为了

22、在 VBA 中充分利用对象,必须了解其属性和方法。虽然使用在 Web 中找到的示例代码可以执行许多任务,但您可以通过系统地检查所使用的对象来增加选项、减少调试和节省时间。例如,您可以通过在代码中选择 ContactItem 并按下 F1 来在“帮助”的“Outlook 开发人员参考”中查找有关 ContactItem 的信息,也可以在“帮助”中搜索 ContactItem。请务必研究各个主题中的链接,以深入了解相关对象。 “开发人员参考”是用于 VBA 编程的强大工具,也是查找您的代码所需属性的一种方法。在阅读有关 ContactItem 对象的一般信息后,可单击“ContactItem 对象

23、成员”链接查看方法和属性的列表(属性和方法统称为成员)。如果您继续查看该列表,您会看到一个 CompanyName 属性。此属性听起来似乎很有用。除了使用“Outlook 开发人员参考”查找属性或方法外,还可以使用 Visual Basic 编辑器中的智能感知功能。在将变量 Contact 定义为 ContactItem 后,键入 Contact 和句点可以显示与“帮助”中所列内容相同的成员列表。若要选择一个智能感知选项,请使用向上和向下箭头或鼠标突出显示该选项,然后使用 Tab 键将其选中。智能感知不提供各个成员的说明,因此当上下文使您的选择很明显或您已了解成员的名称但无法记住其准确拼写时,

24、使用此方法将很有帮助。成员名称拼写错误会产生 Visual Basic 编辑器在您运行宏之前一直无法标记的错误。循环访问集合现在,您有一个集合,您了解该集合中包含的对象类型,并且要访问找到的对象中的一个属性。您已准备好要使用 For Each 循环来遍历集合并处理它所包含的对象。 在伪代码 中,您准备执行下列操作。VBAFor Each object variable in a collection that contains that type of objectdo something with object variable.PropertyNext在实际代码中,上述代码转换为下列代码,

25、其中涉及包含 MsgBox 语句的行。VBAFor Each Contact In ContactsFolder.Items Debug.Print Contact.CompanyNameNext再次运行宏之前,请在 Visual Basic 编辑器中打开立即窗口。为此,请在菜单栏中单击“视图”,然后单击“立即窗口”。前面,您使用 MsgBox 从脚本中获取反馈。虽然 MsgBox 很有用,但它总是等待您单击“确定”,然后才显示下一条消息。相反,Debug.Print 每次都向立即窗口发送一行输出,而不等待您确认。运行此脚本后,您应该能够在立即窗口中看到公司名称的列表。注意,该列表对于开发人员

26、非常有用,但与您共享此宏的用户看不到该列表。使用 If 语句做决定在您已完成的解决方案中,您希望宏只更改在 Example Systems 工作的联系人,而不更改其他联系人。这种条件逻辑正是编程的优势所在。这里,您可以使用 If 语句告知 VBA 仅在所提供条件为真时运行代码;否则,它应跳到 End If 语句之后的代码。VBAIf some condition is true Then' do thingsEnd If' continue on whether or not the condition was true在您所处理的问题中,决定条件是当前 ContactItem

27、 的 CompanyName 属性是否设置为字符串“Example Systems”。在下面的代码中,请注意双引号。字符串值(即文本值)与数字值相反,始终包含在双引号内。VBA 忽略单引号,单引号用于您和其他开发人员的注释中。 在代码中添加条件,使完整脚本类似于如下代码。VBASub CompanyChange() Dim ContactsFolder As Folder Set ContactsFolder = Session.GetDefaultFolder(olFolderContacts) MsgBox ("Contacts Found:" & Contac

28、tsFolder.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 NextEnd Sub运行代码后,应在立即窗口中看到 Example Systems 联系人的姓名。 图 6. 使用立即窗口进行输出注意 Debug.Print 和前面的 MsgB

29、ox 为了清晰起见而合并已修复字符串的方法,例如 "Found: " 后跟属性返回的值。为使此方法起作用,必须使用字符串连接运算符 (&) 来合并这两个文本字符串。重要信息:重要信息:在继续此教程的过程中,请务必谨慎。您使用的是实际的 Outlook 联系人列表,其中包含几个来自 Example Systems 的虚构联系人。将每个联系人的公司名称都修改为“Example Networks”并不合适。 更改公司名称该操作已接近尾声。您已经加载了联系人,现在可以循环访问这些联系人并将您的联系人与来自 Example Systems 的联系人相区分。若要对 Exampl

30、e Networks 进行更改,您可以更改 CompanyName 属性并调用 Save 方法来提交更改。VBA If Contact.CompanyName = "Example Systems" Then Contact.CompanyName = "Example Networks" Contact.Save Debug.Print "Changed: " & Contact.FullName End If运行宏,然后查看 Example Systems 联系人;现在,这些联系人的公司名称应该已改为 Example Ne

31、tworks。请注意,为了以后测试脚本,必须手动将公司名称更改回 Example Systems 或创建可为您执行该更改的另一个宏。 虽然 Debug.Print 语句不是脚本运行所必需的语句,但请将其保留。您和您的用户从宏中获取的反馈越多越好。更改电子邮件地址更改 CompanyName 属性只是简单更改整个字符串。若要将电子邮件地址的域由 更改为 ,需要执行字符串操作。每个字符串都有一个内置的编号系统,其中每个字符都有一个从 1 开始的索引号。您可以使用各种 VBA 函数来处理部分或全部字符串。由于存在许多需要检查子字符串或更改部分字符串的编程情况,因此了解这些字符串操作可显著增加您作为

32、VBA 程序员时的选择。(在 Web 中搜索“VBA 字符串函数”可提供许多有用的列表和示例。)可以使用 Replace 函数来执行将一个子字符串替换为另一个子字符串的简单替换,但您可能经常会面临需要用更复杂的代码来处理字符串的情况。在紧邻代码之前的位置添加下面的行,将调用 Contact.Save。VBAContact.Email1Address = Replace(Contact.Email1Address, "", "")请从左至右认真阅读代码。该代码指示将联系人的 Email1Address 属性(第一个电子邮件地址)设置为新值。提供新值的方法是

33、让 Replace 函数在当前的 Contact.Email1Address 属性中查找字符串“”并将其替换为“”。确保虚构联系人的公司名称已设置为 Example Systems,然后运行该脚本。电子邮件地址应全都更改为 ,公司名称应全都更改为 Example Networks。使代码通用现在,您有一个强大的宏,但功能有限,因为指定新公司名称的唯一方法是编辑代码。若要使您的代码更加有用,可以使用 InputBox 函数提示用户输入。下列代码是最终脚本。这是一个有用并且完整的 Outlook 解决方案。VBASub CompanyChange() Dim ContactsFolder As F

34、older 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 co

35、ntacts 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 liste

36、d after the sign? e.g. ") 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 C

37、ontact.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 "Chan

38、ged: " & Contact.FullName End If Next ' confirm and clean up MsgBox (ContactsChangedCount & " contacts were changed from '" & OldCompanyName & "' to '" & NewCompanyName) Set Contact = Nothing Set ContactsFolder = NothingEnd Sub分发代码从开发所在计算机

39、向其他计算机移动代码的过程被称为部署,这是编程项目的一个重要部分。本节介绍如何将新宏移动到其他计算机中。首先需要一个小型后台。Outlook Visual Basic for Applications 代码设计用作个人宏开发环境;并非设计用于部署或分发。因此,无法像处理其他 Office 应用程序(如 Excel 或 Word)那样在文档内保存宏。若要将 Outlook VBA 宏从一台计算机移至另一台计算机,可从第一台计算机中导出代码模块并将其导入第二台计算机。也可以使用 Visual Basic 编辑器将项目的源代码复制并粘贴到第二台计算机上的 Project1 中。 如果您开发的解决方案要分发给多人

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论