excel_vba_编程教程(完整版)-第87章
按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
当工作簿被打开时,示例过程在单元格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 StartDay