Office VBA 入门

你是否面临着重复清理 Word 中五十个表格的工作? 你是否希望有一个特殊的文档能够在打开时提示用户进行输入? 你是否感觉难以弄明白如何将 Microsoft Outlook 中获取的联系人有效地导入 Microsoft Excel 电子表格?

可以使用 Visual Basic for Applications (VBA) for Office 来执行这些任务并完成更多任务,这是一种简单但功能强大的编程语言,可用于扩展 Office 应用程序。

本文适用于希望了解 VBA 和希望深入了解编程如何帮助他们自定义 Office 的有经验的 Office 用户。

Office 应用程序套件具有一组丰富的功能。 可通过多种不同的方法对文档、电子邮件、数据库、表单、电子表格和演示文稿进行创作、格式设置和操纵。 Office VBA 编程的杰出之处在于,你可以使用鼠标、键盘或对话框执行的几乎每一个操作也都可以使用 VBA 完成。 此外,若某个操作可以使用 VBA 执行一次,则可以同样轻松地执行该操作一百次。 (实际上,自动执行重复任务是 Office VBA 最常见的用途之一。)

除了可通过编写 VBA 脚本来加速执行日常任务外,还可以使用 VBA 为 Office 应用程序添加新功能,或以特定于业务需要的方式来提示文档用户并与之交互。 例如,可以编写一些 VBA 代码,使其在用户首次尝试保存文档时显示一个弹出消息,提醒用户将文档保存到特定网络驱动器上。

本文探讨了一些利用 VBA 编程强大功能的主要原因。 它探讨了 VBA 语言和可用于处理你的解決方案的开箱即用工具。 最后,它包括一些提示和方法以避免一些常见编程错误。

注意

有兴趣开发跨多个平台扩展 Office 体验的解决方案吗? 查看新的 Office 外接程序模型。 与VSTO外接程序和解决方案相比,Office外接程序占用的空间较小,您可以使用几乎任何Web编程技术(例如HTML5,JavaScript,CSS3和XML)来构建它们。

何时使用 VBA 及使用原因

考虑使用 Office 中的 VBA 编程功能有若干主要原因。

自动化和重复

当应用到用于设置格式或纠正问题的重复性解决方案时,VBA 非常高效。 举例来说,你是否曾经在 Word 中更改过每一页顶部的段落样式? 你是否曾经不得不对从 Excel 粘贴到 Word 文档或 Outlook 电子邮件中的多个表格重新设置格式? 你是否曾经必须对多个 Outlook 联系人进行相同的更改?

如果你有必须进行十多二十次的更改,则可能值得使用 VBA 来自动进行该更改。 如果是必须进行数百次的更改,那么当然值得考虑。 你可手动完成的几乎任何格式设置或编辑更改都可用 VBA 完成。

用户交互的扩展

有时,你希望鼓励或强迫用户以不属于标准应用程序的特定方式与 Office 应用程序或文档进行交互。 例如,你可能希望在用户打开、保存或打印文档时,提示他们执行一些特定操作。

Office 应用程序之间的交互

你是否需要将所有联系人从 Outlook 复制到 Word,然后以特定方式其进行格式设置? 或者,你是否需要将数据从 Excel 移到一组 PowerPoint 幻灯片? 有时,简单的复制和粘贴不能达到你的目的,或者速度太慢。 使用 VBA 编程同时与两个或更多 Office 应用程序的详细信息交互,然后根据一个应用程序中的内容修改另一个应用程序中的内容。

换另一种方式执行任务

VBA 编程是一种功能强大的解决方案,但并不总是最佳方法。 有时,有必要使用其他方式来实现你的目标。

关键问题是,是否有更简单的方法。 开始 VBA 工程之前,请考虑内置的工具和标准功能。 举例来说,如果你有非常耗时的编辑或布局任务,请考虑使用样式或加速键来解决问题。 你是否能执行一次任务,然后使用 CTRL+Y(重做)来重复操作? 你是否能使用正确的格式或模板创建新文档,然后将内容复制到该新文档中?

Office 应用程序功能强大;你需要的解决方案可能已经存在。 在开始编程之前,请花一些时间来详细了解 Office。

在开始 VBA 工程之前,请确保你有时间来使用 VBA。 编程需要专注,并且不可预测。 特别是作为初学者,除非你有时间来仔细认真地工作,否则绝不要转向编程。 如果迫在眉睫的最后期限可能会造成非常紧张的情况,请尝试编写“快速脚本”来解决问题。 如果你的时间很紧,则可能需要使用传统方法,即使这些方法单调又重复。

VBA 编程 101

通过代码使应用程序执行操作

你可能认为编写代码既神秘又困难,但是基本原则使用日常推理且完全可以访问。 Microsoft Office 应用程序以这样的方式创建:它们公开能够接收指令的事物(称为对象),这与将电话设计为包含按键以用于和电话交互的方式相同。 按下按键时,电话会识别指令,并按照拨号顺序包含对应的号码。 在编程时,你通过向应用程序中的各种对象发送指令与应用程序进行交互。 这些对象是可扩展的,但各有各的限制。 这些对象只能执行为其设计的操作,并且只能按照你的指令执行操作。

例如,假设用户在 Word 中打开一个文档,进行一些更改,保存文档,然后将其关闭。 在 VBA 编程领域,Word 会公开 Document 对象。 通过使用 VBA 代码,你可以指示 Document 对象执行诸如打开、保存或关闭等操作。

下面一节讨论如何组织和描述对象。

对象模型

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

对象的定义被称为类,因此,你可能看到这两个术语互换使用。 从技术上来讲,类是用于创建或实例化对象的说明或模板。

对象一旦存在,你就可以通过设置其属性和调用其方法来进行操控。 如果将对象视为一个名词,则属性是描述该名词的形容词,而方法是使该名词活动起来的动词。 更改某个属性将更改对象外观或行为的某些品质。 调用任一对象方法将导致对象执行某些操作。

本文中的 VBA 代码针对打开的 Office 应用程序运行,在该应用程序中,代码操控的许多对象已经打开并正在运行;例如,Application 本身、Excel 中的 Worksheet、Word 中的 Document、PowerPoint 中的 Presentation、Outlook 中的 Explorer 和 Folder 对象。 在了解对象模型的基本布局以及 Application 的一些关键属性(允许您访问当前状态)后,便可以开始使用 Office VBA 扩展和操控 Office 应用程序了。

方法

例如,在 Word 中,你可以通过使用 Application 对象的 ActiveDocument 属性更改属性,并调用当前 Word 文档的方法。 此 ActiveDocument 属性将返回对当前在 Word 应用程序中处于活动状态的 Document 对象的引用。 “返回引用”意思是“可以访问。”

下面的代码完全按照它所表达的含义运行;即,保存应用程序中的活动文档。

Application.ActiveDocument.Save

从左到右阅读代码,“在此应用程序中,使用 ActiveDocument 引用的文档调用 Save 方法。请注意, Save 是最简单的方法形式;它不需要你提供任何详细说明。 你指示 Document 对象执行 Save 指令,它不需要你输入更多的信息。

如果某个方法需要更多信息,则这些详细信息被称为参数。 下面的代码运行 SaveAs 方法,该方法需要文件的新名称。

Application.ActiveDocument.SaveAs ("New Document Name.docx")

方法名称后的括号中列出的值是参数。 此处,文件的新名称是 SaveAs 方法的参数。

属性

可以使用相同的语法来设置用于读取属性的属性。 下面的代码执行一种方法以选择 Excel 中的单元格 A1,然后设置属性以在该单元格中放置内容。

    Application.ActiveSheet.Range("A1").Select
    Application.Selection.Value = "Hello World"

VBA 编程的第一个挑战是了解每个 Office 应用程序的对象模型以及阅读对象、方法和属性语法。 对象模型在所有 Office 应用程序中都类似,但每个对象模型都特定于它所操控的文档和对象的种类。

代码段的第一行中有 Application 对象(这次是 Excel),然后是 ActiveSheet,它提供对活动工作表的访问。 之后是一个不太熟悉的术语 Range,这意味着“以这种方式定义单元格区域”。代码指示 Range 创建自身,仅使用 A1 作为其定义的单元格集。 也就是说,代码的第一行定义对象“Range”,并对其运行方法以选择它。 结果会自动存储在名为 SelectionApplication 的另一个属性中。

代码的第二行将 SelectionValue 属性设置为文本“Hello World”,并且该值出现在单元格 A1 中。

你编写的最简单的 VBA 代码可能只是获取对 Office 应用程序中你要处理的对象的访问权限并设置属性。 例如,你可以在 VBA 脚本中获取对 Word 中表中各行的访问权限并更改其格式。

这听起来简单,但可能非常有用;一旦编写了代码,你就可以利用编程的所有强大功能在多个表或文档中进行相同更改,或者依据某种逻辑或条件来进行更改。 对于计算机而言,进行 1000 项更改与进行 10 项更改并无不同,因此这里对于较大的文档和问题而言就有了规模效应,而这正是 VBA 能够真正出彩和节省时间的原因。

宏和 Visual Basic 编辑器

既然对 Office 应用程序公开其对象模型的方式有了一定了解,你可能会渴望尝试调用对象方法、设置对象属性,以及响应对象事件。 为此,你必须在 Office 可以理解的位置以 Office 可以理解的方式编写代码;通常使用 Visual Basic 编辑器进行。 尽管默认情况下已安装该编辑器,但在功能区上将其启用之前,许多用户都不知道有该编辑器。

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

启用“开发工具”选项卡

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

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

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

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

  5. 选择“确定”。

注意

在 Office 2007 中,显示“开发工具”选项卡的方法是选择 Office 按钮,选择“选项”,然后在“选项”对话框的“常用”类别中选中“在功能区显示‘开发工具’选项卡”复选框。

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

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

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

安全问题

为了保护 Office 用户免受病毒和危险宏代码的影响,你无法在使用标准文件扩展名的标准 Office 文档中保存宏代码, 而是必须将代码保存在带有特殊扩展名的文件中。 例如,你无法将宏保存在带有 .docx 扩展名的标准 Word 文档中;而是必须使用带有 .docm 扩展名的特殊 Word 启用宏的文档。

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

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

注意

某些 Office 应用程序(如 Outlook)默认情况下会将宏保存在你本地计算机上的主模板中。 虽然在运行自己的宏时,该策略会减少自己的计算机上的本地安全问题,但如果你要分发自己的宏,则需要部署策略。

录制宏

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

Word 和 Excel 中的“开发工具”选项卡上的另一个按钮是“录制宏”按钮,该按钮自动生成 VBA 代码,能够再现你在应用程序中执行的操作。 “录制宏”是可以用于详细了解 VBA 的理想工具。 阅读生成的代码可以让你深入了解 VBA,并在你作为用户需要了解的 Office 知识和作为程序员需要了解的 Office 知识之间架起一座稳定的桥梁。 唯一需要说明的一点是,生成的代码可能令人困惑,因为宏编辑器必须对你的意图进行一些假设,而这些假设不一定准确。

录制宏

  1. 将 Excel 打开为新的工作簿,并选择功能区中的“开发工具”选项卡。 选择“录制宏”并接受“录制宏”对话框中的所有默认设置,将“Macro1”作为宏名称,将“此工作簿”作为位置。

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

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

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

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

图 2. Visual Basic Editor 中的宏代码

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 忽略以单引号开头的任何行或行的一部分。 在代码中编写清除的相应注释非常重要,但该讨论是不在本文范围内。 本文后面对此代码的引用不包括这四个注释行。

在宏录制器生成代码时,它使用复杂的算法确定预期的方法和属性。 如果未能识别给定的属性,有许多可用的资源能够提供帮助。 例如,在已录制宏中,宏录制器生成了引用 FormulaR1C1 属性的代码。 不清楚上述内容的含义?

注意

请注意,Application 对象隐含在所有 VBA 宏中。 记录的代码适用于 Application。 每行的开头。

使用开发工具帮助

选择已录制宏中的“FormulaR1C1”,并按 F1。 帮助系统运行快速搜索,确定相应的主题位于 Excel 帮助的“Excel 开发工具”部分,并列出 FormulaR1C1 属性。 可以选择该链接了解有关该属性的详细信息,但在执行该操作前,请注意窗口底部附近的 Excel 对象模型参考链接。 选择该链接可查看 Excel 在其对象模型中用于描述工作表及其组件所使用的对象的长列表。

选择以上任一选项以查看适用于该特定对象的属性和方法,以及对于不同相关选项的交叉引用。 许多帮助项也有简短的代码示例,可以为你提供帮助。 例如,可以点击 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

提示

在处理代码时尽可能地使用复制和粘贴操作,以避免键入错误。

无需保存代码即可试用,因此请返回到 Excel 文档,选择 开发人员 选项卡上的 ,选择 宏 1,然后选择 运行。 单元格 A1 现在包含文本 Wow! 且其四周有双线边框。

图 3. 第一个宏的运行结果

第一个宏的运行结果

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

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

编程提示和技巧

从示例开始

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

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

处理较简单的问题

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

缺陷和调试

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

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

例如,在 VBA 中必须使用双引号将字符串值括起来。 若要了解改用单引号时会发生什么情况,请返回到 Visual Basic 编辑器,并将代码示例中的“Wow!”字符串替换为“Wow!” (即,单词 Wow 用单引号括起来)。 如果选择下一行,Visual Basic 编辑器会做出响应。 错误“编译错误:预期: 表达式”不是很有帮助,但是生成错误的行变为红色,告诉你该行中存在语法错误,因此,此程序将无法运行。

选择“确定”,然后将文本改回“Wow!”。

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

例如,打开 Visual Basic 编辑器,在宏中将 Value 属性名更改为 ValueX,故意引入运行时错误,因为 Range 对象没有名为 ValueX 的属性。 返回到 Excel 文档,打开“宏”对话框并再次运行 Macro1。 应看到一个 Visual Basic 消息框,其中解释了运行时错误,文本为“对象不支持此方法的此属性”。虽然该文本很清晰,但请选择 “调试” 以了解更多信息。

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

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

了解如何精心地使用调试器以获得更长、更复杂的程序是一个不错的主意。 至少,了解如何设置断点以在想要查看代码时停止执行、代码运行时如何添加监视点以查看不同变量和属性的值、以及如何逐行查看代码时。 这些选项在“调试”菜单中均有提供,认真的调试器用户通常会记住相应的键盘快捷方式。

恰当使用参考材料

若要打开内建于 Office 帮助的开发人员参考,请通过选择功能区中的问号或按 F1 打开任何 Office 应用程序中的帮助参考。 然后,在“搜索”按钮右侧,选择下拉箭头以筛选内容。 选择开发人员参考。 如果在左面板中没有看到目录,请选择小书图标将其打开,然后从中展开对象模型参考。

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

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

浏览对象模型参考所花费的时间将得到回报。 在你了解要使用的 Office 应用程序的 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 应用程序:示例代码

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

在 Outlook 中创建电子邮件

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

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

删除 Excel 工作表中的空行

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 i
End Sub

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

删除 PowerPoint 中的空文本框

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

支持和反馈

有关于 Office VBA 或本文档的疑问或反馈? 请参阅 Office VBA 支持和反馈,获取有关如何接收支持和提供反馈的指南。