如何在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
:
Source2.xlsx
:
Source3.xlsx
:
生成的工作表如下所示:
它适用于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