Office 2010
35(共 38)对本文的评价是有帮助 评价此主题

摘要:向还不是程序员的 Excel 高级用户介绍 Excel 2010 中的 Visual Basic for Applications (VBA)。本文提供 VBA 语言概述、有关如何在 Excel 2010 中访问 VBA 的说明、面向实际 Excel VBA 编程问题的解决方案的详细说明以及有关编程和调试的提示。

社区成员图标 Ben Chinowsky,SDK Bridge

2009 年 11 月

适用范围:Microsoft Excel 2010

目录

为什么在 Excel 2010 中使用 VBA?

Microsoft Excel 2010 是一个功能相当强大的工具,您可以使用它操作、分析和显示数据。不过有时候,尽管标准 Excel 用户界面 (UI) 中提供了丰富的功能集,但您可能仍想要找到一种更简便的方法来执行繁琐的重复任务,或执行某个 UI 似乎无法解决的任务。幸运的是,像 Excel 这样的 Office 应用程序提供了 Visual Basic for Applications (VBA)。这是一种编程语言,您可以通过它来扩展这些应用程序。

VBA 是通过运行(在 Visual Basic 中编写的分步过程)来工作的。学习编程可能看起来很困难,但只要多些耐心,多学习像本文中介绍的示例,许多用户会发现,甚至只需学会少量 VBA 代码,就会使工作变得更加简单,而且可以在 Office 中完成他们以前认为不可能做到的事情。一旦学会了一些 VBA,便可以更加轻松地掌握更多的 VBA,因此,这种可能性是无限的。

迄今为止,在 Excel 中使用 VBA 最常见的原因就是自动完成重复的工作。例如,假定您有好几十个工作簿,每个工作簿都包含好几十个工作表,这些工作表都需要进行更改。这些更改既可能很简单,例如对固定的单元格范围应用新格式;也可能很复杂,例如,查看每个工作表中的数据的统计特征,再选择最恰当的图表类型来显示数据和这些特征,然后创建图表并设置相应格式。

对于上述任一种情况,您都可能不愿意手动执行这些任务,最多也就愿意重复执行几次。您可以改为使用 VBA 来编写要 Excel 执行的显式指令,从而自动完成这些任务。

VBA 不仅仅可用于重复任务。您还可以使用 VBA 构建 Excel 的新功能(例如,您可以开发新算法来分析数据,然后使用 Excel 中的图表功能显示结果),也可以执行将 Excel 与其他 Office 应用程序(如 Microsoft Access 2010)集成的任务。事实上,在所有 Office 应用程序中,Excel 最常用作一个类似于常规开发平台的工具。除了所有涉及列表和会计的显而易见的任务之外,从数据可视化到软件原型制作的大量任务中,开发人员都可使用 Excel。

尽管有这么多原因要在 Excel 2010 中使用 VBA,但一定要记住,解决问题的最佳方案可能是根本就不涉及 VBA。即使没有 VBA,Excel 仍然提供了大量的功能,就连高级用户也不可能完全熟悉这些功能。在决定采用 VBA 解决方案之前,请全面搜索“帮助”和联机资源以确定没有更简单的方法。

VBA 编程 101

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

您可能认为编写代码是一项神秘而又复杂的工作,但基本原则是使用日常推理,并且很容易掌握。Office 2010 应用程序的创建方式公开了一些名为对象 的内容,这些对象可以接收指令。通过向应用程序中的各种对象发送指令,可与应用程序进行交互。这些对象数量众多、类型各异而且使用灵活,但是它们也有局限性。这些对象只能执行为其设计的操作,并且只按照您的指令执行操作。

对象

在应用程序的名为对象模型 的层次结构中,编程对象彼此之间有系统地相互关联。对象模型会大致反映您在用户界面中看见的内容;例如,Excel 对象模型包含 ApplicationWorkbookSheet 和 Chart 对象以及其他很多对象。对象模型是应用程序及其功能的概念图。

属性和方法

可通过设置对象的属性 和调用对象的方法 来操作对象。设置属性可更改对象的某些性质。调用方法可使对象执行某个操作。例如,Workbook 对象具有一个用于关闭工作簿的 Close 方法和一个用于表示工作簿中当前活动的工作表的 ActiveSheet 属性。

集合

许多对象有单复数之分,例如 Workbook 和 Workbooks;Worksheet 和 Worksheets,等等。对象的复数形式称作集合。集合对象用于对集合中的多个项执行一个操作。本文稍后将介绍如何使用 Worksheets 集合来更改工作簿中每个工作表的名称。

宏和 Visual Basic 编辑器

现在,您已对 Microsoft Excel 2010 如何公开其对象模型的方式有所了解,接下来可以尝试调用对象方法并设置对象属性。为此,您必须在一个位置以 Office 可以理解的方法编写代码;通常使用是 Visual Basic 编辑器。尽管默认情况下会安装该编辑器,但在功能区中启用该编辑器之前,许多用户都不知道该编辑器的存在。

“开发工具”选项卡

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

启用“开发工具”选项卡

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

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

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

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

  5. 单击“确定”

在 Excel 显示“开发工具”选项卡之后,注意选项卡上“Visual Basic”、“宏”和“宏安全性”按钮的位置。



图 1. Excel 2010 中的“开发工具”选项卡

Excel 2010 中的开发人员选项卡

安全问题

单击“宏安全性”按钮可以指定哪些宏可以运行并需满足哪些条件。尽管未授权宏代码可能会严重损害计算机,但阻止您运行有帮助的宏的安全条件会严重妨碍您的工作效率。宏安全性是一个复杂而又涉及广泛的话题,您应研究并了解是否应使用 Excel 宏。

在本文中,请注意,如果当您打开一个包含宏的工作簿时,在功能区和工作表之间出现“安全警告: 宏已被禁用”条,则可单击“启用内容”按钮来启用宏。

此外,作为一种安全措施,您不能以默认的 Excel 文件格式 (.xlsx) 保存宏;而必须将宏保存在具有一个特殊扩展名 .xlsm 的文件中。

Visual Basic 编辑器

以下过程演示如何创建一个储存宏的新的空白工作簿。然后,可以按 .xlsm 格式保存该工作簿。

创建一个新的空白工作簿

  1. 单击“开发工具”选项卡上的“宏”按钮。

  2. 在随后出现的“宏”对话框中,在“宏名称”下键入 Hello

  3. 单击“创建”按钮打开 Visual Basic 编辑器,其中包含已键入的新宏的大纲。

VBA 是一种功能齐全的编程语言,并具有一个相应的功能齐全的编程环境。本文只介绍那些您刚开始编程所使用的工具,而不介绍 Visual Basic 编辑器中的大部分工具。出于这个原因,请关闭 Visual Basic 编辑器左侧的“属性”窗口,并忽略在代码上方显示的两个下拉列表。



图 2. Visual Basic 编辑器

Visual Basic Editor

Visual Basic 编辑器包含下列代码。

Sub Hello()  End Sub 

Sub 代表子例程,现在可将它定义为“宏”。运行 Hello 宏将运行 Sub Hello() 与 End Sub 之间的任何代码。

现在,请编辑宏,使其类似于以下代码。

Sub Hello()    MsgBox ("Hello, world!") End Sub 

返回到 Excel 中的“开发工具”选项卡,再次单击“宏”按钮。

在随后出现的列表中选择“Hello”宏,然后单击“运行”显示包含文本“Hello, world!”的小型消息框。

您刚才在 Excel 中创建并实现了自定义 VBA 代码。在消息框中单击“确定”关闭消息框并完成宏的运行。

如果未出现消息框,请检查宏安全性设置并重新启动 Excel。

使宏可供访问

还可以从“视图”选项卡访问“宏”对话框。但是,如果您频繁使用某个宏,则使用一个快捷方式或“快速访问工具栏”按钮来访问它可能会更方便。

若要在“快速访问工具栏”中为“Hello”宏创建一个按钮,请使用以下过程。

以下过程描述了如何在“快速访问工具栏”上为宏创建按钮:

在“快速访问工具栏”中为宏创建按钮

  1. 单击“文件”选项卡。

  2. 单击“选项”打开“Excel 选项”对话框,然后单击“快速访问工具栏”

  3. 在“从下列位置选择命令:”下的列表中,选择“宏”。在随后出现的列表中查找类似于“Book1!Hello”的文本,并选择该文本。

  4. 单击“添加 >>”按钮将宏添加到右侧的列表中,然后单击“修改…”按钮选择与该宏关联的按钮图像。

  5. 单击“确定”。现在,您应在“快速访问工具栏”中的“文件”选项卡上方看到新按钮。

现在,您不必使用“开发工具”选项卡,便可随时快速运行宏,赶快试试吧。

一个实际示例

假定您有一个工作簿,其中的大量工作表上都包含列表,您需要更改每个工作表的名称,以与工作表上的列表标题相匹配。并不是每个工作表上都包含列表,但是如果包含列表,则标题在单元格 B1 中,如果不包含列表,则单元格 B1 为空白。不包含列表的工作表名称应原样保留。

通常,这可能是一个涉及以下操作的很复杂的任务:查看每一个工作表是否包含列表,如果包含列表,则复制列表名称,单击工作表标签,然后贴入新名称。可使用 Excel VBA 自动重新命名工作表,而不必手动执行所有上述步骤。

了解对象

若要解决 VBA 编程问题,首先必须搞清楚代码将操作哪些对象。可用来研究此信息的一个基本工具是 Excel 对象模型参考,它是 Microsoft Developer Network (MSDN) 上的 Excel 2007 开发人员参考的一部分。

在 Excel 2010 公开发布之后,这些参考材料将会针对 Excel 2010 进行更新,但 Excel 2007 开发人员参考可适用于大部分 Excel 2010 用途。



图 3. MSDN 上的 Excel 对象模型参考

MSDN 上的 Excel 对象模型引用

第一步是搞清楚如何操作您完成任务需要使用的特定对象;例如,工作表、工作表名称、单元格和单元格内容。在 Excel 中,至少有两种方法可以解决此问题:

  • 直接查看对象模型参考。

  • 录制一些您需要自动执行的操作,查看已录制的代码是如何操作对象的,然后查看对象模型参考以获取更多信息。

根据首选方法的不同,选项也不同,但是现在,首先请尝试使用录制宏。

使用录制宏

有时,一个简单的录制宏就可以满足您的全部需要;在这种情况下,您甚至不必查看代码。更为常见的情况是,只录制是不够的,它只是后续过程的一个起点。

将录制宏用作解决方案的起点

  1. 录制您需要编码的操作。

  2. 查看代码,并找到执行这些操作的行。

  3. 删除代码的剩余部分。

  4. 修改录制的代码。

  5. 添加录制宏无法录制的变量、控制结构和其他代码。

通过录制一个将工作表重新命名为 New Name 的宏来开始研究代码。然后可使用录制的宏开发您自己的宏,使它可以基于工作表的内容重新命名多个工作表。

录制可重命名工作表的宏

  1. 在“开发工具”选项卡上,单击“录制宏”

  2. 将该宏命名为 RenameWorksheets,将 Sheet1 重命名为 New Name,然后单击“停止录制”

  3. 转到“开发工具”或“视图”选项卡,单击“宏”按钮,选择“编辑”以打开 Visual Basic 编辑器。

Visual Basic 编辑器看起来应像下面这样。

Sub RenameWorksheets() ' ' RenameWorksheets Macro ' '     Sheets("Sheet1").Select     Sheets("Sheet1").Name = "New Name" End Sub 

Sub 行后面的前四行为注释。任何以撇号开始的行均为注释,对宏执行的操作没有任何影响。注释的主要作用是:

  • 使代码更加便于理解,不仅方便您,而且还方便其他以后可能需要修改此代码的任何人。

  • 暂时禁用代码行(称作将代码注释掉)。 

此录制的宏中的四个注释没有起到上述的任何一个作用,因此删除它们。

接下来的行使用 Select 方法选择 Sheets 集合对象的 Sheet1 成员。在 VBA 代码中,在操作对象之前通常并不需要选择对象,即使录制宏执行了此操作,也同样如此。换句话说,此行代码是多余的,因此也可删除它。

录制的宏的最后一行修改 Sheets 集合的 Sheet1 成员的 Name 属性。这是要保留的行。

在经过更改后,现在录制的代码看起来应像下面这样。

Sub RenameWorksheets()     Sheets("Sheet1").Name = "New Name" End Sub 

手动将名为“New Name”的工作表改回为“Sheet1”,然后运行该宏。此名称应更改回“New Name”。

修改录制的代码

现在来研究录制宏使用的 Sheets 集合。对象模型参考中的“工作表”主题包括类似下面这样的文本。

Sheets 集合可能包含 Chart 或 Worksheet 对象。如果您需要使用只包含一种类型的工作表,请查看该工作表类型的对象主题。”

您现在只使用 Worksheets,因此将代码更改为下面这样。

Sub RenameWorksheets()     Worksheets("Sheet1").Name = "New Name" End Sub 

循环

此时的代码有一个限制,即,它只能对一个工作表进行更改。您可以为需要重命名的每个工作表添加对应的行,但是,如果您不知道有多少个这样的工作表,或者不知道这些工作表的当前名称是什么,怎么办?您需要一种方法对工作簿中的每一个 工作表应用某个规则。

VBA 具有一个理想的称为“For Each”循环的构造。For Each 循环可检查集合对象(例如 Worksheets)中的每一项,还可用于对这些项中的部分或全部执行一个操作(如更改名称)。

有关 For Each 循环的更多信息,请参阅 VBA 语言参考。单击“Visual Basic Conceptual Topics”(Visual Basic 概念性主题),再单击“Using For Each...Next Statements”(使用 For Each...Next 语句)。请注意,VBA 语言参考与对象模型参考一样,可以让您做到事半功倍,这是一个当您使用代码遇到困难时寻找解决方法的好地方。

使用“Using For Each...Next Statements”(使用 For Each...Next 语句)主题中的第三个示例,编辑该宏,以便它看起来类似于下面的代码。

Sub RenameWorksheets() For Each myWorksheet In Worksheets     myWorksheet.Name = "New Name" Next End Sub 

myWorksheet 是一个变量;也就是说,它表示的内容会发生变化。在这种情况下,myWorksheet 变量相继表示Worksheets 集合中的每一个工作表。您不一定要使用 myWorksheet;可以使用“x”、“ws”、“WorksheetToRenameAfterTheContentsOfCellB1”或者您想要使用的几乎任何名称(具有一些限制)。一个很好的准则就是,使用的变量名称的长度足以提醒您变量代表的内容,但也不要太长以致造成代码混乱不堪。

如果此时运行该宏,它会发生错误,因为 Excel 要求工作簿中的每一个工作表具有唯一名称,但下一行代码指示 Excel 为每个工作表赋予相同的名称。

    myWorksheet.Name = "New Name" 

若要更正此行以便您可以确认 For Each 循环能正常运行,应将此行做如下更改。

    myWorksheet.Name = myWorksheet.Name & "-changed" 

此行会将每个工作表的当前名称 (myWorksheet.Name) 更改为在当前名称后面追加“-changed”,而不是尝试为每个工作表赋予相同的名称。

有用的重命名

现在,该宏正在接近于实际解决手头的问题。现在您需要一种方法来从工作表本身获取信息,具体而言,就是从每个工作表的 B1 单元格获取信息,然后将获取信息放入到工作表名称中。

这一次,不再使用录制宏来搞清楚如何引用某个单元格,猜猜看,使用 Cell 对象是否可行。这个想法很好,不过,如果您打开对象模型参考并搜索 Cell 对象,就会发现根本没有 Cell 对象!但是有一个 CellFormat 对象(该链接可能指向英文页面)

CellFormat 对象主题在第一个代码示例中包括下面的代码。

    ' Set the interior of cell A1 to yellow.     Range("A1").Select 

此代码表明,您使用 Range 指定单元格区域或仅指定一个单元格。同样,您不需要 .Select 部分,但需要搞清楚如何引用 Range 对象的内容(与 Range 对象本身相对)。如果您查看 Range 对象主题,则会了解到Range 同时具有 Methods 和 PropertiesRange 的内容是一个事物,而不是一个操作,因此,它很可能是一个 Property。如果向下翻看列表,则会看到 Value 属性。因此,请尝试以下代码。

Sub RenameWorksheets() For Each myWorksheet In Worksheets     myWorksheet.Name = myWorksheet.Range("B1").Value Next End Sub 

如果您对包含 B1 为空的工作表的工作簿运行此代码,则会发生错误,因为空的 Range 具有一个 "" 值(一个空文本字符串),这不是合法的工作表名称。现在差不多该创建一些示例数据了。在工作簿中创建三个与下图类似的工作表,然后运行该宏。



图 4. RenameWorksheets 宏的示例数据

用于 RenameWorksheets 宏的简单数据

 

用于 RenameWorksheets 宏的简单数据

 

用于 RenameWorksheets 宏的简单数据

 

工作表名称应会相应地进行更改。

检查空单元格

如上文所述,工作簿中任何 B1 单元格为空,则该宏会失败。不用手动检查每个工作表,可对该宏进行编码来执行此操作。在 myWorksheet.Name 行之前添加下面的代码行。

If myWorksheet.Range("B1").Value <> "" Then 

并且在 myWorksheet.Name 行之后添加下面的文本。

End If 

这称作“If…Then”语句。If…Then 语句指示 Excel:只要满足 If 行中的条件,就执行 If 行和 End If 行之间的行上的任何操作。此示例中,下面的行指定要满足的条件。

myWorksheet.Range("B1").Value <> "" 

<> 表示“不等于”,而中间没有任何内容的双引号表示一个空文本字符串;也就是说,无任何文本。因此,只有在 B1 单元格中的值不等于空(即,B1 单元格中有文本)时,才会执行 If 和 End If 之间的任何代码行。

有关 If…Then 语句的更多信息,请参阅 VBA 语言参考。(全称为“If…Then…Else 语句”,其中 Else 是可选组件。)

变量声明

应对该宏所做的另一个改进是在该宏的开头放置一个 myWorksheet 变量声明。

Dim myWorksheet As Worksheet 

Dim 是“Dimension”的简写,Worksheet 是此特定变量的类型。此语句告诉 VBA myWorksheet 表示的实体类型。注意,当您键入 As 之后,Visual Basic 编辑器会显示一个弹出列表,其中列出了所有可用的变量类型。这是 IntelliSense 技术的一个示例;即,Visual Basic 编辑器会对它确定您尝试要执行的操作做出响应,并提供适用选项的列表。您可以从列表中选择一个选项,或者继续键入。

尽管 VBA 中并不要求变量声明,但还是强烈推荐使用!通过变量声明,可以更容易地跟踪您的变量以及代码中的错误。此外需注意,如果您声明一个带有对象类型(如 Worksheet)的变量,而且您稍后在该宏中使用该对象变量,则 IntelliSense 会显示与该对象相关的属性和方法的适当列表。

注释

现在该宏已经很复杂,可以包含一些注释来提醒您代码执行的操作。使用的注释数量部分地取决于个人风格,但通常而言,注释多比注释少好。随着时间的推移,通常需要修改和更新代码。如果没有注释,则可能很难理解代码的意图,尤其是在修改代码的人不是当初编写代码的人的情况下。为 If 条件和重命名工作表的行添加注释,得到的代码应如下所示。

Sub RenameWorksheets() Dim myWorksheet As Worksheet For Each myWorksheet In Worksheets     'make sure that cell B1 is not empty     If myWorksheet.Range("B1").Value <> "" Then         'rename the worksheet to the contents of cell B1         myWorksheet.Name = myWorksheet.Range("B1").Value     End If Next End Sub 

为了测试该宏,将工作表重命名回 Sheet1Sheet2 和 Sheet3,在一个或多个工作表中删除单元格 B1 的内容。运行该宏,验证它是否重命名单元格 B1 中有文本的工作表,并且保留其他工作表的名称不变。该宏适用于任何数量的、混合了已填充的 B1 单元格与空的 B1 单元格的工作表。

可以使用 VBA 完成的更多任务

本节介绍在 Excel 2010 中可以使用 VBA 完成的更多任务。本节中的示例旨在让您了解 VBA 的功能,而不是重点介绍特定的实际应用场景。您可能会发现,在演练这些示例时,在对象模型参考中查看每一步操作中的对象的信息会很有用。

乐于学习的态度的重要性

学习一般的编程(具体为 Excel VBA)的一个好方法就是采用一种策略,尝试新的内容,努力搞懂它,然后问自己一些问题,例如:

  • 接下来我可以尝试点什么?

  • 如果我想要使用 VBA,我首先要学习什么?

  • 有哪些我想知道的好玩或有趣的内容?

  • 我对哪些内容感到好奇?

强烈建议读者探索通向开启知识大门的道路。

图表

Excel 中的一个常见任务是基于一个单元格区域创建图表。创建一个名为 AssortedTasks 的新宏,然后在 Visual Basic 编辑器中键入以下文本。

Dim myChart As ChartObject 

添加一行以创建图表对象,并将 myChart 变量分配给它。

Set myChart = ActiveSheet.ChartObjects.Add(100, 50, 200, 200) 

括号中的数字决定图表的位置和大小。前两个数字是图表左上角的坐标,后面的两个数字是宽度和高度。

新建一个空的工作表,并运行该宏。该宏创建的图表中没有数据,因此没有用。删除您刚刚创建的图表,将以下几行添加到该宏的末尾。

With myChart     .Chart.SetSourceData Source:=Selection End With 

这是 VBA 编程中的一个常用模式。首先,创建一个对象,将其分配给一个变量,然后使用 With…End With 构造来对该对象执行操作。示例代码指示图表使用当前选择内容作为其数据。(Selection 是 SetSourceData 方法的 Source 参数的值,而不是某个对象属性的值,因此,VBA 语法要求您使用冒号和等于号 (:=) 替代一个等于号 (=) 来赋值。)

在单元格 A1:A5 中键入一些数字,选择这些单元格,然后运行该宏。图表将按默认类型(条形图)显示。



图 5. 使用 VBA 创建的条形图

使用 VBA 创建的条形图

如果您不喜欢条形图,则可以使用与下面类似的代码,将条形图更改为某种其他类型的图表。

With myChart     .Chart.SetSourceData Source:=Selection     .Chart.ChartType = xlPie End With 

xlPie 是内置常数(也称为“枚举常数”)的一个示例。Excel 中有很多这样的常数,并且这些常数已经被详尽地记录下来。有关内置常数的更多信息,请参阅对象模型参考的“Enumerations”(枚举)部分。例如,图表类型的常数将会在“XlChartType Enumeration”(XlChartType 枚举)下列出。

您可以修改数据。例如,尝试将此行添加到变量声明的后面。

Application.ActiveSheet.Range("a4").Value = 8 

可以从用户获取输入,并使用该输入修改数据。

myInput = InputBox("Please type a number:") Application.ActiveSheet.Range("a5").Value = myInput 

最后,将下面的行添加到该宏的末尾。

ActiveWorkbook.Save ActiveWorkbook.Close 

现在,完整的宏看起来应像下面这样。

Sub AssortedTasks() Dim myChart As ChartObject Application.ActiveSheet.Range("a4").Value = 8 myInput = InputBox("Please type a number:") Application.ActiveSheet.Range("a5").Value = myInput Set myChart = ActiveSheet.ChartObjects.Add(100, 50, 200, 200) With myChart     .Chart.SetSourceData Source:=Selection     .Chart.ChartType = xlPie End With ActiveWorkbook.Save ActiveWorkbook.Close End Sub 

验证单元格 A1:A5 是否仍然为选中状态,运行该宏,在输入框中键入一个数字,然后单击“确定”。此代码将保存并关闭工作簿。重新打开工作簿,并注意对饼图的更改。

用户窗体

前一节演示了如何使用一个简单的输入框获取用户的输入。除了显示信息的相应消息框之外,VBA 还提供了大量功能,以便您可以用来创建自定义对话框,对直接放置在工作表上的控件进行编码,或者操作 Excel 中内置的对话框。有关这些功能的更多信息,请参阅 Excel 2007 开发人员参考中的控件、对话框和窗体

本节快速介绍一下用户窗体,至此便完成对 Excel VBA 的简单介绍。

在“开发工具”选项卡上,单击“Visual Basic”按钮以打开 Visual Basic 编辑器,然后转到“插入”菜单,选择“用户窗体”以打开“用户窗体设计视图”

您将看见两个窗口。一个窗口表示您创建的用户窗体,另一个窗口就是“工具箱”,其中显示您可以添加到用户窗体中的各种控件。例如,命令按钮、选项按钮、复选框等等。可将鼠标移动到“工具箱”控件的上方,查看它创建的是哪种控件。

创建一个非常简单的用户窗体,其中包含一个可运行本文前面所述的 Hello 宏的按钮。在“工具箱”中,按下CommandButton 控件,然后将其拖动到用户窗体来创建一个命令按钮。右键单击该命令按钮,选择“查看代码”

您看到的 Sub 是一个事件过程 的主干。在发生特定事件时将会运行事件过程。在此例中,正如 Sub 的名称所示,运行代码的事件为 CommandButton1 上的 Click。将下面一行添加到事件过程中。

Run("Hello") 

现在 Visual Basic 编辑器应看起来像下面这样。



图 6. CommandButton1_Click 事件过程

CommandButton1_Click 事件过程

保存工作簿,转到“窗口”菜单,选择“UserForm1 (用户窗体)”,以重新显示用户窗体。单击工具栏上的绿色箭头运行用户窗体。在对话框出现后,单击命令按钮以运行 Hello 宏,这将显示“Hello, world!”消息框。关闭该消息框以返回到正在运行的用户窗体,然后关闭正在运行的用户窗体以返回到“设计视图”

下一步做什么?

您可能会发现,通过结合一些试验并仔细阅读对象模型参考和 VBA 语言参考,您可以从本文中获得足够的信息来帮助完成任何激励您开始学习 VBA 的任务。如果是这样的话,则太好了!如果不是这样,下一步最好是更多地大致了解 VBA。

学习更多有关 VBA 的知识的一种方法就是研究实用代码。除了对象模型参考和 VBA 语言参考中的示例之外,各种联机源中提供了大量的 Excel VBA 代码,包括 MSDN 上的文章、由专门研究 Excel 的 Microsoft 最有价值专家 (MVP) 维护的网站以及您可以通过快速 Web 搜索找到的其他内容。

这些资源中的代码可帮助您解决当前的编码问题,还可以帮助您为可能尚未考虑过的项目提供灵感。

如果您更愿意系统地学习 VBA,则可以阅读有关 VBA 的几本好书,网上有一些关于这几本书的不错的评论,可帮助您选择最适合自己的学习风格的书。

其他资源