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

下载本书

添加书签

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


按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
   End With  
 End Sub 下面的过程更通用,因为它允许你在任意Access数据库里显示任意Access报表。注意, 
 该过程需要两个字符串参数:Access数 据库名称和报表名称。  
 Sub DisplayAccessReport2(strDb As String; strRpt As String)  
   Set objAccess = New Access。Application  
   With objAccess  
      。OpenCurrentDatabase (strDb)  
      。DoCmd。OpenReport strRpt; acViewPreview  
      。DoCmd。Maximize  
      。Visible = True  
   End With  
 End Sub  
 你可以从立即窗口或者从如下所示的一个子过程里运行DisplayAccessReport2:  
 □ 从立即窗口 
     运行 
                                         300 

… 页面 317…

     DisplayAcce 
     ssReport2过 
     程 在立即窗 
     口里在一行 
     输入下述语 
     句:  
     Call DisplayAccessReport2(〃C:Program FilesMicrosoft  
     OfficeOfficeSamplesNorthwind。mdb〃; 〃Sales Totals by  
     Amount〃)  
 □   
 从一个子过程运行DisplayAccessReport2过程:  
      ' Enter the following procedure in the Code window  
      Sub ShowReport()  
        Dim strDb As String  
        Dim strRpt As String  
        strDb = InputBox(〃Enter the name of the database (full path): 〃)  
        strRpt = InputBox(〃Enter the name of the report:〃)  
        Call DisplayAccessReport2(strDb; strRpt)  
      End Sub  
        
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
                                                                               
 图15…10 Access报表可以在Excel VBA过程里打开  

11。运行 Access 查询  

 接下来的两个程序例子将示范如何从Excel VBA过程里运行Access查询。在Access用户界面最 
 常用的查询类型是选择查询 和参 数查询。两个示例程序都使用Range对象的 
 CopyFromRecordset方法将查询到的数据放置到Excel工作表。和数据库的链接是通 过ADO建立 
 的。  
 ADOX对象库(参见本章前面的图15…4)让你访问数据库结构,安全和储存在数据库里面的过程。 
 该库中最上面的对象是Catalog 对象,代表整个数据库。该对象包含一些数据库成员,例如, 

                                         301 

… 页面 318…

 表,字段,索引,视图和储存的过程。使用Catalog对象的Create 方法,你可以创建一个新的 
 数据库,例如:  
 Dim cat As ADOX。Catalog  
 Set cat = New ADOX。Catalog  
 cat。Create 〃Provider=Microsoft。Jet。OLEDB。4。0;〃 & _  
       〃Data Source=C:ExcelDump2。mdb;〃 上面的例子示范如何使用ActiveX数据对象创建新 
 的数据库。回想一下,在本章前面你使用DAO创建了一个叫做NewDB_DA的新 数据库。 示例过程 
 RunAccessQuery,首先创建一个可以指向该Catalog对象的对象变量cat。接着,Catalog对象 
 的属性 ActiveConnection定义对数据库创建链接的方法:  
 Set cat = New ADOX。Catalog  
 cat。ActiveConnection = 〃Provider=Microsoft。Jet。OLEDB。4。0;〃 & _  
       〃Data Source=〃 & dbPath  
   
 ADODB对象库里的mand对象(参见本章前面的图15…3)明确你为了从数据源获取数据而想 
 要执行的命令。我们的过程尝 试访问数据库某特定查询。  
 Set cmd = cat。Views(strQryName)mand Views集合,ADOX对象库的一部分,包含某特定 
 目录的所有View对象。视图是筛选后的一组记录,或者由其它表或者视图创建 的虚拟表。获 
 得对数据库里需要的查询的访问后,你就可以按下述方式运行查询:  
 Set rst = cmd。Execute mand对象的Execute方法允许你激活某个特定的查询,SQL语句, 
 或者储存的过程。然后,返回的一组记录会通过Set关键 字被赋予对象变量Recordset。创建 
 该组记录后,这些记录就会通过使用方法CopyFromRecordset放置到Excel工作表中。      

12。运行选择查询  

 Sub RunAccessQuery(strQryName As String)  
   ' 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  
   dbPath = 〃C:Program FilesMicrosoft Office” _  
        & 〃OfficeSamplesNorthwind。mdb〃  
   Set cat = New ADOX。Catalog  
   cat。ActiveConnection = _  
        〃Provider=Microsoft。Jet。OLEDB。4。0;〃 & _  
        〃Data Source=〃 & dbPath  
   Set cmd = cat。Views(strQryName)mand  
   Set rst = cmd。Execute  
   Sheets(2)。Select  
   For i = 0 To rst。Fieldsunt … 1  
        Cells(1; i + 1)。Value = rst。Fields(i)。Name  
   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方法  
 *   使�
小提示:按 回车 [Enter] 键 返回书目,按 ← 键 返回上一页, 按 → 键 进入下一页。 赞一下 添加书签加入书架