見出し画像

複数のフォルダーに含まれている (例)「item.csv」を全て、結合して1つのCSVファイルを新たに作成します

複数のCSVファイルを1つにまとめる必要があり、これも数十件あると手作業では、うんざりするためVBAで作成しました。
※複数のフォルダーに含まれている (例)「item.csv」を全て、結合して1つのCSVファイルを新たに作成します。
※サブフォルダーを含めた、全てのフォルダーを検索します。
※1行目のみタイトルで残して、残りは内容のみ結合されます。

実行方法

・E1に「フォルダーパス」を入力する
 ※例 C:\Users\suzukimotors\Desktop\test

・E2に「ファイル名」を入力する
 ※例 item.csv

・VBAエディタを起動します(Alt + F11キー)。

・「挿入」メニューから「モジュール」を選択して、新しいモジュールを作 成します。

・下記のコードをモジュールウィンドウに貼り付けます。

・マクロを実行します(Alt + F8キー、作成したマクロを選択して「実行」)。

Sub CombineCSVFilesIncludingAllColumns()
    Dim folderPath As String
    Dim outputPath As String
    Dim firstFile As Boolean
    Dim wkbAll As Workbook
    Dim targetSheet As Worksheet
    
    ' FileSystemObjectの初期化
    Dim fso As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
    
    ' E1からフォルダーパスを取得
    folderPath = ThisWorkbook.Sheets(1).Range("E1").Value
    ' 出力ファイルのパス
    outputPath = folderPath & "\完成.csv"
    
    ' 最初のファイルフラグを設定
    firstFile = True
    
    ' 作業用ブックを作成し、最初のシートを取得
    Set wkbAll = Workbooks.Add
    Set targetSheet = wkbAll.Sheets(1)
    
    ' 指定フォルダー内のファイルを処理するための再帰的なサブルーチンを呼び出す
    ProcessFolder folderPath, fso, targetSheet, firstFile
    
    ' 結合したデータを保存
    wkbAll.SaveAs fileName:=outputPath, FileFormat:=xlCSV
    wkbAll.Close saveChanges:=False
    
    MsgBox "ファイルの結合が完了しました。"
End Sub

Sub ProcessFolder(folderPath As String, fso As Object, targetSheet As Worksheet, ByRef firstFile As Boolean)
    Dim folder As Object
    Dim subFolder As Object
    Dim file As Object
    Dim wkbTemp As Workbook
    Dim ws As Worksheet
    Dim copyRange As Range
    Dim specifiedFileName As String
    
    ' E2から指定されたファイル名を取得
    specifiedFileName = ThisWorkbook.Sheets(1).Range("E2").Value
    
    Set folder = fso.GetFolder(folderPath)
    
    ' フォルダ内のファイルを処理
    For Each file In folder.Files
        If file.Name Like specifiedFileName Then ' "item.csv"からE2の値に変更
            ' ファイルを開く
            Set wkbTemp = Workbooks.Open(file.Path)
            Set ws = wkbTemp.Sheets(1)
            
            ' コピーする範囲を設定
            Dim lastRow As Long
            Dim lastColumn As Long
            lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
            lastColumn = ws.Cells(1, ws.Columns.Count).End(xlToLeft).Column
            Set copyRange = ws.Range(ws.Cells(1, 1), ws.Cells(lastRow, lastColumn))
            
            ' 最初のファイルからは全ての行をコピー、それ以外はタイトル行を除いてコピー
            If firstFile Then
                copyRange.Copy targetSheet.Cells(1, 1)
                firstFile = False
            Else
                copyRange.Offset(1, 0).Resize(copyRange.Rows.Count - 1).Copy _
                    targetSheet.Cells(targetSheet.Rows.Count, 1).End(xlUp).Offset(1, 0)
            End If
            
            ' 一時ブックを閉じる
            wkbTemp.Close saveChanges:=False
        End If
    Next file
    
    ' サブフォルダーに対しても同様に処理
    For Each subFolder In folder.SubFolders
        ProcessFolder subFolder.Path, fso, targetSheet, firstFile
    Next subFolder
End Sub

この記事が参加している募集

この記事が気に入ったらサポートをしてみませんか?