excel_vba_编程教程(完整版)-第81部分
按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
Wb。SaveAs FileFormat:=xlWorkbookNormal
End If
End If
End Sub
WorkbookActivate 当用户将焦点移到一个开启的工作簿时引发该事件
WorkbookDeactivate 当用户将焦点从一个开启的工作簿移开时引发该事件
WorkbookNewSheet 当用户在一个打开的工作簿上新建一个工作表时引发该事件
WorkbookBeforeSave 该事件发生在以大开工作簿被保护之前
285
… 页面 302…
Private Sub App_WorkbookBeforeSave(ByVal _
Wb As Workbook; _
ByVal SaveAsUI As Boolean; _
Cancel As Boolean)
If Wb。Path vbNullString Then
ActiveWindow。Caption = Wb。FullName & _
〃 'Last Saved: 〃 & Time & 〃'〃
End If
End Sub
WorkbookBeforePrint 该事件发生在以大开工作簿被打印之前
Private Sub App_WorkbookBeforePrint(ByVal _
Wb As Workbook; Cancel As Boolean)
Wb。PrintOut
Copies:=2
End Sub
WorkbookBeforeClose 该事件发生于关闭工作簿之前
Private Sub App_WorkbookBeforeClose( ByVal _
Wb As Workbook; Cancel As Boolean)
Dim r As Integer
Sheets。Add
r = 1
For Each p In Wb。BuiltinDocumentProperties
On Error GoTo ErrorHandle
Cells(r; 1)。Value = p。Name & 〃 = 〃 &
ActiveWorkbook。 _
BuiltinDocumentProperties _
。Item(p。Name)。Value
r = r + 1
Next
Exit Sub
ErrorHandle:
Cells(r; 1)。Value = p。Name
Resume Next
End Sub
WorkbookAddInInstall 该事件发生于用户安装加载宏之时
WorkbookAddInUninstall 该事件发生于用户卸载加载宏之时
SheetActivate 当用户激活开启工作簿中某个工作表时引发该事件
SheetDeactivate 当用户离开某个工作表时引发该事件
SheetSelectionChange 当用户改变选择工作表上的区域时引发该事件
Private Sub App_SheetSelectionChange( _
ByVal Sh As Object; ByVal Target As Range)
If Selectionunt 》 1 Or _
(Selectionunt 《 2 And _
IsEmpty(Target。Value)) Then
Application。StatusBar = Target。Address
Else
End If Application。StatusBar = Target。Address & _
End Sub 〃(〃 & Target。Value & 〃)〃
SheetChange 当用户在一个打开的工作簿里改变单元格里的内容时引发该事
件
SheetCalculate 当用户重新计算某个开启的工作簿里的工作表时引发该事件
SheetBeforeDoubleClick 当用户双击工作表时引发该事件
SheetBeforeRightClick 当用户右键单击工作表单元格时引发该事件
WindowActivate 当用户激活一个打开的窗口时引发该事件
Private Sub App_WindowActivate(ByVal _
Wb As Workbook; ByVal Wn As Window)
Wn。DisplayFormulas = True
286
… 页面 303…
End Sub
WindowDeactivate 当用户将焦点从开启的窗口移走时引发该事件
WindowResize 当用户调整开启的窗口的大小时引发该事件
WorkbookPivotTableClose… 在数据透视表报告连接被断开后,引发该事件
Connection
(Excel 2002的新事件) 在数据透视表报告连接被打开后引发该事件
WorkbookPivotTableOpen…
Connection
(Excel 2002的新事件)
287
… 页面 304…
9。查询表时间
查询表是Excel工作表里代表从外部数据源得来的数据,例如SQL服务器数据库,Access数据
库,网页,或者文本文件。查询表 用对象QueryTable代表。Excel为QueryTable对象提供了两
种事件:BeforeRefresh和AfterRefresh。想要试验一下本章后面示范 的这些示例过程的话,
那么请执行下面的这些操作。本示例假设你的机器上安装了Access以及其例子Northwind数据
库。
1。 在Excel应用软件窗口,选择数据|导入外部数据,并且选择新建数据库查询以创建一个新
数据库查询
2。 在数据源对话框里,选择新数据源,并点击确定
3。 在创建新数据源对话框里,输入SampleDb作为数据源名称
4。 在创建新数据源对话框上,从第二步旁边的下拉列表里,选择Microsoft Access driver
(*。mdb)
5。 点击连接按钮
6。 在ODBC Microsoft Access安装对话框上点击选择按钮
7。 在选择数据库对话框上,找到文件Northwind。mdb。该文件通常可以在C:Program
FilesMicrosoft OfficeOfficeSamples文 件夹找到(译者用的是Office 2003,没有
该文件,有一个类似的Nwind。mdb文件。大家可以在电脑上查找一下)
8。 选择该文件并且点击确定以关闭该选择数据库对话框
9。 在点击确定退出ODBC Microsoft Access安装对话框
10。 在创建新数据源对话框的第四步,在下拉列表框里选择Categories
11。 点击确定以关闭创建新数据源对话框
12。 在选择数据源对话框上,数据源名称SampleDb现在应该被加亮了,点击确定
13。 在查询向导 – 选择列对话框里,点击》按钮,将Categories表中所有的区域移到查询框
的列中去
14。 点击下一步,直到你看到查询向导 – 完成对话框
15。 在查询向导 – 完成对话框上,确保将数据返回到Microsoft Excel选项按钮是被勾选上
的,并且点击完成
16。 在导入数据对话框,当前电子表格单元格是被选中的,点击单元格A1并点击确定关闭对
话框。 完成上述步骤后,Northwind数据库里Catetory表中的数据应该被放置在当前工作表里
面了。重新获得数据是得花费好些步骤的。 在下章,你将学习如何编程创建查询表。想要给
查询表对象编写事件过程的话,你就必须创建一个类模块并且使用WithEvents 关键字声明一
个QueryTable对象。
1。 插入类模块到当前VBA工程并重命名为clsQryTbl
2。 在clsQryTbl代码窗口,输入下述语句:
Public WithEvents qrytbl As QueryTable
当你使用WithEvents关键字声明完新对象qrytbl后,它就会出现在类模块的对象下拉列表
中
3。 在clsQryTbl代码窗口,输入两个事件过程,如下面的表格所示:QryTbl_BeforeRefresh
和QryTbl_AfterRefresh。在你能够 引发这些事件过程之前,你必须将你在类模块里声
明的对象和某个特定的QueryTable对象连接起来
4。 插入一个标准模块,并输入下述代码:
Public Sub Auto_Open()
' connect the class module and its objects with the Query object
Set sampleQry。qrytbl = ActiveSheet。QueryTables(1)
End Sub 上面的程序创建了一个QueryTable类(clsQryTbl)的新示例,并且将它和活动
工作表里的第一个查询表连接起来。当你打开 该工作簿时,Auto_Open过程会自动执行。
因此你不必手动运行它,以确保当数据被刷新时,查询事件将会被引发。
5。 运行第四步输入Auto_Open过程,在你运行完该初始化过程后,你在类模块里声明的对象就
会指向特定的查询表对象
6。 在你放置从Access里导入的Category的工作表里,更改某个类别。选择查询表中的任意单
元格,并且点击外部数据工具栏 上的刷新数据,或者选择数据|刷新数据。这次,事件过程
qrytbl_BeforeRefresh将会被引发了,你将看到一个自定义信息框。 如果你点击是,该
数据将会被数据库里存在的数据刷新掉,你更改过的数据将会被覆盖掉。
事件名称 描述
288
… 页面 305…
BeforeRefresh 该事件发生在查询表被刷新数据之前
Private Sub qryTbl_BeforeRefresh(Cancel As Boolean)
Response = MsgBox(〃Are you sure you 〃 _
& 〃 want to refresh now?〃; vbYesNoCancel)
If Response = vbNo Then Cancel = True
End Sub
AfterRefresh 该事件发生在查询完成或者被取消。如果查询成功完成则参
数Success
为True。
Private Sub qryTbl_AfterRefresh(ByVal Success As
Boolean)
If Success Then
MsgBox 〃The data has been refreshed。〃
Else
MsgBox 〃The query failed。〃
End If
End Sub
10。接下来……
在本章中,你获得