首页 > 解决方案 > 在 Excel 中使用 SQL 组合来自不同位置的文件

问题描述

我正在尝试将来自不同文件位置的不同文件组合到一个电子表格中。我在网上找到了一些代码,如果它们来自同一位置,我可以在 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 代码以便它可以在多个位置工作?

谢谢

标签: sqlexcelvba

解决方案


LEFT JOIN假设所有 CSV 文件共享相同的ID字段,考虑多重查询。注意: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

推荐阅读