Excel VBA | フォルダ内の全 CSV を 1 枚の Excel に統合するテンプレート

Excel VBA VBA
スポンサーリンク

今回は 「統合時にファイル名+タイムスタンプを同時に追加する版」「列名を動的に指定できる汎用版」 を紹介します。


1. 統合時にファイル名+タイムスタンプを同時に追加する版

CSVを統合するときに、元ファイル名と処理日時 を列として追加しておくと、後から「どのファイル由来でいつ統合したか」が追跡できます。

Sub MergeCSV_AddFileAndTimestamp()
    Dim folderPath As String, fileName As String
    Dim wsMaster As Worksheet
    Dim pasteRow As Long, lastRow As Long
    Dim ts As String
    
    folderPath = "C:\Data\CSV\"   ' ←環境に合わせて変更
    Set wsMaster = ThisWorkbook.Sheets("Master")
    wsMaster.Cells.Clear
    pasteRow = 1
    
    ts = Format(Now, "yyyy-mm-dd HH:NN:SS")  ' 現在日時
    
    fileName = Dir(folderPath & "*.csv")
    Do While fileName <> ""
        Dim wbCSV As Workbook, wsCSV As Worksheet
        Set wbCSV = Workbooks.Open(folderPath & fileName)
        Set wsCSV = wbCSV.Sheets(1)
        
        lastRow = wsCSV.Cells(wsCSV.Rows.Count, 1).End(xlUp).Row
        
        ' データコピー
        wsCSV.Range("A1:A" & lastRow).EntireRow.Copy wsMaster.Cells(pasteRow, 1)
        
        ' ファイル名とタイムスタンプ列を追加
        Dim copiedRows As Long, lastCol As Long
        copiedRows = lastRow
        lastCol = wsMaster.Cells(pasteRow, wsMaster.Columns.Count).End(xlToLeft).Column + 1
        
        wsMaster.Range(wsMaster.Cells(pasteRow, lastCol), wsMaster.Cells(pasteRow + copiedRows - 1, lastCol)).Value = fileName
        wsMaster.Range(wsMaster.Cells(pasteRow, lastCol + 1), wsMaster.Cells(pasteRow + copiedRows - 1, lastCol + 1)).Value = ts
        
        pasteRow = wsMaster.Cells(wsMaster.Rows.Count, 1).End(xlUp).Row + 1
        
        wbCSV.Close SaveChanges:=False
        fileName = Dir
    Loop
    
    MsgBox "CSV統合完了!(ファイル名+タイムスタンプ列付き)"
End Sub
VB

2. 列名を動的に指定できる汎用版

必要な列名を指定して、その列だけを統合する汎用的なテンプレートです。
※ 各CSVの1行目をヘッダ行として扱い、列名を検索してコピーします。

Sub MergeCSV_DynamicColumns()
    Dim folderPath As String, fileName As String
    Dim wsMaster As Worksheet
    Dim pasteRow As Long, lastRow As Long
    Dim targetCols As Variant
    Dim i As Long
    
    ' 抽出したい列名を配列で指定
    targetCols = Array("ID", "Value", "Date")
    
    folderPath = "C:\Data\CSV\"   ' ←環境に合わせて変更
    Set wsMaster = ThisWorkbook.Sheets("Master")
    wsMaster.Cells.Clear
    pasteRow = 1
    
    fileName = Dir(folderPath & "*.csv")
    Do While fileName <> ""
        Dim wbCSV As Workbook, wsCSV As Worksheet
        Set wbCSV = Workbooks.Open(folderPath & fileName)
        Set wsCSV = wbCSV.Sheets(1)
        
        lastRow = wsCSV.Cells(wsCSV.Rows.Count, 1).End(xlUp).Row
        
        ' ヘッダ行から列位置を検索
        Dim colIndex() As Long
        ReDim colIndex(LBound(targetCols) To UBound(targetCols))
        For i = LBound(targetCols) To UBound(targetCols)
            colIndex(i) = Application.Match(targetCols(i), wsCSV.Rows(1), 0)
        Next i
        
        ' ヘッダ行をコピー(最初のファイルのみ)
        If pasteRow = 1 Then
            For i = LBound(targetCols) To UBound(targetCols)
                wsMaster.Cells(1, i + 1).Value = targetCols(i)
            Next i
            pasteRow = 2
        End If
        
        ' データ行をコピー
        Dim r As Long
        For r = 2 To lastRow
            For i = LBound(targetCols) To UBound(targetCols)
                wsMaster.Cells(pasteRow, i + 1).Value = wsCSV.Cells(r, colIndex(i)).Value
            Next i
            pasteRow = pasteRow + 1
        Next r
        
        wbCSV.Close SaveChanges:=False
        fileName = Dir
    Loop
    
    MsgBox "CSV統合完了!(指定列のみ抽出)"
End Sub
VB

✅ まとめ

  • ファイル名+タイムスタンプ追加版 → データの出所と処理日時を追跡可能。
  • 列名動的指定版 → 必要な列だけを柔軟に抽出できる汎用設計。
VBA
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました