Microsoft Excel是广泛用于数据处理和分析的工具,而VBA(Visual Basic for Applications)是一种基于Microsoft Visual Basic的编程语言,可用于在Excel中创建自定义宏和自动化任务,控制Excel工作簿、工作表和数据,执行各种操作。这篇博客将介绍如何使用VBA进行Excel宏编程,以提高工作效率和自动化重复任务。
Excel中主选项卡默认是没有开发工具选项的,需要选择主选项卡文件→选项→自定义功能区
,打开Excel中的开发工具面板:
这样,在Excel的主选项卡中就有开发工具选项了:
如,在Excel中显示消息框:
Sub 显示消息框()
MsgBox "欢迎使用VBA宏编程!"
End Sub
从开发者角度看,Excel VBA应用程序由工作表、用户窗体、模块和类模块等部分构成。
VBA 是运行在 Microsoft Office 软件之上,包括 Excel、Word、PPT、Outlook 等,可以用来编写非软件自带的功能的编程语言,不同的是每一个软件具有自己独有的对象,例如 Excel 有单元格对象,Word 有段落对象,PPT 有幻灯片对象。
Office 软件提供丰富的功能接口,VBA 可以调用它们,实现自定义的需求。基本上,能用鼠标和键盘能做的事情,VBA 都能做,它采用了与Windows相似的事件驱动编程方式。
在这种模式下,Windows监视窗口活动或事件信号,这些事件可以是用户鼠标点击或按键操作,也可以是程序控制或其他窗口的操作引发的。通过VBA的事件驱动机制,开发人员可以编写事件过程来处理系统产生的事件,实现特定的功能,如在鼠标点击时打开一个窗口。
与传统的过程化应用程序不同,事件驱动的应用程序中,代码执行路径不是按照预定顺序进行的。相反,代码在响应不同事件时执行不同的片段。这些事件可以由用户、操作系统、其他应用程序的消息触发,甚至是应用程序自身的消息触发。
由于事件顺序无法预测,代码必须对各种执行状态做出假设。为确保这些假设在执行时有效,应用程序的结构需要组织良好。在Excel中使用VBA开发应用程序实质上是编写处理各对象不同事件的代码。
简单的说,宏就是一段可以运行的 VBA 代码片段。Excel宏使用VBA语言进行编写,通过VBA编写的宏可控制Excel,对Excel的功能进行扩充。
Excel提供了两种创建宏的方法:一种方法是利用Excel操作环境中的宏录制器录制用户的操作;另一种方法是使用Visual Basic编辑器编写自己的宏代码。
利用宏录制器可记录用户在Excel中的操作动作,以便自动创建需要的宏,这在不太了解宏命令时是非常方便的。
使用Visual Basic编辑器可以打开已录制的宏,修改其中的命令,也可以在Visual Basic编辑器中直接输入命令创建宏。对于很多无法录制的命令(如创建新的窗体等),使用Visual Basic编辑器创建宏是唯一的方法。
启用录制宏的两种方式:
注:宏名不但可以包含字母、数字和下画线,还可以使用中文,但不能包含空格。但名称开头需为字母或下划线,且不能与已有宏重名。
注:在宏中定义的快捷键将覆盖任何对等的默认的Excel快捷键。
在创建宏之后,可以将宏分配给对象(如按钮、图形、控件和快捷键等),这样执行宏就像单击按钮或按快捷键一样简单。正是由于这种操作方便的特性,使用宏可以方便地扩展Excel的功能。如果不再需要使用宏,可以将其删除。
如果将录制的宏名称设置为“Auto_Open”,则每次打开包含此宏的工作簿时,该宏都会运行。另一种在打开工作簿时自动运行宏的方法是使用Visual Basic编辑器(VBE)在工作簿的Open事件中编写VBA过程。Open事件是一个内置的工作簿事件,它会在每次打开该工作簿时都运行自己的宏代码。如在用户打开工作簿时显示一个“欢迎”对话框,可新建一个模块,在其中输入以下代码:
Sub Auto_Open()
MsgBox ("欢迎使用Excel!")
End Sub
保存并关闭该文件,若提示不能保存,则选择“否”后,将文件保存为.xlsm类型即可。
再次打开该文件时,将会显示“欢迎使用Excel!”的对话框。
从Office软件支持宏开始,宏病毒也随之出现。许多病毒经过专门设计,可以利用VBA宏对系统和数据文件进行恶意操作。因此,宏的安全性越来越受到用户的重视。
按照如下步骤设置宏安全性:
VBA 中的注释以英文单引号 '
开头,后面接注释的内容。从单引号开始的部分不会被执行。
'我是一行注释
Excel单元格中可以保存处理多种类型的数据,包括数值、日期/时间、文本、货币等。VBA中除了提供这些数据类型之外,还提供字节、布尔和变体数据等类型。
常见的VBA基本数据类型如下表:
数据类型 | 含义 | 精度范围 |
---|---|---|
Byte | 字节型 | 0 ~ 255 |
Integer | 整型 | -32,768 ~ 32,767 |
Long | 长整型 | -2,147,483,648 ~ 2,147,483,647 |
String | 字符串 | 变长字符串:0 ~ 20亿(231)个字符 定长字符串:1~约64K(216)个字符 |
Single | 单精度浮点型 | 在表示负数时: -3.402823E38 ~ -1.401298E-45 在表示正数时: 1.401298E-45 ~ 3.402823E38 |
Double | 双精度浮点型 | 在表示负数时: -1.79769313486231E308 ~ -4.94065645841247E-324 在表示正数时: 4.94065645841247E-324 ~ 1.79769313486231E308 |
Decimal | 定点数 | 未放置定点数: +/- 79,228,162,514,264,337,593,543,950,335 放置定点数: +/- 7.9228162514264337593543950335 |
Currency | 货币型 | -922,337,203,685,477.5808 ~ 922,337,203,685,477.5807 |
Date | 日期型 | 时间:00:00:00 至 23:59:59 日期: 100-1-1 至 9999-12-31 |
Boolean | 逻辑值 | True 或 False |
Variant | 变体型 | 不限 |
Object | 对象型 | VBA 和 Excel 对象 |
枚举就是将变量的值逐一列举出来,属于该枚举型的变量只能取列举的某一个值。当一个变量只有几种可能的值时,可以定义为枚举类型(Enum)。
枚举型举例:
Public Enum WorkDays
星期日
星期一
星期二
星期三
星期四
星期五
星期六
End Enum
在VBA中,还可以使用Type语句定义自己的数据类型,其格式如下:
Type 数据类型名
数据类型元素名 As 数据类型
数据类型元素名 As 数据类型
...
End Type
注,自定义数据类型的定义必须放在模块(模块和类模块)的声明部分中。在使用记录类型之前,必须用Type语句进行定义。一般情况下,记录类型在模块中定义,其变量可以出现在工程的任何地方。
在进行Excel应用程序开发时,首先需要准确了解用户的需求,需求分析的目的是确定需要完成哪些工作。
需求分析阶段的主要任务如下:
在Excel中进行界面设计的方式主要有以下3种:
将用户界面设计好以后,接下来就需要编写界面中各部分的事件代码(如用户窗体中的按钮、功能区中的按钮等)。
在Excel中设计VBA应用程序时,界面设计和代码设计一般是交替进行的,即设计好一个界面后就编写相应的代码。有时也可先录制修改好宏代码,再和工作表或用户窗体中的按钮进行绑定。
在Windows应用程序中提供了在线电子文档的帮助系统,Excel也可以制作这种帮助系统。
对于小型应用系统,一般不提供帮助系统;但对于一个大型应用系统,提供一个好的帮助系统可让用户更快地理解系统,更快地熟悉系统的功能。
在创建了应用程序之后,必须对其进行测试,测试和调试应用程序所花费的时间可能与开发系统的时间同样多。
对于一个完成开发的应用程序,在设计测试数据时,应尽可能多地考虑到各种不同的情况:不但要使用正常的合乎逻辑的数据去测试应用程序的功能性,还应使用一些可能导致应用程序出错的数据去测试应用程序的健壮性。
在设计测试数据的同时应编写出测试数据的结果,并与应用程序进行实测时得到的数据进行对比,如果结果相同,则通过测试;否则,应检查并修改应用程序。
通过测试后的应用程序就可以发布给最终用户使用了。在发布时需要注意以下3个问题: