宏和 Visual Basic 编辑器

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

打开“开发工具”选项卡

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

启用“开发工具”选项卡

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

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

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

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

  5. 单击“确定”

Ee814735.note(zh-cn,office.14).gif注释:
在 Office 2007 中,显示“开发工具”选项卡的方法是单击 Office 按钮,单击“选项”,然后在“选项”对话框的“常用”类别中选中“在功能区显示‘开发工具’选项卡”复选框

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



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

“开发人员”选项卡上的按钮

安全问题

为确保 Office 2010 用户免遭病毒和危险宏代码的危害,不能将宏代码保存在使用标准文件扩展名的标准 Office 2010 文档中。必须将代码保存在使用特殊扩展名的文件中。例如,不能将宏保存在扩展名为 .docx 的标准 Word 2010 文档中;而是必须使用扩展名为 .docm 且启用了宏的特殊 Word 2010 文档。

打开 .docm 文件时,Office 2010 安全功能可能仍会阻止文档中的宏运行,并通知您,也可能不通知您。检查所有 Office 2010 应用程序中信任中心中的设置和选项。默认设置禁止宏运行,但通知您已禁用宏并提供为该文档重新启用宏的选项。

可以通过创建“受信任位置”、“受信任的文档”或“受信任的发布者”来指定可以运行宏的特定文件夹。最好选择使用“受信任的发布者”,它适用于您分发的数字签名文档。有关特定 Office 2010 应用程序中安全设置的详细信息,请打开“选项”对话框,单击“信任中心”,然后单击“信任中心设置”

Ee814735.note(zh-cn,office.14).gif注释:
一些 Office 2010 应用程序(如 Outlook 2010)默认情况下会将宏保存在您的本地计算机上的主模板中。虽然在您运行自己的宏时,该策略会减少您自己的计算机上的本地安全问题,但如果您要分发自己的宏,则需要部署策略。

录制宏

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

Word 2010 和 Excel 2010 中“开发工具”选项卡上的另一个按钮是“录制宏”按钮,它自动生成可重现您在应用程序中执行的操作的 VBA 代码。“录制宏”是一个非常棒的工具,可通过它了解有关 VBA 的更多信息。阅读生成的代码可使您深入了解 VBA,并在您作为用户了解 Office 2010 和作为程序员了解该软件之间架起稳固桥梁。唯一需要指出的是生成的代码可能令人迷惑,因为宏编辑器必须对您的意图进行一些假定,而这些假定不一定准确。

录制宏

  1. 打开一个 Excel 2010 新工作簿,然后单击功能区中的“开发工具”选项卡。单击“录制宏”并接受“录制宏”对话框中的所有默认设置,包括将 Macro1 作为宏名称,将当前工作簿作为保存位置。

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

  3. 单击单元格 B1,然后键入程序员的第一个经典字符串:Hello World。停止键入并查看“停止录制”按钮;它将灰显,因为 Excel 2010 正在等待您完成在该单元格中键入值的操作。

  4. 单击单元格 B2 以完成单元格 B1 中的操作,然后单击“停止录制”

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



图 2. Visual Basic 编辑器中的宏代码

Visual Basic Editor 中的宏代码

查看代码

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

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

了解与前面的选择单元格 A1 中的文本的代码段的相似之处和不同之处。在此代码中,选择了单元格 B1,然后将字符串 "Hello World" 应用于已激活的单元格。文本两边的引号指定相对于数值的字符串值。

是否还记得如何单击单元格 B2 以再次显示“停止录制”按钮?该操作也显示为一行代码。宏录制器录制每一次键击。

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

当宏录制器生成代码时,它使用复杂的算法来确定您需要的方法和属性。如果您无法识别给定属性,有许多资源可帮助您。例如,在您录制的宏中,宏录制器生成了引用 ForumulaR1C1 属性的代码。不确定这是什么意思?

Ee814735.Tip(zh-cn,office.14).gif提示:
请注意,您应知道 Application 对象隐含在所有 VBA 宏中。您录制的代码的每行的开头都是 Application.

使用开发工具帮助

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

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

编辑代码

边框代码看起来与录制的宏不同。对象模型令人迷惑的一点是可使用多种方法处理任何给定对象(在本例中为单元格 A1)。

有时,学习编程的最好方法是对某些运行代码进行微小更改,然后查看结果。立即尝试。在 Visual Basic 编辑器中打开 Macro1,对代码进行以下更改。

复制
Sub Macro1()
    Worksheets(1).Range("A1").Value = "Wow!"
    Worksheets(1).Range("A1").Borders.LineStyle = xlDouble
End Sub
Ee814735.Tip(zh-cn,office.14).gif提示:
在处理代码时尽可能地使用复制和粘贴操作,以避免键入错误。

您无需保存代码即可进行尝试,返回到 Excel 2010 文档,单击“开发工具”选项卡上的“宏”,单击“Macro1”,然后单击“运行”。单元格 A1 现在包含文本 Wow! 且其四周有双线边框。



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

您的第一个宏的结果

您刚才录制了宏,阅读了对象模型文档,并通过简单编程制作了一个可执行某项操作的 VBA 程序。祝贺您!

宏没有运行?阅读 VBA 中的调试建议。

编程提示和技巧

从使用示例开始

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

这并不意味着编写严密的免费代码在 Web 上等待您使用。事实上,您找到的一些代码可能有缺陷或错误。但您联机或在 VBA 文档中找到的示例可为您提供良好的开端。请记住,学习编程需要时间和思索。在您忙于使用另一个解决方案来解决您的问题之前,请询问自己 VBA 是不是解决此问题的正确选择。

处理较简单的问题

编程过程可能会迅速变得复杂化。将问题分解为尽可能小的逻辑单元,然后独立编写并测试每个单元,这一点很重要,尤其对于初学者。如果您面前有太多代码,并且您变得迷惑或糊涂,请停止并撇开问题。当您重新面对问题时,可以将一个小问题复制到新模块中,解决该问题,让代码运行,并测试它以确保它能够运行。然后移动到下一个部分。

缺陷和调试

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

虽然修复这些错误可能令人沮丧,但语法错误很容易捕获;如果您在代码中键入语法错误,Visual Basic 编辑器会发出嘟嘟声并闪烁。

例如,在 VBA 中,必须用双引号将字符串值引起来。若要了解使用单引号会发生什么,请返回到 Visual Basic 编辑器,将代码示例中的 "Wow!" 字符串替换为 'Wow!'(即,将单词 Wow 括在单引号中)。如果您单击下一行,Visual Basic 编辑器会做出响应。错误“Compile error: Expected: expression”(编译错误: 预期: 表达式)不太有帮助,但生成该错误的行会变为红色以告知您该行中有语法错误,因此,此程序不会运行。

单击“确定”,然后将文本更改回 "Wow!"

运行时错误较难以捕获,因为编程语法看上去正确,但代码在 VBA 尝试执行它时失败。

例如,打开 Visual Basic 编辑器,在宏中将 Value 属性名称更改为 ValueX,故意引入运行时错误,因为 Range 对象没有名为 ValueX 的属性。返回到 Excel 2010 文档,打开“宏”对话框,再次运行 Macro1。您应该看到一个说明运行时错误的 Visual Basic 消息框,错误文本为“Object doesn't support this property of method”(对象不支持此属性或方法)。虽然该文本解释得很清楚,但单击“调试”可查看更多信息。

当您返回到 Visual Basic 编辑器时,编辑器处于特定调试模式,即使用黄色突出显示失败的代码行。与预期的一样,突出显示了包括 ValueX 属性的行。



图 4. 运行中的 Visual Basic 调试程序

使用中的 Visual Basic 调试程序

可以对运行中的 VBA 代码进行更改,以将 ValueX 更改回 Value,然后单击“调试”菜单下的绿色小播放按钮。程序应能够再次正常运行。

最好了解如何对更长、更复杂的程序更加慎重地使用调试程序。至少应了解如何设置断点以在您要查看代码时停止执行代码,如何添加监视点以在代码运行时查看不同变量和属性的值,以及如何逐行分步完成代码。所有这些选项均位于“调试”菜单中,并且认真的调试程序用户通常会记住附带的键盘快捷方式。

恰当使用参考材料

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



图 5. 开发工具帮助上的筛选功能适用于所有 Office 2010 应用程序

对开发人员帮助进行筛选

浏览对象模型参考所花费的时间将得到回报。在您了解要使用的 Office 2010 应用程序的 VBA 语法和对象模型的基础知识后,您的技能将得到提升,您将从主观猜测转变为进行有方法的编程。

当然,Microsoft Office 开发人员中心是查阅文章、提示和社区信息的极好门户。

搜索论坛和组

所有程序员都会时不时遇到困难,即使在阅读他们可以找到的每篇参考文章之后。他们晚上睡觉时会失眠,因为他们在思考解决问题的各种方法。幸运的是,Internet 促进了互相帮助以解决编程问题的开发人员社区的发展。

在网络上搜索“office 开发人员论坛”时会显示几个讨论组。您也可以搜索“office 开发”或问题描述来查找论坛、博客文章和文章。

如果您已为解决问题而竭尽全力,那么就不要害怕将您的问题张贴到开发人员论坛上。这些论坛欢迎来自较新程序员的帖子,并且许多有经验的开发人员都很乐于提供帮助。

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

  • 在张贴之前,应在网站上查找 FAQ 或论坛成员希望您遵循的准则。确保所张贴的内容符合这些准则,并位于论坛的正确区域。

  • 包括清楚的完整代码示例,如果您的代码是一长段代码的一部分,请考虑编辑您的代码以向其他人进行阐述。

  • 清楚准确地描述您的问题,并概述您为解决此问题已经采取的所有步骤。花些时间尽力编写好的帖子,尤其在您慌乱或匆忙时。采用对首次阅读问题陈述的读者有意义的方式介绍情况。

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

进一步了解编程

虽然本文很短且只触及 VBA 和编程的表面,但希望它能够为您入门提供足够帮助。

本节简单讨论一些较关键的主题。

变量

在本文提供的简单示例中,您处理的是应用程序已创建的对象。您可能希望创建自己的对象来存储值或对应用程序中临时使用的其他对象的引用。这些对象称为变量。

若要在 VBA 中使用变量,必须使用 Dim 语句告知 VBA 变量表示哪种类型的对象。然后,您可以设置其值并使用它来设置其他变量或属性。

复制
    Dim MyStringVariable As String
    MyStringVariable = "Wow!"
    Worksheets(1).Range("A1").Value = MyStringVariable

分支和循环

本文中的简单程序从上到下一次执行一行。编程的真正功能来自您必须根据指定的一个或多个条件确定要执行哪些代码行的选项。您可以进一步扩展这些功能,以便可以重复执行一项操作许多次。例如,下面的代码扩展了 Macro1。

复制
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

将此代码键入或粘贴到 Visual Basic 编辑器中,然后运行它。按照出现的消息框中的指示操作,并将单元格 A1 中的文本从 Wow! 更改为 Yes!,然后再次运行它来查看循环功能。此代码段演示变量、分支和循环。在看到它运行后仔细阅读它,尝试确定每行执行时发生了什么。

所有 Office 2010 应用程序:代码示例

下面是一些要尝试的脚本;每个脚本解决一个 Office 2010 实际问题。

在 Outlook 2010 中创建电子邮件

复制
Sub MakeMessage()
    Dim OutlookMessage As Outlook.MailItem
    Set OutlookMessage = Application.CreateItem(olMailItem)
    OutlookMessage.Subject = "Hello World!"
    OutlookMessage.Display
    Set OutlookMessage = Nothing
End Sub

请注意,有时您可能希望在 Outlook 2010 中自动创建电子邮件;您也可以使用模板。

删除 Excel 2010 工作表中的空行

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

请注意,您可以选择一列单元格,然后运行此宏来删除所选列中具有空白单元格的所有行。

删除 PowerPoint 2010 中的空文本框

复制
Sub RemoveEmptyTextBoxes()
    Dim SlideObj As Slide
    Dim ShapeObj As Shape
    Dim ShapeIndex As Integer
    For Each SlideObj In ActivePresentation.Slides
        For ShapeIndex = SlideObj.Shapes.Count To 1 Step -1
            Set ShapeObj = SlideObj.Shapes(ShapeIndex)
            If ShapeObj.Type = msoTextBox Then
                If Trim(ShapeObj.TextFrame.TextRange.Text) = "" Then
                    ShapeObj.Delete
                End If
            End If
        Next ShapeIndex
    Next SlideObj
End Sub

请注意,此代码循环访问所有幻灯片并删除没有任何文本的所有文本框。计数变量递减而不是递增,因为代码每次删除一个对象时,都会从集合中移除该对象,从而减小了计数。

将 Outlook 2010 中的联系人复制到 Word 2010

复制
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 2010 中当前打开的联系人复制到打开的 Word 2010 文档中。仅当 Outlook 中包含当前打开以供检查的联系人时,此代码才运行。

posted on 2011-07-14 13:27  账号难注册  阅读(1286)  评论(0编辑  收藏  举报