VBAで指定フォルダ内すべてのCSVをヘッダー付きで結合する方法
CSVファイルを複数結合したいならこれをすればOK

そんなコードを紹介していこう。何十メガあっても一瞬で結合させる。
注意として、CSVが同じ列あることが前提だ。

CSVを結合する前の準備

  1. VBAのエディタ内、上のツールから参照設定をひらく
  2. Microsoft Scripting Runtimeにチェックを入れる

これで準備はOK。まずはCSVファイルを配列として出力することから始めていこう。

Step1: CSVファイル一覧を配列として出力

Function getfileLists(ByVal folder_path As String) As Variant

    Dim target_file As String
    Dim files As String
    
    target_file = Dir(folder_path & "*.csv")
    
    Do While target_file <> ""
        files = files + target_file & ","
        target_file = Dir()
    Loop
    
    files = Left(files, Len(files) - 1)
    getfileLists = Split(files, ",")
    
End Function
  1. 指定フォルダからCSVを読み込む
  2. CSVファイル名をカンマ付きですべてつなげる
  3. Splitで配列として出力する

上記関数を使うと、指定フォルダパス内のCSVファイルが配列として出力される。

この関数をベースに次のコードを作成していく。

Step2: すべてのCSVファイルを結合する

Sub csvFilesMerge(ByVal target_folder As String, ByVal output_folder As String)

    Dim file_system As New FileSystemObject
    Dim text_stream As TextStream
    Dim text_stream_output As TextStream
    Dim results As String
    Dim i As Long
    Dim file_lists As Variant
    
    file_lists = getfileLists(target_folder)
    
    For i = LBound(file_lists) To UBound(file_lists)
        Set text_stream = file_system.OpenTextFile(target_folder & file_lists(i))
        
        If i = 0 Then
            ' CSVデータ(ヘッダー含め)を出力
            Set text_stream_output = file_system.OpenTextFile( _
                output_folder & "output.csv", ForWriting, True _
            )
            results = text_stream.ReadAll
            text_stream_output.Write results
        Else
            ' CSVデータ(一行目をスキップ)を追記
            Set text_stream_output = file_system.OpenTextFile( _
                output_folder & "output.csv", ForAppending, True _
            )
            text_stream.SkipLine
            results = text_stream.ReadAll
            text_stream_output.Write results
      End If
    
        text_stream.Close
        text_stream_output.Close
    Next i
    
End Sub
  1. CSVファイル名リストを取得する
  2. 最初のCSVならヘッダー含めすべてoutput.csvに出力する
  3. 2つ目以降のCSVなら1行目をスキップしてoutput.csvに追記する

簡単に説明すると上記のような感じ。コピペすればすべての準備は完了だ。

あとはざっくり使いかたを説明する。

csvFilesMergeの使いかた

Sub allDataMerge()

    Dim target_folder As String
    Dim output_folder As String

    target_folder = "C:\Users\[username]\Desktop\test\"
    output_folder = "C:\Users\[username]\Desktop\"
    
    Call csvFilesMerge(target_folder, output_folder)

End Sub
  • target_folder...結合したいCSVがあるフォルダパス
  • output_folder...結合したCSVを格納したいフォルダパス

使いかたは簡単。上記コードをコピペして「target_folder」「output_folder」を変えるだけでOK

output.csvが出力されることを確認できたら成功だ。

まとめ: これで簡単にCSVを結合しよう

今回紹介したコードを使えば、たとえ何十メガあっても一瞬で結合する。

これはわざわざ1行づつ読み込みしてないから。
VBAでやるならこの方法を使って簡単に、最速でCSVを結合してみよう。

関連【VBA】業務効率化に便利なツール【まとめ】

関連キーワード