我有一个相当简单的问题,我无法找到答案。
我有以下SQL: -
Select a from filea where a in (select b from fileb)
我正在尝试使用VBA在Excel中运行它。
我遇到的问题是filea是AS / 400上的表,fileb是Excel电子表格中的表。也就是说,两个不同的数据源。 我无法找到一种方法将两个数据源合并到一个SQL语句中。
任何人都有任何好主意。
答案 0 :(得分:2)
下面的示例演示如何在单个SQL查询中从两个excel工作簿中获取数据(因为我没有任何AS / 400数据源),并将结果记录集放到工作表中。代码放在Letter, Value
A, 1
A, 2
A, 3
...
B, 2
B, 3
B, 4
...
...
E, 5
E, 6
E, 7
:
Query.xlsm
此外,有两个工作簿作为Option Explicit
Sub SqlWhereInTest()
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 & "\Src1.xlsx' " & _
"[Excel 12.0;Provider=Microsoft.ACE.OLEDB.12.0;Mode=Read;Extended Properties='HDR=YES;'] " & _
"WHERE Country IN " & _
"(SELECT CountryFilter FROM [Sheet1$] " & _
"IN '" & ThisWorkbook.Path & "\Src2.xlsx' " & _
"[Excel 12.0;Provider=Microsoft.ACE.OLEDB.12.0;Mode=Read;Extended Properties='HDR=YES;'])"
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
包含Customers:
Src1.xlsx
:
生成的工作表如下:
它适用于我的64位版Excel 2013。要使其与Src2.xlsx
和Excel 2003(未安装提供程序.xls
)兼容,您必须将ACE.OLEDB.12.0
替换为Provider=Microsoft.ACE.OLEDB.12.0;
,并将其替换为扩展属性{{ 1}} / Provider=Microsoft.Jet.OLEDB.4.0;
与Excel 12.0 Macro;
。实际上,连接对象的数据源不仅限于Excel 12.0;
文件(请参阅Excel 8.0;
中的Query.xlsm
部分),代码放在其中。它可能是另一个数据源,与一个数据源兼容可用的提供程序,基于文件或基于服务器。在http://www.connectionstrings.com/