こちらの記事はエクセルVBAをあまり知らない方でも利用できる「コピペでVBA(Excel)」としてもご活用できます。詳しくはこちらをご確認ください。
複数のCSVをマージ(結合)する - マクロ解説
このコードを実行すると、任意のフォルダ内にあるCSVファイルを全て読み込んでエクセルファイルに書き出します。フォルダ内にあるCSV以外のファイルは無視されます。エクセルファイルは新しいブックが生成され、そこにデータが書き出されるようになっています。また、A列にはCSVファイル名を記載するようになっているので、なにか気になることがあってもどのCSVファイルのデータかわかるようになります。
複数のCSVをマージ(結合)するマクロのコード
Private Sub CSV()
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Dim buf, path, ws As Workbook, LastCell As Range, cnt As Long
With Application.FileDialog(msoFileDialogFolderPicker)
If .Show = True Then
path = .SelectedItems(1)
End If
End With
If path = "" Then End
Workbooks.Add
Set ws = ActiveWorkbook
path = path & "\"
buf = Dir(path & "*.csv")
Do While buf <> ""
cnt = cnt + 1
Workbooks.Open Filename:=path & buf, UpdateLinks:=True, ReadOnly:=True
Set LastCell = Cells.SpecialCells(xlCellTypeLastCell)
If cnt = 1 Then
Range(Cells(1, 1), LastCell).Copy
With ws.ActiveSheet
.Range("B1").PasteSpecial
.Range("A1") = "ファイル名"
.Range("A2:A" & .Cells.SpecialCells(xlCellTypeLastCell).Row & "") = buf
End With
Else
Range(Cells(1, 1), LastCell).Copy
With ws.ActiveSheet
.Cells(.Cells.SpecialCells(xlCellTypeLastCell).Row + 1, 2).PasteSpecial
.Range("A" & .Cells(Rows.Count, 1).End(xlUp).Row + 1 & ":A" & .Cells.SpecialCells(xlCellTypeLastCell).Row & "") = buf
End With
End If
ActiveWorkbook.Close
buf = Dir()
Loop
Range("A1").Select
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub
※コードをコピーする時は、右上のアイコン
をクリックしてください
このマクロを使う理由
機械的に出力されるデータやログは複数のCSVになることが多いです。それらを集計したり一覧で確認したりする場合は、やはりひとつのデータにしたいです。その際にひとつずつ開いて結合するのは非常に手間です。そういった場合に対象のCSVファイルを任意のフォルダの中にまとめて、このマクロを実行するとエクセルファイルにデータが結合されます。
プラスワン
同じフォーマットになったCSV(とりわけ表になっているもの)は見出し(ヘッダー)が特定の位置にあり、その見出しも含めて統合すると使い勝手が良くない場合があります。そこで、2つ目以降のCSVファイルは見出しを取得しないようにするマクロを用意しました。どのCSVでも見出し行が同じであることが条件です。最初に見出しの行番号が聞かれるので、数字で行番号を指定してください。
Private Sub CSV_HeadLine()
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Dim buf, path, ws As Workbook, HeadLine As String, LastCell As Range, cnt As Long
With Application.FileDialog(msoFileDialogFolderPicker)
If .Show = True Then
path = .SelectedItems(1)
End If
End With
If path = "" Then End
HeadLine = InputBox("見出しの行番号を入力してください")
Workbooks.Add
Set ws = ActiveWorkbook
path = path & "\"
buf = Dir(path & "*.csv")
Do While buf <> ""
cnt = cnt + 1
Workbooks.Open Filename:=path & buf, UpdateLinks:=True, ReadOnly:=True
Set LastCell = Cells.SpecialCells(xlCellTypeLastCell)
If cnt = 1 Then
Range(Cells(HeadLine, 1), LastCell).Copy
With ws.ActiveSheet
.Range("B1").PasteSpecial
.Range("A1") = "ファイル名"
.Range("A2:A" & .Cells.SpecialCells(xlCellTypeLastCell).Row & "") = buf
End With
Else
Range(Cells(HeadLine + 1, 1), LastCell).Copy
With ws.ActiveSheet
.Cells(.Cells.SpecialCells(xlCellTypeLastCell).Row + 1, 2).PasteSpecial
.Range("A" & .Cells(Rows.Count, 1).End(xlUp).Row + 1 & ":A" & .Cells.SpecialCells(xlCellTypeLastCell).Row & "") = buf
End With
End If
ActiveWorkbook.Close
buf = Dir()
Loop
Range("A1").Select
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub
※コードをコピーする時は、右上のアイコン
をクリックしてください
