excel_vba_编程教程(完整版)-第83部分
按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
因为GetObject函数的第一个参数(Pathname)被忽略了,所以,就返回对Access应用软件类的
现存的实例的引用。
Dim objAccess As Object
Set objAccess = GetObject(“C:Program Files & “Microsoft
OfficeOfficeSamplesNorthwind。mdb”)
如果GetObject函数的第一个参数是个数据库文件的名称,那么就会使用该具体数据库,激活或
者创建Access应用软件类的新实例。
既然你知道了如何创建代表应用软件的对象变量,那么我们就来看看一个从Excel VBA过程里直
接打开Access数据库的程序示例 吧。下页显示的过程AccessViaAutomation将打开一个Access
文件Northwind数据库。该过程将使用Access自动控制服务器的当 前实例,如果它可用的话。
如果Access没有运行,运行时间错误将发生,并且该对象变量将被设置为Nothing。你可以通
过在程 序里放置On Error Resume Next 语句捕捉该错误。因此,如果Access没有运行,新的
Access实例就会被打开。本例子使用关键 字New来启动Access的新实例。正如前面所述,除了
使用关键字创建新对象实例之外,你也可以使用CreateObject()函数来启动
自动控制服务器的新实例,如下所示:
Set objAccess = GetObject(; “Access。Application。10”)
If objAccess Is Nothing Then
Set objAccess = CreateObject(“Access。Application。10”)
End If 当你使用自动控制启动Access时,你将在任务栏上看到Access图标。Access应用软件
对象的Visible属性被设置为False。想要 恢复该应用软件窗口的话,就得将其Visible属性
设置为Trie。 在使用时,对象要消耗内存和系统资源。要释放这些资源的话,那么你每次使
用完它的时候总应该关闭该对象。 下面示范的程序例子首先使用CloseCurrentDatabase方法
关闭Northwind数据库。接着,使用Quit方法关闭Access应用程序对象。 在关闭对象后,你也应
该将对象变量设置为关键字Nothing以释放该变量使用的内存资源。 你可以将对象变量声明为
模块级,而不是过程级变量,以避免Access实例被关闭。 在这样的环境下,对数据库的链接
就会保持,直到你关闭该自动控制的控制源(Excel)或者在VBA代码里使用Quit方法关闭它。
Sub AccessViaAutomation()
Dim objAccess As Access。Application
Dim strPath As String
On Error Resume Next
Set objAccess = GetObject(; 〃Access。Application。9〃)
If objAccess Is Nothing Then
' Get a reference to the Access Application object
Set objAccess = New Access。Application
End If
strPath = 〃C:Program FilesMicrosoft Office” _
& 〃OfficeSamplesnorthwind。mdb〃
' Open the Northwind database
With objAccess
。OpenCurrentDatabase strPath
If MsgBox(〃Do you want to make the Access 〃 & vbCrLf _
& 〃Application visible?〃; vbYesNo; _
〃Display Access〃) = vbYes Then
294
… 页面 311…
。Visible = True
MsgBox 〃Notice the Access Application icon 〃 _
& 〃now appears on the Windows taskbar。〃
End If
' Close the database and quit Access
。CloseCurrentDatabase
。Quit
End With
Set objAccess = Nothing
End Sub
使用F8键逐语句运行上面的过程。
技巧15…3 打开被保护了的Access数据库
如果该Access数据库用密码保护了,那么会提示用户输入正确的密码。你必须使用Data Access
Objects (DAO)或者ActiveX Data
Access (ADO)来编程打开密码保护的Access数据库。下面的例子使用了Access对象的DBEngine
属性来确定该数据库的密码。
要让该过程工作的话,你就必须创建对Microsoft DAO 3。6对象库的引用,如本章开头所述。
Sub OpenSecuredDB()
Static objAccess As Access。Application
Dim db As DAO。Database
Dim strDb As String
strDb = 〃C:Program FilesMicrosoft Office” & 〃OfficeSamples _
Northwind。mdb〃
Set objAccess = New Access。Application
Set db = objAccess。DBEngine。OpenDatabase(Name:=strDb; Options: False; _
ReadOnly:=False; Connect:=〃;PWD=test〃)
With objAccess
。Visible = True
。OpenCurrentDatabase strDb
End With
db。Close
Set db = Nothing
End Sub
5。使用 DAO 链接到 Access 数据库
要使用数据访问对象(DAO)连接到Access数据库的话,你就必须首先在引用对话框里创建对
Microsoft Data Access Objects 3。6
Library的引用。下面示范的程序例子DAOOpenJetDatabase,使用DBEngine对象的OpenDatabase
方法来打开Northwind数据库, 并且通知用户该数据库已被打开。DBEngine对象让你初始化称
为Microsoft Jet Engine的标准数据库引擎并打开一个数据库文件
(。mdb)。过程使用Close方法关闭数据库文件。
Sub DAOOpenJetDatabase()
Dim db As DAO。Database
Set db = DBEngine。OpenDatabase _
(〃C:Program FilesMicrosoft OfficeOfficeSamplesNorthwind。mdb〃)
MsgBox 〃Northwind database has been opened。〃
db。Close
MsgBox 〃Northwind database has been closed。〃
End Sub
6。使用 ADO 链接到 Access 数据库
最新的,最建议的建立对Access数据库链接的方法是使用ActiveX 数据对象(ADO)。你必须先
设置对微软ActiveX数据对象2。5库 或者更高版本的引用。示例程序ADOOpenJetDatabase使用
Connection对象链接到Northwind数据库。该对象通过Open方法打 开。注意,Open方法需要
一个包含数据提供者名称(本例中为Microsoft。Jet。OLEDB。4。0)和数据源名称(本例中为要
打开的数 据库文件完整名称)的链接字符串参数:
con。Open _
〃Provider=Microsoft。Jet。OLEDB。4。0;〃 _
& 〃Data Source=C:Program FilesMicrosoft Office” _
& 〃OfficeSamplesNorthWind。mdb;〃 在建立对Northwind数据库的链接之后,你可以使用
Recordset对象来访问其数据。Recordset对象用来在记录级操作数据。 Recordset对象由记
295
… 页面 312…
录(行)和字段(列)组成。要获得一套记录,你就得使用Open方法打开Recordset。该方法
需要明确的信 息,例如Recordset记录源:
rst。Open 〃SELECT * FROM Customers 〃 & _
〃WHERE City = 'London'〃; con; _
adOpenForwardOnly; adLockReadOnly 记录源可以是返回记录的数据库表,或查询或SQL语
句。在明确记录源后,你还需要表明对数据库(con)和两个常数,一个定 义指针类型
(adOpenForwardOnly),另一个为锁定类型(adLockReadOnly)。常数adOpenForwardOnly
告诉VBA创建只能 向前翻的Recordset。第二个常数adLockReadOnly明确在编辑时记录上的锁
定类型。该记录为只读,意味着你不能改变该数据。 过程的下一部分使用For…Each…Next循
环遍历Recordset并将第一条记录的内容打印到立即窗口:
For Each fld In rst。Fields
Debug。Print fld。Name & 〃=〃 & fld。Value & vbCr
Next
在获取第一条记录的数据后,过程使用了Close方法关闭Recordset和对Access数据库的链接:
rst。Close
con。Close
ADOOpenJetDatabase过程如下:
Sub ADOOpenJetDatabase()
Dim con As New ADODBnnection
Dim rst As New ADODB。Recordset
Dim fld As ADODB。Field
' Connect with the database
con。Open _
〃Provider=Microsoft。Jet。OLEDB。4。0;〃 _
& 〃Data Source=C:Program FilesMicrosoft Office” _
& 〃OfficeSamplesNorthWind。mdb;〃
' Open Recordset based on the SQL statement
rst。Open 〃SELECT * FROM Customers 〃 & _
〃WHERE City = 'London'〃; con; _
adOpenForwardOnly; adLockReadOnly
' Print the values for the fields in
' the first record in the debug window
For Each fld In rst。Fields
Debug。Print fld。Name & 〃=〃 & fld。Value & vbCr
Next
' Close the Recordset and connection with Access
rst。Close
con。Close
' Destroy object variables to reclaim the resources
Set rst = Nothing
Set con = Nothing
End Sub
7。从 Excel 执行 Access 任务
从Excel链接到Access后,你就可以执行Access应用软件的不同任务。本节示范如何使用VBA代
码来:
□ 创建新Access数据库
□ 打开现存在的数据库表
□ 创建全新的数据库表
□ 打开数据库报表
□ 运行Access函数
8。创建新 Access 数据库
如果你想要通过编程将Excel数据传送到一个新的Access数据库里面,那么你需要使用VBA代
码创建一数据库。下面的过程示例 示范了如何使用DAO来建立和Access的链接。Workspace对象
的CreateDatabase方法创建一个名为ExcelDump。mdb的新数据库 于C盘根目录下。然后,
Database对象的CreateTableDef方法用来创建一个名为tblStates的表。在表能够添加到数据
库之前,必 须先创建一个字段并附在该表上。该过程创建了三个文本字段(dbText),每个分
别可以储存2,25和25个字符。每个字段创建 后,使用Append方法将这些字段添加到TableDef
296
… 页面 313…
对象的Fields集合里。字段一旦创建并添加到表之后,表本身就会使用Append 方法被添加到
数据库。因为名为“C:ExcelDump。mdb”的数据库可能已经存在于该目录下,该过程包括了一
个错误处理程序,将 删除现有文件,以确保数据库创建过程继续。因为其它错误也可能发生,
Else子句包括了显示错误描述的信息,并允许退出过程
Sub NewDB_DAO()
Dim db As DAO。Database
Dim tbl As DAO。TableDef
Dim strDb As String
Dim strTbl As String
On Error GoTo Error_CreateDb_DAO
strDb = 〃C:ExcelDump。mdb〃
strTbl = 〃tblStates〃
' Create a new database named ExcelDump
Set db = CreateDatabase(strDb; dbLangGeneral)
' Create a new table named tblStates
Set tbl = db。CreateTableDef(strTbl)
' Create fields and append them to the Fields collection
With tbl
。Fields。Append 。CreateField(〃StateId〃; dbText; 2)
。Fields。Append 。CreateField(〃StateName〃; dbText; 25)
。Fields。Append 。CreateField(〃StateCapital〃; dbText; 25)
End With
' Append the table object to the TableDefs
db。TableDefs。Append tbl
' Close the database
db。Close
Set db = Nothing
MsgBox 〃There is a new