Excel VBA 逆引き集 | フォルダ内CSV連結

Excel VBA
スポンサーリンク

フォルダ内CSV連結の基本

業務でよくあるのが「フォルダにある複数のCSVファイルをまとめて1つのシートに連結したい」というケースです。
初心者向けに、コード例やテンプレートをかみ砕いて説明します。


基本の考え方

  • フォルダ内CSV連結とは?
    指定フォルダにある複数のCSVファイルを順番に読み込み、1つのシートに連結してまとめる処理。
  • 用途:
    • 毎日出力されるCSVを月単位でまとめる
    • 複数システムからのデータを統合
    • 手作業でコピー&ペーストする手間を削減

テンプレ1:フォルダ内CSVを順番に連結

Sub MergeCSV_Folder()
    Dim ws As Worksheet: Set ws = Worksheets("Data")
    Dim fso As Object, folder As Object, file As Object
    Dim rowCount As Long
    
    ' 取り込み先シート初期化
    ws.Cells.Clear
    rowCount = 1
    
    ' フォルダ選択ダイアログ
    Dim folderPath As String
    With Application.FileDialog(msoFileDialogFolderPicker)
        .Title = "CSVフォルダを選択してください"
        If .Show <> -1 Then Exit Sub
        folderPath = .SelectedItems(1)
    End With
    
    ' FileSystemObjectでフォルダ内のファイルを取得
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set folder = fso.GetFolder(folderPath)
    
    For Each file In folder.Files
        If LCase(fso.GetExtensionName(file.Name)) = "csv" Then
            ' CSVを開いてコピー
            Workbooks.Open file.Path
            ActiveSheet.UsedRange.Copy ws.Cells(rowCount, 1)
            
            ' 行数を更新
            rowCount = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row + 1
            
            ' CSVを閉じる
            ActiveWorkbook.Close False
        End If
    Next file
    
    MsgBox "フォルダ内のCSVを連結しました!"
End Sub
VB
  • ポイント:
    • FileDialog でフォルダを選択。
    • FileSystemObject でファイル一覧を取得。
    • CSVを順番に開いてコピー。

テンプレ2:ヘッダー行を1回だけ取り込む

複数CSVに同じヘッダーがある場合、最初のファイルだけヘッダーを取り込み、以降はデータ部分だけを連結。

Sub MergeCSV_HeadersOnce()
    Dim ws As Worksheet: Set ws = Worksheets("Data")
    Dim fso As Object, folder As Object, file As Object
    Dim rowCount As Long, firstFile As Boolean
    
    ws.Cells.Clear
    rowCount = 1
    firstFile = True
    
    Dim folderPath As String
    With Application.FileDialog(msoFileDialogFolderPicker)
        .Title = "CSVフォルダを選択してください"
        If .Show <> -1 Then Exit Sub
        folderPath = .SelectedItems(1)
    End With
    
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set folder = fso.GetFolder(folderPath)
    
    For Each file In folder.Files
        If LCase(fso.GetExtensionName(file.Name)) = "csv" Then
            Workbooks.Open file.Path
            
            If firstFile Then
                ActiveSheet.UsedRange.Copy ws.Cells(rowCount, 1)
                firstFile = False
            Else
                ' ヘッダーを除いたデータ部分だけコピー
                ActiveSheet.Range("A2", ActiveSheet.Cells(ActiveSheet.Rows.Count, 1).End(xlUp).EntireRow).Copy ws.Cells(rowCount, 1)
            End If
            
            rowCount = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row + 1
            ActiveWorkbook.Close False
        End If
    Next file
    
    MsgBox "CSVをヘッダー付きで連結しました!"
End Sub
VB
  • ポイント:
    • 最初のファイルだけヘッダーをコピー。
    • 2つ目以降はデータ部分だけコピー。

テンプレ3:直接読み込んで連結(高速処理)

Sub MergeCSV_Direct()
    Dim ws As Worksheet: Set ws = Worksheets("Data")
    Dim fso As Object, folder As Object, file As Object
    Dim lineData As String, arr As Variant
    Dim rowCount As Long
    
    ws.Cells.Clear
    rowCount = 1
    
    Dim folderPath As String
    With Application.FileDialog(msoFileDialogFolderPicker)
        .Title = "CSVフォルダを選択してください"
        If .Show <> -1 Then Exit Sub
        folderPath = .SelectedItems(1)
    End With
    
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set folder = fso.GetFolder(folderPath)
    
    For Each file In folder.Files
        If LCase(fso.GetExtensionName(file.Name)) = "csv" Then
            Open file.Path For Input As #1
            Do Until EOF(1)
                Line Input #1, lineData
                arr = Split(lineData, ",")
                ws.Cells(rowCount, 1).Resize(1, UBound(arr) + 1).Value = arr
                rowCount = rowCount + 1
            Loop
            Close #1
        End If
    Next file
    
    MsgBox "CSVを直接読み込んで連結しました!"
End Sub
VB
  • ポイント:
    • Open ... For Input で直接読み込み。
    • Split でカンマ区切りを配列化。
    • Excelに高速で書き込める。

例題で練習

'例1:フォルダ内のCSVを順番に連結
'例2:ヘッダー行を1回だけ取り込む
'例3:直接読み込んで高速連結
VB

初心者向けポイント

  • フォルダ選択ダイアログを使うと便利 → ユーザーが自由にフォルダを選べる。
  • FileSystemObjectでファイル一覧を取得 → フォルダ内のCSVを自動処理。
  • ヘッダー行は最初だけ取り込む工夫が必要 → 重複を防げる。
  • Openステートメント+Splitで高速処理 → 大量データでも効率的。

👉 この「フォルダ内CSV連結テンプレ」を覚えておけば、Excel VBAで 複数CSVファイルを効率的に連結して1つのシートにまとめる処理 を簡単に作成できます。

タイトルとURLをコピーしました