按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
入一网址,比如wordware然后回车。现在,点击该链 接激活该网址,当IE窗口出现后,
打开收藏菜单,就会发现Wordware网址已经被添加到该菜单里了。
事件名称 更新数据透视表
事件描述 示例9
工作表中的数据透视表被更新
后,就会发生该事件。它是Excel Private Sub pivTbl_PivotTableUpdate( _
2002的新事件。参数Target明确 ByVal Target As PivotTable)
所选地数据透视表。 pivTbl是个 MsgBox Target。Name & _
〃 report has been updated。〃 & vbCrLf _
变量,指向类模块里使 用 & 〃The PivotReport is located in cells 〃 & _
WithEvents关键字声明的工作 Target。DataBodyRange。Address
表的对象 End Sub
示例程序显示一信息,描述被更新的数据透视表的名称和发生在工作表上报告的单元格区域地址。
示例9 – 试验:打开位于本书附带光盘上的文件PivotReport_2。xls,点击数据透视表上的任意
单元格,并且点击数据透视表工具 栏上的更新数据按钮。图14…3和14…4示范了如何创建
PivotTableUpdate事件句柄。
271
… 页面 288…
图14…3 你必须使用类模块来捕捉PivotTableUpdate事件。该类模块可以是任何有效的模块名称。
对象变量名称pivTbl,也可以是 任何有效的变量名称
图14…4 你在能够捕捉PivotTableUpdate事件之前,必须在标准模块里设立类模块的示例,并且将
对象Worksheet赋予新对象的属 性pivTbl。
5。工作簿事件
当用户执行一些操作,如打开,激活,打印,保存以及关闭工作簿时,发生工作簿对象事件。工
作簿事件不会创建在标准VBA 模块里,想要编写响应工作簿事件的代码的话,那么需要双击VB编辑
器里的工程浏览器中的ThisWorkbook。在出现的代码窗口, 打开对象下拉清单并且选择Workbook
对象。在过程下拉清单里选择你想要地事件。被选择的事件过程将出现在代码窗口。例如:
Private Sub Workbook_Open()
在此放置你的事件处理代码
272
… 页面 289…
End Sub
本节描述工作簿一些可用的事件。
事件名称 激活
事件描述 示例10
当用户激活该工作簿时,引发该 Private Sub Workbook_Activate()
事件。当用户从其它应用程序切 MsgBox 〃This workbook contains 〃 & _
换到Excel工作簿时,不会引发该 ThisWorkbook。Sheetsunt & 〃sheets。〃
End Sub
事件
当用户激活包含Workbook_Activate事件过程的工作簿时,示例程序显示该工作簿含有的工作表数
目
示例10 – 试验:在VB编辑器窗口,激活工程浏览器窗口并且打开Excel对象文件夹,双击
ThisWorkbook并且在其代码窗口里输 入示例过程。然后,切换到Excel窗口并且打开一个新工作
簿。切换到你输入了Workbook_Activate过程的工作簿,这时,Excel 将显示该工作簿里的工作
表总数。
事件名称 失活
事件描述 示例11
当用户激活Excel的其它工作簿 Private Sub Workbook_Deactivate()
时,引发该事件。当用户切换到 For Each cell In _
其它应用软件时,不会发生该事 ActiveSheet。UsedRange
件。 If Not IsEmpty(cell) Then
Debug。Print cell。Address & _
〃:〃 & cell。Value
End If
Next
End Sub
当用户激活其它工作簿时,示例程序将在立即窗口里打印当前工作簿里有输入的单元格地址和数值
示例11 – 试验:在VB编辑器窗口,激活工程浏览器窗口并且打开Excel对象文件夹。双击
ThisWorkbook,然后输入示例程序于 代码窗口。切换到Excel窗口,并且在活动工作表里输入一
些东西。然后,激活某个不同的工作簿。该动作将激发 Workbook_Deactiate事件过程。切换到
VB编辑器窗口,并打开立即窗口察看什么单元格输入有了报告。
事件名称 打开
事件描述 示例12
当用户打开工作簿时引发该事件 Private Sub Workbook_Open()
ActiveSheet。Range(〃A1〃)。Value = Format _
(Now(); 〃mm/dd/yyyy〃)
End Sub
当工作簿被打开时,示例过程在单元格A1里放置当前日期
示例12 – 试验:打开一个新工作簿,在VB编辑器窗口,激活工程浏览器窗口,并且打开Excel对
象文件夹。双击ThisWorkbook, 并输入示例过程。保存并且关闭该工作簿。当你再次打开该工作
簿时,当前日期就会被放置在当前活动工作表地单元格A1里。
事件名称 保存前
事件描述 示例13
273
… 页面 290…
该事件发生在工作簿被保存之 前。参数SaveAsUI是只读的,指 向SaveAs对话框。如果该工作簿 并
没有被保存过,那么SaveAsUI 参数的值就是True,否则为False
Private Sub Workbook_BeforeSave(ByVal _
SaveAsUI As Boolean; Cancel As Boolean)
If SaveAsUI = True And _
ThisWorkbook。Path = vbNullString Then
MsgBox 〃This document has not yet 〃 _
& 〃been saved。〃 & vbCrLf _
& 〃The Save As dialog box will be displayed。〃
ElseIf SaveAsUI = True
Then MsgBox 〃You are not allowed to use 〃 _
& 〃the SaveAs option。 〃
Cancel = True
End If
End Sub
如果该工作簿没有被保存过,那么示例程序将显示另存为对话框。如果该文
件没有被保存过,那么该
工作 簿的路径名将为字符串NULL(vbNullString)。过程不允许用户将该工
作簿保存为一个不同的名
称;另存 为操作将通过设置参数Cancel为True而中断。用户将需要选择保存
选项来保存该工作簿。
示例13 – 试验:打开一个新工作簿,在VB编辑器窗口,激活工程浏览器窗口并打开Excel对象文
件夹。双击ThisWorkbook
并且 在该代码窗口里输入示例程序。点击“If SaveASUI…”语句旁边的页边以放置一个断点。切
换到Excel窗口,并且在任意单元格 输入一些数据。点击工具栏上保存按钮。Workbook_BeforeSave
事件过程将会被激活。执行If SaveAsUI后面的语
句。在另存为 对话框里输入SaveEvent。xls作为该工作簿的名称。在保存(并命名)该工作簿之
后,对该工作簿作一些更改,
然后选择文件|另 存为。这次ElseIf子句将会被执行,并且你不会被允许通过使用SaveAs选项来
保存该工作簿。
事件名称 打印前
事件描述 示例8
该工作簿发生工作簿打印之前, Private Sub Workbook_BeforePrint(Cancel _
以及打印对话框出现之前 As Boolean)
Dim response As Integer
response = MsgBox(〃Do you want to 〃 & vbCrLf & _
〃print the workbook's full name in the footer?〃; _
vbYesNo)
If response = vbYes Then
ActiveSheet。PageSetup。LeftFooter = _
ThisWorkbook。FullName
Else
ActiveSheet。PageSetup。LeftFooter = 〃〃
End If
End Sub
在打印之前,如果用户点击了信息框的“是”,那么示例程序就会将工作簿的完整名称放入文件的
脚注里
示例14 – 试验:打开一个新工作簿,在VB编辑器窗口,激活工程浏览器窗口并打开Excel对象文
件夹。双击ThisWorkbook并且 在该代码窗口里输入示例程序。然后,切换到Excel窗口,并激活
任意工作表。在任意单元格里输入你想要输入的任意内容。当 你按下工具栏上的打印预览按钮时,
Excel将会询问你是否想要将工作簿名称和路径放入到脚注里。
事件名称 关闭前
事件描述 示例8
274
… 页面 291…
该事件发生在工作簿关闭之前, 并且在系统询问用户是否保存变 化之前
Private Sub Workbook_BeforeClose(Cancel _
As Boolean)
If MsgBox(〃Do you want to change 〃 & vbCrLf _
& 〃 workbook properties before closing?〃; _
vbYesNo) = vbYes Then
Application。Dialogs(xlDialogProperties)。Show
End If
End Sub
如果用户对信息框响应“是”时,示例程序将显示属性对话框
示例15 – 试验:在VB编辑器窗口,激活工程浏览器窗口并打开Excel对象文件夹。双击
ThisWorkbook并且在该代码窗口里输入 示例程序。然后,切换到Excel窗口,并关闭包含
BeforeClose事件程序的工作簿。在关闭之前,你将看到一个信息框,询问你是 否要更改文件属性。
在察看和修改工作簿属性之后,该过程关闭该工作簿。如果有些改变你还没有保存,那么你还有机
会去保存 该工作簿,取消该更改或者干脆终止该关闭操作。
事件名称 安装加载宏
事件描述 示例8
当用户安装该工作簿为一个加载 宏时,引发该事件
Private Sub Workbook_AddinInstall()
MsgBox 〃To create a calendar; 〃 & vbCrLf _
& 〃enter CalendarMaker in the 〃 & vbCrLf _
& 〃Macros dialog box。〃
End Sub
请参考下述详细指导来引发Workbook_AddinInstall事件过程
示例16 – 试验:
1。 打开一个新工作簿
2。 切换到VB编辑器,激活工程浏览器窗口,并打开Excel对象文件夹
3。 双击ThisWorkbook并且输入示例16和示例17程序在ThisWorkbook代码窗口
4。 在当前VBA工程插入一个新模块,并且输入过程CalendarMaker,显示于示例17之后
5。 切换到Excel窗口,并选择文件|属性,在属性对话框里输入下述内容:标题:Calendar Maker 备注:
Create a monthly calendar in an Excel spreadsheet。当你加亮该加载宏名称时,上面
的信息将出现在加载宏对话框里面
6。 点击确定以退出属性对话框
7。 选择文件|另存为并且将该工作簿保存为Calendar。xls
8。 现在,选择文件|另存为,将Calendar。xls保存为一个加载宏。从另存为类型下拉清单,选
择Microsoft Excel加载宏。输入一 个新名称(CalendarMaker。xla)然后点击保存
9。 关闭Calendar。xls工作簿
10。 打开一个新工作簿
11。 选择工具|加载宏。使用浏览按钮将CalendarMaker加入到加载宏清单里面。勾选列表框里的
CalendarMaker加载宏。当你点 击确定后,Workbook_AddInInstall过程就会被引发。点击信
息框上的确定
12。 想要创建一个日历的话,可以选择工具|宏|宏,在宏名称文本框里输入CalendarMaker然后
点击运行,你将会被询问年和月, 输入年和月(例如,Nov 2005)并点击确定,将出现一日
历页,如图14…5所示
275
… 页面 292…
图14…5 由过程CalendarMaker创建的月历
13。 想要引发示例17中示范的AddInUninstall事件过程的话,可以选择工具|加载宏,并清除
CalendarMaker加载宏前面的勾选标 志就可以了。
事件名称 卸载加载宏
事件描述 示例17
当用户卸载一个加载宏时,引发 该事件
Private Sub Workbook_AddinUninstall()
MsgBox 〃The CalendarMaker 〃 & vbCrLf _
& 〃add…in was unloaded。〃
End Sub
一旦该工作簿作为一个加载宏被卸载后,示例程序将显示一个信息
示例17 – 试验:参见示例16
下述过程CalendarMaker可在CodeLibrarian 加载宏里获得,这里用来示范工作簿对象的安装加载
宏和卸载加载宏事件的使用(参 见示例16和17)。
Sub CalendarMaker()
Dim MyInput As String
Dim StartDay As Date
Dim DayofWeek As Integer; CurYear As Integer; CurMonth As Integer
Dim FinalDay As Long
Dim cell As Range
Dim RowCell As Integer; ColCell As Integer
Dim x As Integer
‘以上变量声明为译者加上的,以确保程序正常运行
' protect sheet if had previous calendar to prevent error。 保护工作表,以避免之前
日历 带来的错误(原文误为Unprotect)
ActiveSheet。Protect DrawingObjects:=False; Contents:=False; _
Scenarios:=False
' Prevent screen flashing while drawing calendar。 制作日历时防止屏幕闪烁
Application。ScreenUpdating = False
' Set up error trapping。 设置错误陷阱
On Error GoTo MyErrorTrap
' Clear area a1:g14 including any previous calendar。 清除a1:g14单元格区域的内容
Range(〃a1:g14〃)。Clear
' Use InputBox to get desired month and year and set variable
' MyInput。 使用输入框从用户获得年月,并赋予变量MyInput
MyInput = InputBox(〃Type in Month and year for Calendar 〃)
' Allow user to end macro with Cancel in InputBox。 允许用户点击取消以终止宏
If MyInput = 〃〃 Then Exit Sub
' Get the date value of the beginning of input month。 获取输入年月的日期序号
StartDay = DateValue(MyInput)
276
… 页面 293…
' Check if valid date but not the first of the month 检查是否是有效日期,但不是当
月第一天
' if so; reset