事件也称为自动化过程,它不需要人工调用。而且事件发生时代码也随之执行,可见对象的事件赋予了对象更灵活的一些特性,从而使应用更智能。

对象除了有方法外,还具有事件。属性是指对象的某些特征,而方法是指对这个对象执行某些操作,是一个动词,那么事件是什么呢?假设汽车是一个对象,那么汽车的大小、价格、体积、颜色是它的属性,而启动汽车这个动作则属于它的方法。当启动汽车时,则发生了启动事件,停止汽车时也会触发停止事件。我们可以在这些事件发生时让它自动执行某些操作,例如发动汽车时自动开始计算里程,也可以同时设置开启雨刮器这类操作;对于Excel VBA,打开工作簿这是一个事件,可以在这个事件发生时自动执行某些宏,还不是手动通过或快捷键或对话框去运行它;

具体到VBA中,工作簿对象WorkBook的名称、主题、路径、是否保存等是它的属性,而工作簿对象的开启、保存、新建、关闭等动作则属于它的方法,而关闭、保存、开启、新建等同时又是工作簿对象的事件。

我们可以为事件预置一些操作,当发生这些事件时,事件过程中的命令可以自动执行。如新建工作簿时预设页面打印的边距、页脚等;

简而言之,Excel VBA的事件就是可被VBA识别的某些操作,可以在这些操作发生时调用开发者指定的命令,从而完成工作需求。但是VBA并没有对所有对象都设置事件。

在VBA中,工作簿、工作表、窗体、控件、图表等等都支持事件,通过事件可以实现办公自动化。每个VBA爱好者都需要深入地理解事件的分类,及每个事件在引发条件、实现功能,从而提升工作效率。

事件在Excel中执行某个操作时引发预定义的动作。事件过程则是一个事件发生时所引发由用户编写的Sub过程。事件类型无法自定义,但事件发生后引发的动作却可以人为控制。

例如在工作表中有一个Change事件,它表示工作表任意单元格的值改变时所引有的事件,如果用户利用鼠标、键盘或者程序去试图修改工作表中任何单元格,那么就会引发名为Change的事件。用户无添加一个工作表本身没有的事件,如鼠标移过事件,却可以随意定制Change事件触的过程。

Excel支持上百种事件,如果需要进行分类通常按代码的存放位置和事件的级别来区分。表8-1中即7个类别的事件及其代码存放位置列表。

表8-1事件分类

事件级别代码存放位置引发对象

应用程序级 类模块 任何工作簿

工作簿级Thisworkbook 当前工作簿

工作表级工作表(Sheet1、Sheet2等等)当前工作表

图表级图表(Chart1、Chart2等等)当前图表

窗体级UserForm 当前窗体

ActiveX控件 工作表或者窗体中 当前控件

类模块 类模块 用户定义的对象

事件是区分层次的,不同层次的事件在执行顺序上有先后之别。

Excel的事件可以手工启用和禁用。

在VBA中,通过Application对象的EnableEvents属性来控制,将EnableEvents属性设置为True即启用事件,设为False即为禁用事件。完整的代码如下:

Application.EnableEvents=True Application.EnableEvents=False

通常在以下两种情况下需要禁用事件:临时关闭事件

防止事件进入死循环

事件代码的彔入方式

事件过程是一个非常特殊的Sub过程。它的代码可以手工逐字录入,但效率极差且出错机率高。

VBA为程序员提供了一个高效而准确录入代码的便捷方式——借用对象与过程下拉框自动产生事件代码外壳。

假设需要录入工作表级“Worksheet_FollowHyperlink”事件的代码,那么可以参照以下步骤:

(1)从工作表标签处右键单击工作表名称,从菜单中选择【查看代码】;

(2)在代码窗口顶中的“对象”下拉列表中选择“Worksheet”,此时代码窗口会产生以下代码:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

End Sub

因为“Worksheet_SelectionChange”事件是Excel工作表的默认事件,只要选择对象后它就会自动产对“Worksheet_SelectionChange”事件的外壳。此时忽略它,单击右边的“过程”下拉列表,其中罗列了所有工作表事件的过程。

(3)当选择“FollowHyperlink”过程名后,代码窗口将自动产生“Worksheet_FollowHyperlink”事件代码的外壳,此时再删除“Worksheet_SelectionChange”事件相关的代码即可。

此方式录入代码时准确度比手工录入代码会高很多,特别是有很多参数的事件过程代码。例如图像控件的鼠标移过事件:

Private Sub Image1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)

End Sub