当前位置:  开发笔记 > 数据库 > 正文

如何在excel vba中加入从两个不同数据源创建的两个记录集

如何解决《如何在excelvba中加入从两个不同数据源创建的两个记录集》经验,为你挑选了1个好方法。

我的场景是 - 我在.xls文件中有一组数据,在oracle数据库表中有另一组数据.我想使用excel vba导入两个数据然后执行join(sql like),最后将数据保存在某个工作簿中.

问题 - 我不知道如何在vba中获取两组不同的数据然后执行连接.在.Net中有DataSet对象,我们可以在其中保存导入的数据,然后对其执行任何查询但是vba我该怎么做?



1> omegastripes..:

请考虑使用ADO的以下示例.该代码允许从单个SQL查询(Jet SQL)中的多个数据源获取数据,特别是从.xlsx文件中生成联合,并将结果记录集放入工作表.遗憾的是,我没有可用的Oracle数据源进行测试,但您也可以通过Oracle ODBC驱动程序与ADO(与任何其他数据库一样)直接连接到Oracle .

代码放在Query.xlsm:

Option Explicit

Sub SqlUnionTest()

    Dim strConnection As String
    Dim strQuery As String
    Dim objConnection As Object
    Dim objRecordSet As Object

    strConnection = _
        "Provider=Microsoft.ACE.OLEDB.12.0;" & _
        "User ID=Admin;" & _
        "Data Source='" & ThisWorkbook.FullName & "';" & _
        "Mode=Read;" & _
        "Extended Properties=""Excel 12.0 Macro;"";"

    strQuery = _
        "SELECT * FROM [Sheet1$] " & _
        "IN '" & ThisWorkbook.Path & "\Source1.xlsx' " & _
        "[Excel 12.0;Provider=Microsoft.ACE.OLEDB.12.0;Mode=Read;Extended Properties='HDR=YES;'] " & _
        "UNION " & _
        "SELECT * FROM [Sheet1$] " & _
        "IN '" & ThisWorkbook.Path & "\Source2.xlsx' " & _
        "[Excel 12.0;Provider=Microsoft.ACE.OLEDB.12.0;Mode=Read;Extended Properties='HDR=YES;'] " & _
        "UNION " & _
        "SELECT * FROM [Sheet1$] " & _
        "IN '" & ThisWorkbook.Path & "\Source3.xlsx' " & _
        "[Excel 12.0;Provider=Microsoft.ACE.OLEDB.12.0;Mode=Read;Extended Properties='HDR=YES;'] " & _
        "ORDER BY ContactName;"

    Set objConnection = CreateObject("ADODB.Connection")
    objConnection.Open strConnection
    Set objRecordSet = objConnection.Execute(strQuery)
    RecordSetToWorksheet Sheets(1), objRecordSet
    objConnection.Close

End Sub

Sub RecordSetToWorksheet(objSheet As Worksheet, objRecordSet As Object)

    Dim i As Long

    With objSheet
        .Cells.Delete
        For i = 1 To objRecordSet.Fields.Count
            .Cells(1, i).Value = objRecordSet.Fields(i - 1).Name
        Next
        .Cells(2, 1).CopyFromRecordset objRecordSet
        .Cells.Columns.AutoFit
    End With

End Sub

注意,ThisWorkbook.Path不应该包含'在路径中.否则,您必须通过更换逃脱他们'''.

此外,在同一文件夹中有三个数据源文件Query.xlsm.

Source1.xlsx:

Source1.xlsx

Source2.xlsx:

Source2.xlsx

Source3.xlsx:

Source3.xlsx

生成的工作表如下:

Query.xlsm结果

它适用于我的64位版Excel 2013.为了使其与兼容.xls和Excel 2003(其中提供商ACE.OLEDB.12.0未安装),必须更换Provider=Microsoft.ACE.OLEDB.12.0;Provider=Microsoft.Jet.OLEDB.4.0;,而且在扩展属性Excel 12.0 Macro;/ Excel 12.0;Excel 8.0;.您可以轻松地将WHERE子句和其他SQL内容添加到查询中.实际上,连接对象的数据源不限于Query.xlsm代码所在的唯一文件.它可以是另一个数据源,与其中一个可用的提供程序兼容,可以是基于文件的,也可以是基于服务器的.在http://www.connectionstrings.com/上查找数据源的更多连接字符串

推荐阅读
赛亚兔备_393
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有