靠谱电子书 > 经管其他电子书 > excel_vba_编程教程(完整版) >

第85部分

excel_vba_编程教程(完整版)-第85部分

小说: excel_vba_编程教程(完整版) 字数: 每页4000字

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 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

返回目录 上一页 下一页 回到顶部 0 0

你可能喜欢的