按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
作表:
* 使用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。Fieldsunt … 1
。Offset(0; j) = rst。Fields(j)。Name
Next j
。Offset(1; 0)pyFromRecordset rst
。CurrentRegionlumns。AutoFit
End With
rst。Close
conn。Close
End Sub
上述过程从Northwind数据库的Products表中复制所有的记录到Excel工作表。如果你想要复
制某一些记录的话,那么你可以使用 MaxRows参数,如下所示:
。Offset(1; 0)pyFromRecordset rst; 5 该语句告诉VB仅复制5条记录。
该Offset方法导致输入到电子表格里的记录从电子表格当前行的第二行开
始。 想要仅将两个表字段的所有记录发送到工作表的话,可以使用下述语
句:
。Offset(1; 0)pyFromRecordset rst; ; 2
该语句告诉VB从开始两列复制所有数据。在rst和数字2之间的逗号是个占位符,给被忽略的
MaxRows参数。
18。使用 TransferSpreadsheet方法获取数据
可能使用TransferSpreadsheet方法在当前Access数据库(。mdb)或者Access项目(。adp)和
电子表格之间导入或者导出数据。 你也可以将Excel电子表格里的数据链接到当前Access数据
库。对于链接的电子表格,当Access仍然允许从Excel程序里完全访 问时,你可以使用Access
来查看和编辑电子表格数据。在VB里执行TransferSpreadsheet操作的TransferSpreadsheet
方法语法 如下:
DoCmd。TransferSpreadsheet 'transfertype''; spreadsheettype'; _
tablename; filename '; hasfieldnames''; range' 参数transfertype可以是以下常
数之一:acImport(缺省设置),acExport或者acLink。这些常数定义数据是否是导入,导出
或者 链接到数据库。
参数spreadsheettype可能是下述常数之一:
0 acSpreadsheetTypeExcel3 (default setting)
6 acSpreadsheetTypeExcel4
5 acSpreadsheetTypeExcel5
5 acSpreadsheetTypeExcel7
8 acSpreadsheetTypeExcel8
8 acSpreadsheetTypeExcel9
2 acSpreadsheetTypeLotusWK1
3 acSpreadsheetTypeLotusWK3
7 acSpreadsheetTypeLotusWK4
不难猜到,spreadsheettype参数明确电子表格名称和版本号。 tablename参数是个字符串表
306
… 页面 323…
达式,明确你想要往里面导入电子表格数据,或者从里面导出电子表格数据,或者将电子表格
数据 链接到的Access表的名称。除了表名称之外,你也需要明确你想要导出数据到电子表格
的选择查询名称。 hasfieldnames参数是个逻辑值True(…1)或者False(0)。True表明工作表第
一行包含字段名称;False则表示第一行包含普通数据。 缺省设置为False(第一行里没有字
段名称)。 参数range是个字符串表达式,明确工作表中的单元格区域或者区域名称。该参数
仅用于导入。如果你忽略range参数的话,那 么整个电子表格将会被导入。如果你想要导出的
话,就将该参数空在那里,除非你需要明确该工作表名称。 下面示范的ExportData示例程序
使用TransferSpreadsheet方法从Northwind数据库里的Shippers表中导出数据到
Shippers。xls电 子表格中。注意,该过程使用了自动控制来建立对Access的链接。建立链接后,
使用OpenCurrentDatabase方法打开Northwind 数据库。运行完ExportData过程后,请打开
C:Shippers。xls文件查看获取的数据。
‘ declare at the top of the module
Dim objAccess As Access。Application
Sub ExportData()
Set objAccess = CreateObject(〃Access。Application〃)
objAccess。OpenCurrentDatabase filep