第X课EXCEL基本事件
1 什么是事件
事件是一个对象可以辨认的动作,像单击鼠标或者按下某个键等等,并且可以编写某些代码针对此动作做出响应。用户做动作或者程序代码的结果都可能导致事件的发生。在VBA中,可以激发事件的用户动作包括:切换工作表、选择单元格和单击鼠标等几十种。事件发生时,将执行包含事件过程中的代码。若用户没有定义某事件所调用的过程,那么当发生该事件时,就不会产生任何反应。
2 Excel中事件的分类
Excel提供了非常多的事件,主要可以分为以下几类:
(1)工作簿事件
工作簿事件发生在特定的工作簿中,如Open(打开工作簿)、BeforeClose(关闭工作簿之前)和SheetActive(激活任何一张表)等。工作簿事件的代码必须在Thiswork对象代码模块中编写。
(2)工作表事件
工作表事件发生在特定的工作表中,如activate(激活工作表)、change(更改工作表中的单元格)和SelectionChange(工作表上的选定区域发生改变)等。工作表事件的代码必须在对应工作表的代码模块中编写。 (3)窗体、控件事件
新建的用户窗体及窗体上的控件可以响应很多事件,如Click(单击)、Change(控件内容更改)等,这类事件的代码必须编在相应的用户窗体代码模块中。 图表事件
图表事件针对某个特殊的图表产生,例如Slect(选中了图表中的某个对象)和SeriesChange(改变了系列中某个数据点的值)。 不与对象关联的事件
这类事件只有两个,分别是Online和Okey,根据时间和按钮来产生这两个事件。
3 工作薄事件
当工作薄更改,工作薄中任何工作表更改,加载宏更改或数据透视表更改时,都将引发工作薄事件。若要查看工作薄事件,可以双击“工程资源管理器”(excel工作环境下按组合键“Alt+F11”打开)窗口中的“ThisWorkBook”对象,打开“代码编辑器”窗口,在“过程”下拉列表框中选择事件名称。Excel中的工作薄事件很多,下面选用几个常用事件进行简单介绍,读者若用到其他工作薄事件可查阅相关文献和excel帮助文件。 (1)Open事件
打开工作薄时,将产生此事件。Workbook_Open事件只在工作薄打开时产生,在下一次打开之前不再发生此事件。此事件中可以写入一些只需执行一次的代码,比如如果需要在每次打开文件时在“Shee1”工作表的A列中记录文件打开时间,则应该使用此事件,代码如下:
Private Sub Workbook_Open()
Worksheets(\alue=VBA.now End Sub
对系统设置进行修改的代码不应编写在这个事件中,应写入Workbook_Activate事件中,orkbook_Activate事件紧随在Workbook_Open事件后面发生。
(2)BeforeClose事件
在关闭工作薄之前,先产生此事件。若该工作薄已经更改过,则本事件在询问用户是否保存更改之前产生,其事件处理代码格式如下:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
当事件产生时,参数Cancel为False。如果该事件将Cancel设为True,则停止对工作薄的关闭操作,工作薄仍处于打开状态。 一般情况下,只应在事件中加上以下功能,而不应将系统的设置或者恢复代码放在此处。 不显示是否保存修改对话框而保存保存工作薄的任何修改并放弃保存工作薄的任何修改,直接退出时代码如下:
Private Sub Workbook_BeforeClose(Cancel As Boolean) Me.saved=True
在程序中设置标志变量,控制用户直接按窗口上的“关闭”按钮退出系统,只有通过代码设置标志变量为对应值才允许退出系统,具体代码如下: Private Sub Workbook_BeforeClose(Cancel As Boolean) If bFlag=False Then Cancle=Ture (2)Activate事件
激活一个工作薄时产生该事件。所谓激活工作薄包括以下两种情况:
工作薄打开时,在Open事件之后发生该事件;从另一工作薄切换到本工作薄时发生该事件;工作簿的Open事件可能被用户跳过,所以应该将系统设置的初始代码放在Activate事件中。下例通过工作薄的Activate事件完成调用自定义菜单、隐藏工具栏等设置,其代码如下:
Private Sub Workbook_Activate()
Application.ScreenUpdating=False Application.Cursor=xlDefault
Application.Caption=\学生成绩管理系统\
Application.Caption=\
Application.Commandbars(\Application.Commandbars(\Application.Commandbars(\Application.DisplayFormulabar = False Application.DisplayStatusBar = Ture
ActiveWindow.DisplayWorkbookTabs = False HideBar
MyBar_Menu
Sheets(\主界面\Sheets(\主界面\Application.ScreenUpdating = True End Sub (2) NewSheet事件
在工作薄中新建工作表时产生此事件,其事件处理代码格式如下: Private Sub Workbook_Newsheet(ByVal Sh As Object)
例如,在Excel中新建工作表时默认取名为Sheet后面加上一个数字,使用以下代码可以为新建的工作表生成中文名称。
Private Sub Workbook_Newsheet(ByVal Sh As Object)
n=Workheets.Count
If TypeName(Sh)=\ Sh.Name=\工作表\&n
End If End sub
程序通过Worksheets.Count获取当前工作的数量,然后判断新建表的类型。如果是工作表,则对新建的工作表进行命名。 (2)BeforeSave事件
保存工作薄之前产生此事件,其事件处理代码格式如下:
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean,Cancle As Boolean)
事件过程中有两个参数,如果显示“另存为”对话框,则参数SaveAsUi为True。参数cancel的值当事件产生时为False,如果该事件过程将本参数设为True,则该过程执行结束之后不保存工作薄。针对该事件的两个参数,该事件一般可以完成以下功能: ● 禁止文件保存,但可以对原文件的修改进行保存;
● 禁止保存修改,使保存与另存为功能都失效。
例如,以下代码在保存工作薄之前询问用户是否保存文件。在保存工作薄之前产生此事件,那么只要在该事件中写入一行代码就可以完全禁止文件被保存,而且连另存为对话框也
不显示。
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean,Cancle As Boolean)
If SaveAsUI=True Then Cancel=True '禁止另存为 End sub
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean,Cancle As Boolean)
Cancel=True '禁止保存修改 End sub
在禁止保存修改时应配合在BeforeClose事件中写入代码才能达到完美效果。 Private Sub Workbook_BeforeClose(Cancle As Boolean) Me Saved=True End sub
4 工作表事件
在Excel应用程序中,要控制用户在工作表中的操作,就需要为工作表事件编写代码。工作表事件是开发Excel应用程序时应用最多的。若要查看工作表的事件过程,可双击“工程资源管理器”窗口中的一个工作表对象(例如“Sheet1”),打开“代码编辑器”窗口,在“过程”下拉列表框内选择事件名称。Excel中的工作表事件如表1所示:
表 1 Excel中的工作表事件及其激发时间
事件 Activate
激发时间 激发工作表时
BeforreDoubleClick
双击工作表前
BeforreRightClick
在工作表上单击右键时
Calculate
对工作表重新进行计算之后
Change
更改工作表中的单元格活外部链接引起单元格变化时
工作表从活动状态转为非活动状态时
Deactivate
FollowHyperlink
单击工作表上的任意超链接时
PivotTableUpdate
在工作薄中数据透视表更新之后
SelectionChange
工作表上的选定区域发生改变时
工作表事件发生在工作表被激活、用户修改,以及更新工作表上的单元格或数据透视表时。例如,以下代码将在工作表重新计算后将A列到H列的大小调整到合适状态。 Private Sub Worksheet_Calculate() Columns=(\:H\End sub
注意:在一个工作薄中,一般都有多张工作表。工作表事件必须编写在对应的工作表对象中,操作该工作表时才会执行对应的事件代码。例如在“Sheet1”工作表的代码模块中编写的事件代码不会在“Sheet2”工作表时执行。 (1) Activate事件
激活工作表、图表工作表或者嵌入式图表时发生此事件。例如,以下代码将在工作表被激活时对区域A1:A20进行排序。 Private Sub Worksheet_Activate()
Range(\End sub (2) Change事件
当用户更改工作表中的单元格,或者外部链接引起单元格的更改时发生此事件。该事件代码格式如下:
Private Sub Worksheet_Change(ByVal Taget As Range)
:当单元格在重新计算计算过程中更改时,将不会发生该事件。
再者,可通过Worksheet对象的Change事件对单元格中录入的数据进行校检,例如,以下代码将检查工作表的 第三列,如果输入的内容不是“男”或“女”,则显示错误信息。 Private Sub Worksheet_Change(ByVal Taget As Range)
Select Case Target.Column '按单元格列数处理 Case 3 '第三列(性别)
If Target < >\男\女\性别列的值不为\男\或\女\ MsgBox \性别设置错误,请重新输入!\警告\ Target.Select '选中单元格 End If
Case 4 '校检其他列 ... End Select End Sub
(3) BeforreRightClick事件
在工作表上单击鼠标右键时发生此事件,此事件先于默认的单击右键操作。该事件的代码格式如下:
Private Sub Worksheet_BeforeRightClick(ByVal Taget As Range,Cancle As Boolean) 其中参数的含义如下:
● Target表示一个Range对象,为单击右键发生时最靠近鼠标指针的单元格,
● Cancel事件发生时为False。如果实践过程将此参数设为True,则在完成此过程后,不执行默认的单击右键操作。此外,当指针在形状或者命令栏(工具栏或者菜单栏)上时,单击右键不触发此事件。
此外,BeforreRightClick事件还可用于取代默认的右键快捷菜单操作,活对默认操作进行一些小改动。