如何在vba中用ado访问各种不同的数据源?

Microsoft ActiveX Data Objects (ADO) 是一个数据访问技术,利用ADO可以在不打开外部数据源的情况下读取数据。它的主要优势是易于使用,高速,低内存占用,同时可以访问各种外部数据源,如Access 数据库、sql server 数据库、excel 工作簿等。

利用Ado读取外部数据源,需要提供正确的连接字符串才能访问。

连接字符串就好比我们进入一个别人的家里需要具有钥匙或者指纹这些身份的识别一样。

利用ado访问外部的数据源,需要提供正确的连接字符串作为”开门的钥匙”,打开了以后才能随心所欲地读取数据。

由于利用ado可以访问各种各样的数据源,相应的连接字符串也有各种各样。

利用ado访问各种数据源的一般步骤如下:

  1. 使用ADO Connection对象的Open方法先与数据源建立连接,打开数据源。
  2. 使用ADO Connection对象的Execute方法执行相应的SQL语句,返回Recordset 对象。
  3. 然后操作Recordset 对象获取字段的内容或者其它想要的数据。

以下是一个通用的用ado访问excel工作簿的代码:

Sub QQ1722187970()
    Dim oRecrodset
    Dim oConStr
    Dim sSql As String
    Dim oWk As Worksheet
    Dim sConStr As String
    Set oWk = ThisWorkbook.Worksheets.Add
    sVersion = Excel.Application.Version
    If sVersion <= 12 Then
        sConStr = "Provider='Microsoft.Jet.OLEDB.4.0';Data Source=" & Excel.ThisWorkbook.Path & "\test.xlsx" & ";Extended Properties='Excel 8.0;HDR=YES'"
    Else
        sConStr = "Provider='Microsoft.ACE.OLEDB.12.0';Data Source=" & Excel.ThisWorkbook.Path & "\test.xlsx" & ";Extended Properties='Excel 12.0;HDR=YES'"
    End If
    Debug.Print sConStr
    Set oConStr = CreateObject("ADODB.Connection")
    '使用Connection连接数据源,并用Execute方法执行对应的SQL语句生成Recrodset对象
    oConStr.Open sConStr
    sSql = "select * from [Sheet1$]"
    Set oRecrodset = oConStr.Execute(sSql)
    With oRecrodset
        '循环导入字段名
        For i = 1 To .Fields.Count
            oWk.Cells(1, i) = .Fields(i - 1).Name
        Next
        oWk.Cells(2, 1).CopyFromRecordset oRecrodset
    End With
    Set oRecrodset = Nothing
End Sub

特别注意的是,Extended Properties=’Excel 12.0;HDR=YES'” 中的12.0或者8.0并不是excel的版本号,而是Provider的版本号。所以不需要根据excel的不同版本来修改这个数值。

       

仅有1条评论 发表评论

  1. exceloffice / 文章作者

    只能访问局域网内的文件

  2. comb007 /

    请问前辈,adodb.connection能不能从外网连接EXCEL
    “Provider=’Microsoft.ACE.OLEDB.12.0′;Data Source=” & Excel.ThisWorkbook.Path & “\test.xlsx” & “;Extended Properties=’Excel 12.0;HDR=YES'”
    就是把Excel.ThisWorkbook.Path这个路径改成外网路径,能实现吗?
    我已经神卓穿透了,自己通过IIS建了WEB站点,就是说我的EXCEL文件从外网可以访问了,如何通过上面的代码来访问?
    望前辈不吝赐教!

发表评论