《excel_vba_编程教程(完整版)》

下载本书

添加书签

excel_vba_编程教程(完整版)- 第96节


按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 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
小提示:按 回车 [Enter] 键 返回书目,按 ← 键 返回上一页, 按 → 键 进入下一页。 赞一下 添加书签加入书架