我的方案是-我在.xls文件中有一组数据,在oracle数据库表中有另一组数据。我想使用excel vba导入两个数据,然后执行连接(类似sql),最后将数据保存在某些工作簿中。
问题-我不知道如何在vba中获取两组不同的数据,然后执行连接。在.Net中,有一个DataSet对象,我们可以在其中保存导入的数据,然后对它执行任何查询,但是vba如何做到这一点?
考虑以下使用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
:
Source2.xlsx
:
Source3.xlsx
:
结果工作表如下:
它适用于我的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/上为您的数据源查找更多连接字符串。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句