excel_vba_编程教程(完整版)-第85部分
按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
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方法
* 使用TransferSpreadsheet方法
* 使用OpenDatabase方法
* 创建一个文本文件
* 创建一个查询表
16。使用 GetRows 方法获取数据
你可以使用GetRows方法,将Access数据放置于Excel工作表。该方法返回一个二维的数组,第一个
下标是一个代表字段的数字, 而第二个下标则是代表记录的数字。记录和字段从0开始。 你通
过在VBA过程里使用DAO返回数据到Excel工作表。下述示例过程示范了如何运行Northwind数据
库里的Invoices查询,并记 录返回到Excel工作表。为了确保该过程工作正确,你必须首先建
立对Microsoft Access 3。6 Object Library的引用。参考本章前 面的创建对对象库的引用。
打开Access数据库后,GetData_withDAO2过程示范使用下述语句运行Invoices查询:
Set qdf = db。QueryDefs(〃Invoices〃)
Microsoft Access 3。6 对象库里的QueryDefs对象代表一选择或者行动查询。选择查询从一
个或者多个表或者查询里返回数据, 然而,行动查询允许你修改数据(使用行动查询你可
以添加,修改或者删除记录)执行查询后,过程将查询返回的记录通过OpenRecordset方法
放置到对象变量Recordset上,如下所示:
Set rst = qdf。OpenRecordset 接下来,通过RecordCount方法获取记录数目并且放置于变
量countR上。注意,为了获得正确的记录数目,记录指针必须通过 使用MoveLast方法移动
到Recordset里的最后一条记录。
rst。MoveLast
countR = rst。RecordCount 接着,过程提示用户输入要返回到工作表的记录数目。你可以点击
输入对话框上的取消按钮就此取消,或者输入记录数目获取数 据。如果你输入的数字大于该
304
… 页面 321…
记录数目,过程将获取全部记录。在获取记录之前,你必须使用方法MoveFirst将记录指针移
动到 第一条记录。如果你忘了做这个,那么记录指针会停留在最后一条记录上,并且将只能
获取一条记录。然后,该过程继续执行, 激活Get Records工作表和清除当前范围内容。首先,
通过使用Recordset对象的GetRows方法,记录将返回到一个二维数组的 Variant类型变量。接
着,过程在数组的两维中循环将记录放置到工作表中,从单元格A2开始。这一切完成后,另一
个循环将在 工作表第一行里放置字段名称,并且将每列设置为自动适应列宽,以正确现实数
据。
Sub GetData_withDAO2()
Dim db As DAO。Database
Dim qdf As DAO。QueryDef
Dim rst As DAO。Recordset
Dim recArray As Variant
Dim i As Integer
Dim j As Integer
Dim strPath As String
Dim a As Variant
Dim countR As Long
Dim strShtName As String
strPath = 〃C:Program FilesMicrosoft Office” _
& 〃OfficeSamplesnorthwind。mdb〃
strShtName = 〃Returned records〃
Set db = OpenDatabase(strPath)
Set qdf = db。QueryDefs(〃Invoices〃)
Set rst = qdf。OpenRecordset
rst。MoveLast
countR = rst。RecordCount
a = InputBox(〃This recordset contains 〃 & _
countR & 〃 records。〃 & vbCrLf _
& 〃Enter number of records to return: 〃; _
〃Get Number of Records〃)
If a = 〃〃 Or a = 0 Then Exit Sub
If a 》 countR Then
a = countR
MsgBox 〃The number you entered is too large。〃 & vbCrLf _
& 〃All records will be returned。〃
End If
Workbooks。Add
ActiveWorkbook。Worksheets(1)。Name = strShtName
rst。MoveFirst
With Worksheets(strShtName)。Range(〃A1〃)
。CurrentRegion。Clear
recArray = rst。GetRows(a)
For i = 0 To UBound(recArray; 2)
For j = 0 To UBound(recArray; 1)
。Offset(i + 1; j) = recArray(j; i)
Next j
Next i
For j = 0 To rst。Fieldsunt … 1
。Offset(0; j) = rst。Fields(j)。Name
。Offset(0; j)。EntireColumn。AutoFit
Next j
End With
db。Close
End Sub
17。使用 CopyFromRecordset 方法获取数据
想要将整个Recordset导入工作表的话,你可以使用Range对象的CopyFromRecordset方法。
该方法可以使用三个参数:Data, MaxRows和MaxColumns。只有第一个参数Data是必须的。
该参数可以是Recordset对象。可选参数MaxRows和MaxColumns 允许你明确应该返回的记录数
目(MaxRows)和字段数目(MaxColumns)。如果你忽略MaxRows参数,那么所有返回的记录 将
会复制到工作表;如果你忽略MaxColumns参数,那么所有的字段将会被获取。下面示范的过
程GetProducts使用ADO对象建
305
… 页面 322…
立对Northwind数据库的链接。为了让该过程工作正常,你必须先建立对Microsoft ActiveX
Data Objects 2。6 Library的引用(参 见本章前面有关创建对对象库引用的指导)。
Sub GetProducts()
Dim conn As New ADODBnnection
Dim rst As ADODB。Recordset
Dim strPath As String
strPath = 〃C:Program FilesMicrosoft Office” _
& 〃OfficeSamplesNorthwind。mdb〃
conn。Open 〃Provider=Microsoft。Jet。OLEDB。4。0;〃 _
& 〃Data Source=〃 & strPath & 〃;〃
conn。CursorLocation = adUseClient
' Create a Recordset from all the records
' in the Products table
Set rst = conn。Execute(mandText:=〃Products〃; _
Options:=adCmdTable)
' begin with the first record rst。MoveFirst
' transfer the data to Excel
' get the names of fields first
With Worksheets(〃Sheet3〃)。Range(〃A1〃)
。CurrentRegion。Clear
For j = 0 To rst