使用SQL组合Excel中不同位置的文件

时间:2018-06-14 16:12:05

标签: sql excel-vba vba excel

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

由于

1 个答案:

答案 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