Office 2010 中的 VBA 开发入门

Office 可视操作方法

**摘要:**了解非编程人员如何使用 VBA 编程扩展 Microsoft Office 2010。内容包括 VBA 语言概述、在不同的 Office 2010 应用程序中访问 VBA 的方法、编程示例以及有关 VBA 用法的一些示例应用程序。

上次修改时间: 2015年3月9日

适用范围: Excel 2010 | Office 2010 | Open XML | PowerPoint 2010 | VBA | Word 2010

**发布时间:**2010 年 9 月

**供稿人:**Peter Gruenbaum,SDK Bridge, LLC(该链接可能指向英文页面)

概述

Visual Basic for Applications (VBA) for Office 2010 为 Office 套件中的应用程序添加了新功能。例如,您可以对 Word 文档中的 50 个表应用重复更改,或强制文档在打开时提示用户进行输入,或高效地将联系人从 Outlook 移入到 Excel 电子表格。

应用程序的 Office 2010 套件提供了大量功能。可通过多种方式对文档、电子邮件、数据库、窗体、电子表格和演示文稿进行创作、格式设置和操作。Office 2010 中的 VBA 编程的强大功能表现在,每个可使用鼠标、键盘或对话框执行的操作也可以使用 VBA 执行。此外,如果某个操作可使用 VBA 完成一次,则可以同样轻松地完成此操作 100 次或 1000 次。VBA 还可用于向 Office 应用程序添加新功能;例如,通过专门针对您的业务需求的方式向您的文档用户进行提示。

考虑在 Office 中使用 VBA 编程有以下一些令人信服的原因:

1. 自动化和重复。VBA 对于格式设置或更正问题的重复性解决方案十分高效。可使用 VBA 自动执行的重复任务的示例包括:更改 Word 中每页顶部的段落样式,重新设置从 Excel 粘贴到 Word 或 Outlook 电子邮件中的多个表的格式,以及对 Outlook 联系人进行重复更改。几乎所有可手动执行的格式设置或编辑更改都能利用 VBA 完成。

2. 扩展。有时候您可能要鼓励(或者甚至强制)用户采用不属于标准应用的特定方法与 Office 应用程序或文档交互。例如,您可能希望提示用户在打开、保存或打印文档时执行某些特定操作。

3. Office 2010 应用程序之间的交互。利用 VBA,您可以将所有联系人从 Outlook 移动到 Word,或将数据从 Excel 电子表格移入到一组 PowerPoint 幻灯片。与复制并粘贴这种用户交互方式相比,VBA 为您提供了更快的速度和更好的控制性。

VBA 编程是一个功能强大的解决方案。但是,它并非总是最佳方法。有时候,使用其他方法实现您的目标会更合理。在开始 VBA 项目之前,应考虑内置工具和标准功能。例如,如果您有耗时的编辑或布局任务,则可考虑使用样式或键盘快捷方式来解决该问题。您也许能够执行一次任务,然后使用 Ctrl+Y("重做")来重复该任务。或者,您也可以使用正确格式或模板创建新文档,然后将内容复制到新文档中。

此直观操作方法演示了非编程人员如何开始使用 VBA。它介绍了如何通过 VBA 对象操作 Office 文档,并提供了简单的编程示例。

编码

本文包含几个 VBA 宏的简单代码。本节将讨论以下主题:

  • 如何在 Office 2010 应用程序中启用"开发工具"选项卡

  • 录制宏

  • VBA 示例 1:更改 Excel 单元格边框

  • VBA 示例 2:分支和循环

  • VBA 示例 3:在 Outlook 中创建电子邮件

  • VBA 示例 4:删除 Excel 中的空行

  • VBA 示例 5:在 Office 应用程序之间复制数据

若要使用 VBA,您可以使用 Visual Basic 代码创建宏。可以在读取一节找到有关如何在 VBA 中编程的信息。

启用"开发工具"选项卡

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

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

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

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

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

  5. 单击"确定"。

> [!NOTE] >

在 2007 版的 Microsoft Office 应用程序中,可使用 Office 按钮打开"选项"对话框。在"常用"类别下,单击"在功能区显示‘开发工具’选项卡"。

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

图 1."开发工具"选项卡上的按钮

"开发工具"选项卡上的按钮

在单击"开发工具"选项卡上的"宏"按钮时,会打开"宏"对话框,该对话框允许您访问可从特定文档或应用程序访问的 VBA 子例程或宏。单击"Visual Basic"按钮将会打开 Visual Basic 编辑器,您可在其中创建和编辑 VBA 代码。

录制宏

Word 2010 和 Excel 2010 中的"开发工具"选项卡上的另一个按钮是"录制宏"按钮,用于自动生成可重现您在应用程序中执行的操作的 VBA 代码。"录制宏"是一个很有用的工具,您可通过它了解有关 VBA 的更多信息。通过阅读生成的代码,可让您深入地了解 VBA,并将您作为 Office 2010 用户需要了解的知识与作为程序员所需了解的知识紧密联系起来。请注意,生成的代码可能会让人迷惑,因为宏编辑器必须对您的意图做一些假设,而这些假设不一定准确。

  1. 在 Excel 2010 中打开新工作簿或在 Word 2010 中打开新文档。

  2. 单击功能区中的"开发工具"选项卡。单击"录制宏"并接受"录制宏"对话框中的所有默认设置,包括将 Macro1 作为宏名称,将当前工作簿作为保存位置。

  3. 单击"确定"开始录制宏。请注意按钮文本是如何变为"停止录制"的。在完成要录制的操作后单击该按钮。

  4. 单击单元格 B1,然后键入第一个字符串:"Hello World"。停止键入并查看"停止录制"按钮;该按钮是灰显的,因为 Excel 2010 正在等待您完成在单元格中键入值的操作。

  5. 单击单元格 B2 以完成在单元格 B1 中的操作,然后单击"停止录制"。

  6. 单击"开发工具"选项卡上的"宏",选择"Macro1"(如果尚未选中),然后单击"编辑"以在 Visual Basic 编辑器中查看 Macro1 的代码。

图 2. 显示录制的宏的 Visual Basic 编辑器

显示录制的宏的 Visual Basic 编辑器

您创建的宏应类似于下面的代码示例。

Sub Macro1()
'
' Macro1 Macro
'
'
    Range("B1").Select
    ActiveCell.FormulaR1C1 = "Hello World"
    Range("B2").Select
End Sub

在该代码中,将选择单元格 B1,然后将字符串"Hello World"应用到已变为活动状态的单元格。文本两边的引号指定字符串值而不是数字值。

最后一行显示您如何单击单元格 B2 以再次显示"停止录制"按钮。宏录制器将记录每次击键。

以撇号开头并由编辑器标为绿色的代码行是解释代码或提醒您和其他程序员代码用途的注释。VBA 会忽略以单引号开头的任何行或行的一部分。在代码中编写清楚而适当的注释非常重要,但这方面的讨论不在此直观操作方法范围之内。本文后面对此代码的引用不包括这四个注释行。

> [!TIP] >

Application 对象隐含在所有 VBA 宏中。您录制的代码将使用 Application 对象。

使用开发工具帮助

当宏录制器生成代码时,它会使用复杂的算法来确定您想要的方法和属性。如果您无法识别某个给定的属性,那么有许多资源可帮助您。例如,在您录制的宏中,宏录制器生成了引用 ForumulaR1C1 属性的代码。此做法的含义一点也不明显,因此您可以使用开发工具帮助查找它。

在录制的宏中选择 ForumulaR1C1,然后按 F1。帮助系统将运行快速搜索,并确定相应主题位于 Excel 2010"帮助"的 Excel 2010"开发工具"一节中,然后列出 ForumulaR1C1 属性。您可以单击链接来了解有关该属性的更多信息,但在执行此操作之前,请注意位于窗口底部附近的"Excel 对象模型引用"链接。单击该链接可查看 Excel 2010 在其对象模型中用于描述工作表及其组件的对象的长列表。单击其中任一对象可查看应用于该特定对象的属性和方法,以及对其他相关选项的交叉引用。许多"帮助"条目还包含可帮助您的简短代码示例。例如,您可以访问 Borders 对象中的链接来了解如何在 VBA 中设置边框。

Worksheets(1).Range("A1").Borders.LineStyle = xlDouble


> [!NOTE] >

Borders 代码看起来与录制的宏不同。对象模型可能会让人迷惑的一点是,可使用多种方法处理任何给定对象(此处为单元格 A1)。

VBA 示例 1:更改 Excel 单元格边框

第一个示例 ExcelBorders 将单元格 A1 设置为包含值"Wow!",并将边框样式设置为双线。它使用前面提到的我们在 Excel 2010 帮助的"开发工具"一节中找到的代码。

从 Excel 中打开 Visual Basic 编辑器,从"文件"菜单中选择"导入",然后选择 ExcelBorders.bas。

Sub ExcelBorders()
    Worksheets(1).Range("A1").Value = "Wow!"
    Worksheets(1).Range("A1").Borders.LineStyle = xlDouble
End Sub

返回到 Excel 工作表,然后再次单击"宏"按钮。选择"ExcelBorders",然后单击"运行"按钮。现在您应该会看到,A1 包含文本"Wow!"且具有双线边框。

图 3. 您的第一个宏的结果

第一个宏的运行结果

VBA 示例 2:分支和循环

第二个示例 BranchingLooping 将检查单元格 A1 的值,以确定它是否为"Fill"。如果为"Fill",则会用一个等于行数两倍的数字填充下面的行(从 A2 到 A10)。如果 A1 单元格不包含值"Fill",则会显示一个消息框提示您要这样做。从 Excel 中打开 Visual Basic 编辑器,从"文件"菜单中选择"导入",然后选择"LoopingBranching.bas"。"分支和循环"一节将对此做更详细的介绍。

Sub BranchingLooping()
    If Worksheets(1).Range("A1").Value = "Fill" Then
        Dim row As Integer
        For row = 2 To 10
            Worksheets(1).Range("A" & row).Value = row * 2
        Next row
    Else
        MsgBox ("Put Fill in Cell A1")
    End If
End Sub

VBA 示例 3:在 Outlook 中创建电子邮件

下一个示例 MakeMessage 将创建包含 HTML 正文的 Outlook 邮件。从 Outlook 中打开 Visual Basic 编辑器,从"文件"菜单中选择"导入",然后选择"MakeMessage.bas"。运行该宏。

Sub MakeMessage()
    Dim OutlookMessage As Outlook.MailItem
    Set OutlookMessage = Application.CreateItem(olMailItem)
    OutlookMessage.Subject = "Happy New Year!"
    OutlookMessage.HTMLBody = "<HTML><BODY>Dear <p>Happy New Year! We have had a good year this year…</BODY></HTML>"
    OutlookMessage.Display
    Set OutlookMessage = Nothing
End Sub
> [!NOTE] >

您可能希望为 Outlook 中的很多应用程序自动创建电子邮件。例如,您可能会循环访问所有联系人,选择要向其发送此邮件的联系人(例如存在业务关系的人),并且只为这些联系人自动生成邮件。除使用 VBA 以外,您还可以使用模板。

VBA 示例 4:删除 Excel 中的空行

另一个示例 DeleteEmptyRows 将在 Excel 中删除选定范围的第一列中包含空单元格的所有行。从 Excel 中打开 Visual Basic 编辑器,从"文件"菜单中选择"导入",然后选择"DeleteEmptyRows.bas"。

Sub DeleteEmptyRows()
    SelectedRange = Selection.Rows.Count
    ActiveCell.Select
    For i = 1 To SelectedRange
        If ActiveCell.Value = "" Then
            Selection.EntireRow.Delete
        Else
            ActiveCell.Offset(1, 0).Select
        End If
    Next i
End Sub

该子例程的第一行将创建一个名为 SelectedRange 的变量,并将其设置为用户已选择的行的数量。请注意,没有先使用 Dim 语句来创建该变量;在 Visual Basic 中,使用 Dim 是可选的。接下来,将选择活动单元格(原始选择范围的左上角的单元格)。现在,变量 i 将从 1 循环到用户最初选择的行的数量。如果活动单元格是空的,则会删除选定的整个行。如果活动单元格不是空的,则会将所选单元格下移一行。

在电子表格中,使用数据填充 A 列,但将某些单元格留空。选择所有行并运行宏。您可以看到删除这些行的位置。

VBA 示例 5:在 Office 应用程序之间复制数据

最后一个示例 CopyCurrentContact 会将数据从 Outlook 中的打开联系人复制到打开的 Word 文档中。从 Word 中打开 Visual Basic 编辑器,从"文件"菜单中选择"导入",然后选择"DeleteEmptyRows.bas"。在 Outlook 中打开一个联系人。最后,打开一个空的 Word 文档,然后运行该宏。

Sub CopyCurrentContact()
    Dim OutlookObj As Object
    Dim InspectorObj As Object
    Dim ItemObj As Object
    Set OutlookObj = CreateObject("Outlook.Application")
    Set InspectorObj = OutlookObj.ActiveInspector
    Set ItemObj = InspectorObj.CurrentItem
    Application.ActiveDocument.Range.InsertAfter(ItemObj.FullName & " from " & ItemObj.CompanyName)
End Sub

前三行创建几个变量:一个用于 Outlook 应用程序,一个用于检查器(识别 Outlook 中打开的项目),还有一个用于打开的联系人。第四行初始化 Outlook 变量。第五行设置检查器,第六行使用检查器查找打开的联系人。子例程的最后一行获取全名和公司名并将其插入打开的 Word 文档中。

读取


编写 VBA 代码:对象、属性和方法

您可能认为编写代码是一项神秘或困难的工作,但您会发现,利用某些常识和逻辑,这项工作也不是很难。在创建 Office 应用程序时公开可以接收指令的对象,这与为设计电话时包含可用于与之交互的按键很相似。按下按键时,电话会识别指令并按照拨号顺序包括对应的号码。在编程时,您通过向应用程序中的各个对象发送指令来与应用程序交互。这些对象可完成很多工作,但存在相应限制。它们只能执行为其设计的操作,并且只按照您的指示执行操作。

开发人员在一个层次结构中组织编程对象,该层次结构称为应用程序的对象模型。例如,Word 具有包含 Document 对象的顶级 Application 对象,Document 对象包含 Paragraph 对象,依此类推。对象模型大致反映了您在用户界面中看到的内容。它们是应用程序及其功能的概念图。

请注意,对象具有属性 和方法。属性是属于您的对象的其他对象,而方法是对象可执行的操作。若要访问属性或方法,可在对象后放一个句点,然后添加属性或方法名称。例如,表示 Excel 电子表格中的某个单元格的对象将具有 Value 属性,该属性返回该单元格中包含的值;该对象还具有 Select 方法,该方法可使该单元格进入选定状态。

从示例开始

VBA 社区非常大;在 Web 上进行搜索通常会获得其执行的操作与您要执行的操作类似的 VBA 代码示例。如果您找不到好的示例,请尝试将任务分解为较小的单元,然后搜索每个单元;或者尝试考虑更常见但又类似的问题。从示例开始可为您节省很多时间。

这并不意味着 Web 上有免费又成熟的代码供您使用。事实上,您找到的一些代码可能存在 Bug 或错误。您在网上或 VBA 文档中找到的示例只是为您提供了良好的开端。请记住,学习编程需要时间和思索。在您使用另一个解决方案来解决您的问题之前,请问一问自己,VBA 是不是解决此问题的最佳选择。

将问题简化 - 先解决一部分问题

编程可能会很快变得复杂。将问题分解为尽可能小的逻辑单元,然后独立编写并测试每个单元,这一点很重要,尤其是对初学者。如果您有太多代码,而这些代码将您搞糊涂了,那么请停止工作,将问题撇在一边。当您回来处理这个问题时,可以将它的一小部分复制到新模块中,解决这一部分问题,运行代码,测试代码以确保其正常工作。然后,继续下一个部分。

Bug 和调试

编程错误主要有两种:语法错误,即违反编程语言的语法规则;运行时错误,即看上去语法正确,但在 VBA 尝试执行代码时失败。

尽管修复起来很让人郁闷,但语法错误还是很容易发现。如果您在代码中键入了错误的语法,Visual Basic 编辑器会发出嘟嘟声并闪烁。运行时错误比较难发现,因为编程语法看上去正确,但代码在 VBA 尝试执行它时会失败。

了解如何对更长、更复杂的程序更加谨慎地使用调试程序是一个不错的主意。至少应了解如何设置断点以在要检查代码的位置停止执行代码,如何添加监视点以查看不同变量和属性在代码运行过程中的值,以及如何逐行单步执行代码。所有这些选项在"调试"菜单中均有提供,谨慎的调试程序用户通常会记住附带的键盘快捷方式。

使用参考材料

若要打开 Office 2010 帮助中内置的"开发人员参考",请单击功能区中的问号或按 F1,这样即可从任何 Office 2010 应用程序中打开帮助参考。然后,在"搜索"按钮右侧,单击下拉箭头来筛选内容。单击"开发人员参考"。如果您在左面板中没有看到目录,请单击小的书籍图标来打开它,然后从该处展开对象模型参考。

图 4. 筛选开发工具帮助

筛选开发人员帮助

花时间浏览对象模型参考是值得的。在了解要使用的 VBA 语法和 Office 2010 应用程序的对象模型的基础知识后,您就能从主观猜测转换到行之有法的编程。

此外,Microsoft Office 开发中心是查阅文章、技巧和社区信息的优秀门户。

搜索论坛和组

所有程序员都会时常遇到困难,即使在读完他们可以找到的所有参考文章,并且整夜无眠地思考解决该问题的各种方法后都无济于事。幸运的是,Internet 上已经培育出了一个开发人员社区,他们可以互相帮助来解决编程问题。

每次在 Web 上搜索"office 开发人员论坛"都会显示几个讨论组。您也可以搜索"office 开发"或问题描述来查找论坛、博客帖子和文章。

如果您已经尝试了各种方法来解决问题,那么就不要害怕将您的问题发布到开发人员论坛上。这些论坛接受来自程序员新手的帖子,许多经验丰富的开发人员都很乐于提供帮助。

下面是在向开发人员论坛发布内容时需遵守的几点规定:

  • 在发布之前,应在网站上查看常见问题解答或论坛成员希望您遵循的准则。确保所发布的内容符合这些准则,并且位于论坛的正确区域中。

  • 包含清楚完整的代码示例,如果代码是较长的一个代码段的一部分,请考虑编辑您的代码以使它对其他用户一目了然。

  • 清楚简明地描述您的问题,并概述您为解决此问题已经采取的任何步骤。花点时间尽力写好帖子,尤其在您慌乱或匆忙时。采用对首次阅读问题陈述的读者合理的方式介绍情况。

  • 要有礼貌,并表达您的感激之情。

进一步了解编程

虽然本文很短且只触及了 VBA 和编程的皮毛,但我们希望它足以助您入门。本节简短地讨论了几个其他关键主题。

变量

除了操作应用程序已创建的对象之外,您可能还希望创建自己的对象来存储值或对其他对象的引用以在应用程序中临时使用。这些对象称为变量。

若要在 VBA 中使用某个变量,则必须使用 Dim 语句标识该变量表示的对象类型。然后,您可以设置该变量的值并使用它来设置其他变量或属性。

下面的代码示例将创建一个名为 i 的变量,该变量将存储一个整型(即,一个整数,而不是小数或分数部分)。

Dim i As Integer

分支和循环

本文中的简单程序从上往下执行代码,一次只执行一行。编程的真正功能将在您使用根据指定的一个或多个条件确定要执行哪些代码行的选项时表现出来。您可以扩展这些功能,即使您可以多次重复操作时也如此。If 语句会检查内容是否为 true,然后执行此语句后的所有步骤,直到到达 Else 或 End If。For 语句将重复它本身与 Next 语句之间的所有步骤,并且每次都在变量范围内增大变量的值。下面的代码示例演示如何使用 If 和 For 语句来检查单元格中的值,然后填充几个其他的单元格。如果单元格中的值不是预期值,则还会显示一个消息框。

Sub Macro1()
    If Worksheets(1).Range("A1").Value = "Yes!" Then
        Dim i As Integer
        For i = 2 To 10
            Worksheets(1).Range("A" & i).Value = "OK! " & i
        Next i
    Else
        MsgBox "Put Yes! in cell A1"
    End If
End Sub
观看

观看视频

观看视频(该链接可能指向英文页面)

视频时长:09:57 | 大小:19.2 MB | 类型:WMV

单击以获取代码

获取代码(该链接可能指向英文页面)

浏览