如何在Excel VBA中join两个不同数据源创build的logging集

我的情况是 – 我在.xls文件中有一组数据,在oracle数据库表中有另一组数据。 我想使用Excel VBA导入两个数据,然后执行连接(SQL像),最后保存在一些工作簿中的数据。

问题 – 我不知道如何获得vba中的两组不同的数据,然后执行连接。 在.Net有DataSet对象,我们可以保存导入的数据,然后执行任何查询,但vba我怎么能做到这一点?

考虑下面的例子。 该代码允许从单个SQL查询中的多个数据源获取数据,特别是使用.xlsx文件创build联合,并将结果logging集放到工作表中。 代码放置在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 

Query.xlsm的同一文件夹中还有三个数据源文件。 不幸的是,我没有可用的Oracle数据源来testing。

Source1.xlsx

Source1.xlsx

Source2.xlsx

Source2.xlsx

Source3.xlsx

Source3.xlsx

生成的工作表如下所示:

Query.xlsm结果

它适用于64位版本的Excel 2013。 为了使它与.xls和Excel 2003(未安装提供程序ACE.OLEDB.12.0 )兼容,您必须replaceProvider=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/上查找有关数据源的更多连接string