excel_vba_编程教程(完整版)-第86部分
按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
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 filepath:= _
〃C:Program FilesMicrosoft OfficeOffice” _
& 〃SamplesNorthwind。mdb〃
objAccess。DoCmd。TransferSpreadsheet _
TransferType:=acExport; _
SpreadsheetType:=acSpreadsheetTypeExcel9; _
TableName:=〃Shippers〃; _
Filename:=〃C:Shippers。xls〃; _
HasFieldNames:=True; _
Range:=〃Sheet1〃
objAccess。Quit
Set objAccess = Nothing
End Sub
(译者:原文为acSpreadsheetTypeExcel10运行失败)
图15…12 使用TransferSpreadsheet方法可以将Access表里的数据导出到Excel电子表格里
19。使用 OpenDatabase 方法
Excel 2002提供了一个操纵数据库的新方法,OpenDatabase方法,应用于Workbooks集合,是将
数据库数据导入Excel电子表
格最容易的方法。该方法要求你明确你想要打开的数据库文件名称。下面的示例过程打开位于
C:Program FilesMicrosoft
OfficeOffice10Samples文件夹里的Northwind数据库。当你运行该过程,Excel显示一个对
话框,列出了该数据库里的所有表和 查询(参见图15…13)。从列表里选择后,就会打开一
个全新的工作簿,显示被选上的表或者查询里的数据。
Sub OpenAccessDatabase()
Workbooks。OpenDatabase _
Filename:=〃C:Program FilesMicrosoft Office” _
& 〃Office10SamplesNorthwind。mdb〃
End Sub
307
… 页面 324…
图15…13 使用带一个参数(数据库文件名称)的OpenDatabase方法允许从一个列表框里选择一
个表或者查询
图15…14 使用Excel 2002里新增的OpenDatabase方法可以轻易地将储存在表或者查询里的数据
库数据导入Excel工作簿
OpenDatabase方法有四个可选参数,可供你进一步限定你要获取的数据:
OpenDatabase方法的可选参数 数据类型 描述
mandText Variant SQL查询字符串。参见使用该参数的
示例
mandType Variant 查询的命令类型。可
用的命令类型有:Deault,SQL和表 BackgroundQuery
Variant 查询的背景。可以是以下常数之
一:PivotCache或者QueryTable ImportDataAs
Variant 明确查询的格式。使用
xlQueryTable报告创建一个查询表,或者
xlPivotTableReport来创建一个数据透视表
接下来的示例过程示范了如何使用带可选参数的OpenDatabase方法。该过程从获取的客户记录
创建了一个数据透视表。当你运 行该过程时,Excel就会基于提供的查询的字符串显示一个可
用字段的列表。你可以拖曳一个或者多个字段到该透视表中,以创 建数据透视报告。图15…15
显示了按国家分类的CustomerId字段。
Sub CountCustomersByCountry()
Workbooks。OpenDatabase _
Filename:=〃C:Program FilesMicrosoft Office” _
& 〃Office10SamplesNorthwind。mdb〃; _
mandText:=〃Select * from Customers〃; _
BackgroundQuery:=PivotTable; _
ImportDataAs:=xlPivotTableReport
End Sub
308
… 页面 325…
(译者:Excel 2003+Access 2002运行该过程有问题:BackgroundQuery: = PivotTable。 此
处有矛盾,上面的参数解释说该参 数为PivotCache或者QueryTable,而这里却是PivotTable。
这三个参数均导致错误。搜索对象浏览器说该参数为布尔类型。译 者将该参数改为…1,1,2,
10,True,False等运行,结果没有 区别。)
图15…15 使用OpenDatabase方法的可选参数,你可以明确获取数据库数据到一个特定的格式,
例如数据透视报告或者查询表报告
20。从 Access 数据创建文本文件
你可以使用Excel的VBA过程从Access数据创建一个以逗号或者tab分开的文本文件。文本文件
对于传输大量数据到电子表格特 别有用。下面的示例程序示范了如何从一个ADO recordset创
建一个tab分开的文本文件。为了确保该过程运行正确,你必须创建
对Microsoft ActiveX Data Objects 2。6 Library的引用。参考第八章中操作文本文件的详细
信息。运行该过程后,请在Excel
里打开C:ProductsOver50。txt
Sub CreateTextFile()
Dim strPath As String
Dim conn As New ADODBnnection
Dim rst As ADODB。Recordset
Dim strData As String
Dim strHeader As String
Dim strSQL As String
strPath = 〃C:Program FilesMicrosoft Office” _
& 〃OfficeSamplesNorthwind。mdb〃
conn。Open 〃Provider=Microsoft。Jet。OLEDB。4。0;〃 _
& 〃Data Source=〃 & strPath & 〃;〃
conn。CursorLocation = adUseClient
strSQL = 〃SELECT * FROM Products WHERE UnitPrice 》 50〃
Set rst = conn。Execute(mandText:=strSQL; Options:=adCmdText)
'save the recordset as a tab…delimited file
strData = rst。GetString(StringFormat:=adClipString; _
ColumnDelimeter:=vbTab; _
RowDelimeter:=vbCr; _
nullExpr:=vbNullString)
Open 〃C:ProductsOver50。txt〃 For Output As #1
For Each f In rst。Fields
strHeader = strHeader + f。Name & vbTab
Next
Print #1; strHeader
Print #1; strData
Close #1
End Sub
(译者:如果为强制要求声明对象则还需声明变量f。) 在第八章中,你学习了如何使用
FileSystemObject操作文本文件。下面的过程演示了如何使用该对象来创建一个名为
309
… 页面 326…
ProductsOver100。txt的文本文件:
Sub CreateTextFile2()
Dim strPath As String
Dim conn As New ADODBnnection
Dim rst As ADODB。Recordset
Dim strData As String
Dim strHeader As String
Dim strSQL As String
Dim fso As Object
Dim myFile As Object
Set fso = CreateObject(〃Scripting。FileSystemObject〃)
Set myFile = fso。CreateTextFile(〃C:ProductsOver100。txt〃; True)
strPath = 〃C:Program FilesMicrosoft Office” _
& 〃OfficeSamplesNorthwind。mdb〃
conn。Open 〃Provider=Microsoft。Jet。OLEDB。4。0;〃 _
& 〃Data S