End With
End Sub 下面的过程更通用,因为它允许你在任意Access数据库里显示任意Access报表。注意,
该过程需要两个字符串参数:Access数 据库名称和报表名称。
Sub DisplayAccessReport2(strDb As String; strRpt As String)
Set objAccess = New Access。Application
With objAccess
。OpenCurrentDatabase (strDb)
。DoCmd。OpenReport strRpt; acViewPreview
。DoCmd。Maximize
。Visible = True
End With
End Sub
你可以从立即窗口或者从如下所示的一个子过程里运行DisplayAccessReport2:
□ 从立即窗口
运行
300
… 页面 317…
DisplayAcce
ssReport2过
程 在立即窗
口里在一行
输入下述语
句:
Call DisplayAccessReport2(〃C:Program FilesMicrosoft
OfficeOfficeSamplesNorthwind。mdb〃; 〃Sales Totals by
Amount〃)
□
从一个子过程运行DisplayAccessReport2过程:
' Enter the following procedure in the Code window
Sub ShowReport()
Dim strDb As String
Dim strRpt As String
strDb = InputBox(〃Enter the name of the database (full path): 〃)
strRpt = InputBox(〃Enter the name of the report:〃)
Call DisplayAccessReport2(strDb; strRpt)
End Sub
图15…10 Access报表可以在Excel VBA过程里打开
11。运行 Access 查询
接下来的两个程序例子将示范如何从Excel VBA过程里运行Access查询。在Access用户界面最
常用的查询类型是选择查询 和参 数查询。两个示例程序都使用Range对象的
CopyFromRecordset方法将查询到的数据放置到Excel工作表。和数据库的链接是通 过ADO建立
的。
ADOX对象库(参见本章前面的图15…4)让你访问数据库结构,安全和储存在数据库里面的过程。
该库中最上面的对象是Catalog 对象,代表整个数据库。该对象包含一些数据库成员,例如,
301
… 页面 318…
表,字段,索引,视图和储存的过程。使用Catalog对象的Create 方法,你可以创建一个新的
数据库,例如:
Dim cat As ADOX。Catalog
Set cat = New ADOX。Catalog
cat。Create 〃Provider=Microsoft。Jet。OLEDB。4。0;〃 & _
〃Data Source=C:ExcelDump2。mdb;〃 上面的例子示范如何使用ActiveX数据对象创建新
的数据库。回想一下,在本章前面你使用DAO创建了一个叫做NewDB_DA的新 数据库。 示例过程
RunAccessQuery,首先创建一个可以指向该Catalog对象的对象变量cat。接着,Catalog对象
的属性 ActiveConnection定义对数据库创建链接的方法:
Set cat = New ADOX。Catalog
cat。ActiveConnection = 〃Provider=Microsoft。Jet。OLEDB。4。0;〃 & _
〃Data Source=〃 & dbPath
ADODB对象库里的mand对象(参见本章前面的图15…3)明确你为了从数据源获取数据而想
要执行的命令。我们的过程尝 试访问数据库某特定查询。
Set cmd = cat。Views(strQryName)mand Views集合,ADOX对象库的一部分,包含某特定
目录的所有View对象。视图是筛选后的一组记录,或者由其它表或者视图创建 的虚拟表。获
得对数据库里需要的查询的访问后,你就可以按下述方式运行查询:
Set rst = cmd。Execute mand对象的Execute方法允许你激活某个特定的查询,SQL语句,
或者储存的过程。然后,返回的一组记录会通过Set关键 字被赋予对象变量Recordset。创建
该组记录后,这些记录就会通过使用方法CopyFromRecordset放置到Excel工作表中。
12。运行选择查询
Sub RunAccessQuery(strQryName As String)
' prior to running this procedure you must set up
' references to the required object libraries
Dim cat As ADOX。Catalog
Dim cmd As ADODBmand
Dim rst As ADODB。Recordset
Dim i As Integer
Dim dbPath As String
dbPath = 〃C:Program FilesMicrosoft Office” _
& 〃OfficeSamplesNorthwind。mdb〃
Set cat = New ADOX。Catalog
cat。ActiveConnection = _
〃Provider=Microsoft。Jet。OLEDB。4。0;〃 & _
〃Data Source=〃 & dbPath
Set cmd = cat。Views(strQryName)mand
Set rst = cmd。Execute
Sheets(2)。Select
For i = 0 To rst。Fieldsunt … 1
Cells(1; i + 1)。Value = rst。Fields(i)。Name
Next
With ActiveSheet
。Range(〃A2〃)pyFromRecordset rst
。Range(Cells(1; 1); _
Cells(1; rst。Fieldsunt))。Font。Bold = True
。Range(〃A1〃)。Select
End With
Selection。CurrentRegionlumns。AutoFit
rst。Close
Set cmd = Nothing
Set cat = Nothing
End Sub
想要运行上述过程的话,可以在立即窗口里面输入下述语句并回车:
RunAccessQuery(〃Current Product List〃)
302
… 页面 319…
图15…11 从Excel VBA过程运行Access查询的结果被放在了一个工作表里了
(译者,从立即窗口运行可能遇到编译错误,如果这样的话,可以从一个子程序里调用该过程。)
13。运行参数查询
你可以运行Access参数查询并将其结果放置于Excel 电子表格里面。例如,过程
RunAccessParamQuery通过Access数据库的参 数查询运行Employee Sales by Country,并且
取得7/1/96和7/30/96区间内的记录。Employee Sales by Country查询要求两个参 数:开始
和结束时间。
应该使用mand对象的Paramenters集合定义这些参数:
cmd。Parameters(〃'Beginning Date'〃) = StartDate
cmd。Parameters(〃'Ending Date'〃) = EndDate
设置参数后,该查询就可以使用下述语句执行了:
Set rst = cmd。Execute 该查询返回的记录会被赋予对象变量Recordset并使用
CopyFromRecordset方法复制到工作表(参见本章后面更多相关使用信 息)。
Sub RunAccessParamQuery()
' prior to running this procedure you must set up
' references to the required object libraries
Dim cat As ADOX。Catalog
Dim cmd As ADODBmand
Dim rst As ADODB。Recordset
Dim i As Integer
Dim dbPath As String
Dim StartDate As String
Dim EndDate As String
dbPath = 〃C:Program FilesMicrosoft Office” _
& 〃OfficeSamplesNorthwind。mdb〃
StartDate = 〃7/1/96〃
EndDate = 〃7/31/96〃
Set cat = New ADOX。Catalog
cat。ActiveConnection = 〃Provider=Microsoft。Jet。OLEDB。4。0;〃 & _
〃Data Source=〃 & dbPath
Set cmd = cat。Procedures(〃Employee Sales by Country〃)mand
cmd。Parameters(〃'Beginning Date'〃) = StartDate
cmd。Parameters(〃'Ending Date'〃) = EndDate
Set rst = cmd。Execute
Sheets(1)。Select
For i = 0 To rst。Fieldsunt … 1
Cells(1; i + 1)。Value = rst。Fields(i)。Name
Next
With ActiveSheet
。Range(〃A2〃)pyFromRecordset rst
303
… 页面 320…
。Range(Cells(1; 1); Cells(1; rst。Fieldsunt))。Font。 _
Bold = True
。Range(〃A1〃)。Select
End With
Selection。CurrentRegionlumns。AutoFit
rst。Close
Set cmd = Nothing
Set cat = Nothing
End Sub
(译者:本人运行上述过程不成功,将Parameters参数改为cmd。Parameters(0) = StartDate,
cmd。Parameters(1) = EndDate才 运行成功。另外过程给定的日期范围查询结果为空,可以更
改查询日期范围。译者使用示例文件Nwind。mdb。自此以下,因删除 非法软件,译者使用Excel
2003英文版,Access 2002英文版)
14。调用 Access 函数
你可以通过自动控制从Excel里直接运行Access内置函数。下面的过程调用EuroConvert函数将
1000西班牙比赛塔转变为欧元。 EuroConvery函数使用欧盟确定的固定汇率。
Sub RunAccessFunction()
Dim objAccess As Object
On Error Resume Next
Set objAccess = GetObject(; 〃Access。Application〃)
'if no instance of Access is open; create a new one
If objAccess Is Nothing Then
Set objAccess = CreateObject(〃Access。Application〃)
End If
MsgBox 〃You will get 〃 & _
objAccess。EuroConvert(1000; 〃ESP〃; 〃EUR〃) & _
〃 euro dollars。 〃
Set objAccess = Nothing
End Sub
15。获取 Access 数据到 Excel 工作表
有很多种方法获取外部数据到Excel。本节给你示范下述不同的技巧将Access数据导入Excel工
作表:
* 使用GetRows方法
* 使用CopyFromRecordset方法
* 使�