我有一个SQL SELECT查询,其中我要加入2个或更多位于不同文件夹中的不同CSV文件。我在Excel VBA中使用ADO。如何指定ADO连接字符串的DataSource参数以接受2个不同的路径?
cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & "Data Source=" & strDataSource1 &","& strDataSource2 & ";Extended Properties=""text;HDR=Yes;FMT=Delimited"""
SQL查询:
SELECT * FROM [FILE1.CSV] AS F1 INNER JOIN [FILE2.CSV] AS F2 ON F1.ID = F2.ID
这是在一个查询中使用两个单独文件的示例代码。
Address.csv
Name,Address
Bruce,Dayton
Tony,10880 Malibu Point
Peter,20 Ingram Street
Names.csv
Name,Age
Bruce,49
Tony,48
Peter,28
将返回:
Sub test()
Dim oCon As New ADODB.Connection
Dim oRs As New ADODB.Recordset
Dim strSql As String
Dim strCon As String
strCon = "DBQ=C:\;Driver={Microsoft Text Driver (*.txt; *.csv)};MaxScanRows=8;"
'/ Update file paths accordingly
strSql = "Select n.*, a.[Address] " & _
"From C:\Folder\With\File\containing\Names.csv n " & _
"INNER JOIN C:\Folder\With\File\containing\Address.csv a " & _
"ON n.Name = a.Name "
oCon.Open strCon
Set oRs = oCon.Execute(strSql)
Sheet1.UsedRange.EntireRow.Delete
Sheet1.Cells(1).CopyFromRecordset oRs
End Sub
我终于使它工作了,并且还能够解决Power Query FROWN Error问题(在下面列出)。
请参见使用
back-ticks
括起文件路径的语法。还有INNER JOIN被替换为“,”,而ON被替换为WHERE条款。
列出我采取的步骤:
[第二和/或第三点可能已经解决了该问题,因为我看不到它在MS网站上有记录(我的试验和错误)。
对于可能面临相同问题的人:
SQL QUERY SYNTAX如下面的代码所示。我还可以将相同的SYNTAX与ACE.OLEDB.12驱动程序一起使用,并且在两种情况下均可以快速而良好地工作。
Option Explicit
Sub test()
Application.DisplayAlerts = False
Application.ScreenUpdating = False
Dim oCon As New ADODB.Connection
Dim oRs As New ADODB.Recordset
Dim strSql As String
Dim strCon As String
strCon = "Driver=Microsoft Access Text Driver (*.txt, *.csv);Dbq=" & ThisWorkbook.Path & ";Extensions=asc,csv,tab,txt;"
strSql = "SELECT n.*,a.[Address] "
strSql = strSql & " FROM `C:\Users\adam\Downloads`\Names.csv n"
strSql = strSql & ","
strSql = strSql & "`C:\Users\adam\Documents\TEST FOLDER`\Address.csv a"
strSql = strSql & " WHERE n.Name= a.Name"
oCon.Open strCon
Set oRs = Nothing
Set oRs = oCon.Execute(strSql)
' Sheet1.UsedRange.EntireRow.Delete
' Sheet1.Cells(1).CopyFromRecordset oRs
Dim oQT As QueryTable
On Error Resume Next
For Each oQT In Sheet1.QueryTables
oQT.Delete
Next oQT
Sheet1.ListObjects(1).Delete
On Error GoTo 0
Set oQT = Sheet1.ListObjects.Add(xlSrcQuery, oRs, Destination:=Sheet1.Cells(1, 1)).QueryTable
With oQT
.BackgroundQuery = False
.Refresh
End With
Application.ScreenUpdating = True
Application.DisplayAlerts = True
End Sub