フォルダ内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つのシートにまとめる処理 を簡単に作成できます。
