我正在尝试将来自不同文件位置的不同文件合并到一个电子表格中。我在网上找到了一些代码,通过它我可以在VBA中使用SQL来组合它们,如果它们来自同一个位置:
代码的摘录在这里:
Sub sample()
Set objConnection = CreateObject("ADODB.Connection")
Set objRecordSet = CreateObject("ADODB.Recordset")
objConnection.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & ThisWorkbook.path & ";" & _
"Extended Properties=""text;HDR=YES;FMT=Delimited"""
StrSQL="SELECT * FROM samplesheet.csv"
objRecordSet.Open StrSQL
...
End Sub
在上面的代码中,我只能指定一个位置作为数据源。有没有其他方法来编写SQL代码,以便它可以在多个位置工作?
由于
答案 0 :(得分:0)
假设所有CSV文件共享相同的 ID 字段,请考虑多个LEFT JOIN
查询。 注意:SQL查询需要每个FROM
表和JOIN
表的括号配对。
StrSQL= "SELECT * " _
& " FROM ((samplesheet.csv t1 " _
& " LEFT JOIN [text;database=" & ThisWorkbook.Path & "].samplesheet2.csv AS t2" _
& " ON t1.ID = t2.ID)" _
& " LEFT JOIN [text;database=" & ThisWorkbook.Path & "].samplesheet3.csv AS t3" _
& " ON t1.ID = t3.ID)"
请注意,任何JET / ACE引擎查询都允许JOIN
语句的有限限制,例如依赖于数据的查询。
对于大量CSV文件,请考虑遍历目录。下面按列将每个记录集复制到相邻的放置位置。 注意:由于迭代过程,此处未使用 ID 连接。数据只是并排放置。
Dim objConnection As Object, objRecordSet As Object
Dim lastColumn As Long
Dim csvFile As String, StrSQL As String
Set objConnection = CreateObject("ADODB.Connection")
objConnection.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & ThisWorkbook.Path & ";" & _
"Extended Properties=""text;HDR=YES;FMT=Delimited"""
csvFile = Dir(ThisWorkbook.Path & "\*csv")
Do While Len(csvFile) > 0
StrSQL = "SELECT * FROM [" & csvFile & "] ORDER BY ID;"
' INITIALIZE RECORDSET
Set objRecordSet = CreateObject("ADODB.Recordset")
objRecordSet.Open StrSQL, objConnection
' SAVE TO WORKSHEET
With ThisWorkbook.Worksheets("Sheet1")
lastColumn = .Cells(1, .Columns.Count).End(xlToLeft).Column + 1
.Range(.Cells(1, lastColumn), .Cells(1, lastColumn)).CopyFromRecordset objRecordSet
End With
' UNINITIALIZE RECORDSET
objRecordSet.Close
Set objRecordSet = Nothing
csvFile = Dir
Loop
objConnection.Close
Set objConnection = Nothing