按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 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。接下来……
在本章中,你获得了便利的事件经验和Excel的事件编程,这是无价的技术,不管你是否
计划给他人创建电子表格应用软件,还 是简单地将你的日常任务自动化。Excel提供了许多你
可以响应的事件。通过编写事件过程,你可以更改对象对事件的响应方式。 你的事件过程可以
简单为一条语句,仅仅显示一自定义信息;也可以复杂到包括一些判断语句和其它允许你改变你
的程序流的编 程结构。当某个事件发生时,VB将会直接运行适当的事件过程,而不是按标准
的内置方式进行响应。 你已经学习了一些编写在标准模块里的事件过程(工作簿,工作表,
图表工作表),然而,其它的(内嵌图表,应用软件,查询 表)则需要你在类模块里面使用
WithEvents关键字创建一个新对象。你也学习了你可以使用EnableEvents属性激活或者禁止事
件。
在下章,你将学习如何使用Excel VB环境下的VBA过程来使用Access数据库。
第十五章 在 Excel里使用 Access
在第九章里面,你已经学习了从Excel里通过自动控制(用于允许一个应用程序控制另外
一个应用程序的对象)来操纵Word和 Outlook。本章将给演示如何编程从Excel里使用Access,
使用下述方法获取Access数据到电子表格里面:Automation,DAO (Data Access Objects)以及
ADO (ActiveX Data Objects)。在你学习如何使用Excel VBA在Access数据库里执行各种任务
以及获取和存 储数据于Access数据库之前,我们来粗略地介绍一下,Microsoft Access用来
编程对其对象访问的数据访问方法。
1。对象库
Access数据库包含各种类型的对象,储存在不同的对象库里面,用来使用VBA语言显示、存
储或者管理数据。在本章,你将涉 猎下面列出的几个库里的对象、属性和方法。
Access 10。0对象库提供了用来显示数据和在Access 2002应用软件上使用的对象。该库储存子
在MSACC10。OLB文件里,并且
可以自阿C:Program FilesMicrosoft OfficeOffice文件夹里面找到。在引用对话框上设置
了对该库的引用之后(将在下节涉及), 你将能够在对象浏览器里面访问该库的对象、属性和
方法(参见图15…1)。
289
… 页面 306…
图15…1 Access库 (译者:截图为Office 2003。Access库文件为MSACC。OLB)
Access DAO 3。6对象库提供了数据访问对象(DAO),让你决定你的数据库的结构和使用VBA操作数据。
该库储存在DAO360。DLL
文件里,并且可以在C:Program Filesmon FilesMicrosoft SharedDAO文件夹里找到。
在引用对话框上设置了对该库的引 用之后(将在下节涉及),你将能够在对象浏览器里面访
问该库的对象、属性和方法(参见图15…2)。
图15…2 DAO库
Microsoft ActiveX Data Objects 2。5 (ADO) 提供了控件数据对象(ADO)并且允许你使用OLE DB
供应者访问和操作数据。ADO
使得在Access数据库里对数据源创建链接,读取,插入,修改和删除数据成为可能。该库储存
于MSADO15。DLL里面,并可以
在C:Program Filesmon Filessystemado文件夹里找到。在引用对话框上设置了对该库
的引用之后,你将能够在对象浏览 器里面访问该库的对象、属性和方法(参见图15…3)。
290
… 页面 307…
图15…3 ADODB库