1。事件过程介绍
事件过程,作为一种特殊的VBA过程,用来对特定的事件作出反应。该过程包含处理具体事件的
VBA代码。有些事件只需要简单 的一行代码,然而,其它的可能更复杂。事件过程拥有名称,按
下述方式创建:
对象名称_事件名称() 在事件名称后面的括号里,你可以放置需要
266
… 页面 283…
发送到过程里的参数。程序员不能更改事件过程名称。 在你编写事
件过程对Excel事件作出反应之前,你需要知道:
* 想要响应的具体对象和事件的名称
响应事件的对象在代码窗口的过程下拉清单里显示了一系列事件(见图14…1)。同样,你
也可以使用对象浏览器找到事件 名称(见图14…2)。
* 你需要放置代码的地方 有些事件在标准模块里,其它的在类模块里。然而,工作簿,图表
和工作表事件对任何打开的工作表或者工作簿可用。要 给一个内嵌的图表,透视表或者应
用软件对象创建事件过程的话,那么你必须首先使用关键字With Events在类模块里创建 一
个新对象
图14…1 你可以在代码窗口找到事件名称
图14…2 你可以在对象浏览器里找到事件名称
2。激活和失活事件
你可以使用应用软件对象的EnableEvents属性来激活或者失活事件。如果你编写了VBA过程但是
不希望有个具体事件发生,那 么就将EnableEvents属性设置为False。例如,为了避免在运行过
程EnterData(参见下面代码)引发Workbook_BeforeClose事 件,那么在调用Workbook对象Close
方法之前,设置EnableEvents属性为False。在你的程序结束之前,你得将EnableEvents 属性设
置回True,确保事件被激活了。
1。 打开一新工作簿并另存为DisableEvents。xls
2。 切换到VB编辑器屏幕,双击工程浏览器窗口的ThisWorkbook,并且在出现的代码窗口里输入
Workbook_BeforeSave事件 过程
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean; _
Cancel As Boolean)
If MsgBox(〃Would you like to copy 〃 & vbCrLf _
267
… 页面 284…
& 〃this worksheet to 〃 & vbCrLf _
& 〃a new workbook?〃; vbYesNo) = vbYes Then
Sheets(ActiveSheet。Name)py
End If
End Sub
3。 选择插入|模块添加一个标准模块激活VBA工程,并且输入下面显示的过程:
Sub EnterData()
With ActiveSheet。Range(〃A1:B1〃)
。Fontlor = vbRed
。Value = 15
End With
Application。EnableEvents = False
ActiveWorkbook。Save
Application。EnableEvents = True
End Sub
4。 切换到Excel应用软件窗口,并且选择文件|保存。这时将引发Workbook_BeforeSave事件。点
击是响应该信息框。Excel会 打开一个新工作簿,复制当前的工作表内容。
5。 激活DisableEvents工作簿,并且选择工具|宏|宏。在对话框上,点击EnterData然后运行 注
意,当你运行EnterData过程时,你没有被提示在保存之前复制工作表。这表明
Workbook_BeforeSave事件没有运行。
3。事件次序
事件发生以相应具体的动作并且按预先设计的次序发生。下面的表格示范了打开新工作簿,往工
作簿里添加新工作表以及关闭工 作簿时事件的顺序。
动作 对象 事件顺序
打开一个新工作簿 Workbook NewWorkbook;
WindowDeactivate;
WorkbookDeactivate;
WorkbookActivate;
WindowActivate
往工作簿添加新工作表 Workbook WorkbookNewSheet; SheetDeactivate;
SheetActivate
关闭工作簿 Workbook WorkbookBeforeClose;
WindowDeactivate;
WorkbookDeactivate;
WorkbookActivate; WindowActivate
4。工作表事件
工作表对象相应例如工作表激活和失活事件,计算工作表事件,工作表更改事件和双击或右键单
击事件。本节讨论一些工作表对 象能够响应的事件。
事件名称 激活
事件描述 示例1
当用户激活工作表时,发生该 Dim shtName As String ‘declared at the top 在模块上部声明
事 件 ‘ of the module
Private Sub Worksheet_Activate()
shtName = ActiveSheet。Name
Range(〃B2〃)。Select
End Sub
示例程序中,每次该工作表被激活时,选择单元格B2
示例1 – 试验:在VB编辑器窗口,激活工程浏览器窗口并打开Excel对象文件夹。双击Sheet2(Sheet2),
并且输入示例程序到Sheet2
268
… 页面 285…
代码窗口。接下来,切换到Excel窗口并激活Sheet2。注意,当Sheet2被激活时,被选择的总是单
元格B2。
事件名称 失活
事件描述 示例2
当用户激活不同的工作表时,发 Worksheet_Deactivate()
生该事件 MsgBox 〃You deactivated 〃 & _
shtName & 〃。〃 & vbCrLf & _
〃You switched to 〃 & _
ActiveSheet。Name & 〃。〃
End Sub
Private Sub
示例程序中,当Sheet2失活时,显示一个信息框
示例2 – 试验:在VB编辑器窗口,激活工程浏览器窗口并且打开Excel对象文件夹,双击Sheet2
(Sheet2),然后输入示例程序。 接下来,切换到Excel应用程序窗口并且激活Sheet2。你在示例1
里创建的Worksheet_Activate过程将会运行,Excel会选中单元 格B2并且将工作表名称存储于你
在Sheet2的代码模块上面声明的全局变量shtName里面。现在,点击当前工作簿里的其它工作 表,
注意,Excel将显示你离开的工作表名称和你要切换到的工作表名称。
事件名称 选择变化
事件描述 示例3
当用户选择工作表单元格时,发 Private Sub Worksheet_SelectionChange(ByVal Target As
生该事件 Excel。Range) ‘可省略Excel,下同。
On Error Resume Next
Set myRange = Intersect(Range(〃A1:A10〃); Target)
If Not myRange Is Nothing Then
MsgBox 〃Data entry or edits are not permitted。〃
End If
End Sub
示例程序中,当用户选择任何myRange中的单元格或区域时,显示一个信息框
示例3 – 试验:在VB编辑器窗口,激活工程浏览器窗口并且打开Excel对象文件夹,双击Sheet3
(Sheet3),并且在Sheet3代码窗 口里输入该示例程序。然后切换到Excel窗口并激活Sheet3。点
击给定区域A1:A10中的任何单元格。注意,Excel将显示一个信 息。
Private Sub Worksheet_Change(ByVal Target _
事件名称 变化
As Excel。Range)
事件描述 例4
Application。EnableEvents = False
当用户更改单元格内容时,引发 Target = UCase(Target)
该事件 Columns(Targetlumn)。AutoFit
Application。EnableEvents = True
End Sub
示例程序中,你输入的内容会自动变为大写,并且该列列宽将自动适应内容文本长短
(Sheet1),并且在Sheet1代码窗 口里输入该示例程序。然后切换到Excel窗口并激活Sheet1。在
任意单元格里输入任何文本,注意,你一旦按下回车键,Excel 就会将该文本变为大写,然后该
列自动适应文本长度。
事件名称 计算
事件描述 示例5
当用户重新计算工作表时,引发 Private Sub Worksheet_Calculate()
该事件 MsgBox 〃The worksheet was recalculated。〃
End Sub
一旦工作表重新计算,示例程序就会弹出一信息
示例5 – 试验:在当前工作簿里添加一个新工作表,练习假定Excel会在你的工作簿里放置Sheet4。
往Sheet4的单元格A2里输入1,B2里输入2。在单元格C2里输入下述公式:= A2 + B2。在VB编辑器
窗口,激活工程浏览器窗口并且打开Excel对象文件夹, 双击Sheet4 (Sheet4),并且输入如上所
小提示:按 回车 [Enter] 键 返回书目,按 ← 键 返回上一页, 按 → 键 进入下一页。
赞一下
添加书签加入书架