
Contents
この記事でできること
毎月届く複数のExcelファイルを、1つずつ手作業でコピペして統合していませんか? VBAを使えば、指定フォルダ内の全Excelファイルのデータを1つのシートに自動統合できます。2つ目以降のファイルではヘッダー行を自動スキップするため、列名が重複しません。この記事では、コピペで動くコードを最小版・実務版の2段階で解説します。
- 対象:複数のExcelファイルを手作業でコピペして統合している人
- 所要時間:コピペ → 実行まで約5分(目安)
完成イメージ(Before / After)
Before(実行前)
フォルダに3つのExcelファイルが入っている。それぞれSheet1に同じ列構成のデータがある。
| ファイル名 | 内容 |
|---|---|
| 報告書_東京.xlsx | ヘッダー + データ5行 |
| 報告書_大阪.xlsx | ヘッダー + データ3行 |
| 報告書_名古屋.xlsx | ヘッダー + データ4行 |
After(実行後)
統合先シートに、ヘッダー1行 + データ12行が並ぶ。
| A | B | C | |
|---|---|---|---|
| 1 | 日付 | 店舗 | 売上 |
| 2 | 2026/01/01 | 東京本店 | 150000 |
| 3 | 2026/01/02 | 東京駅前 | 120000 |
| … | … | … | … |
| 7 | 2026/01/01 | 大阪梅田 | 98000 |
| … | … | … | … |
| 13 | 2026/01/03 | 名古屋栄 | 87000 |
ヘッダー行は1行目だけ。2つ目以降のファイルのヘッダーはスキップされている。
実行前の準備
バックアップを取る
統合先シートの既存データは上書きされる。既存データがあるExcelファイルで実行する場合は、先にファイルをコピーしてバックアップを取ること。
対象ファイルをすべて閉じる
統合対象のExcelファイルが開いた状態で実行するとエラーになる。対象フォルダ内のExcelファイルはすべて閉じておくこと。
Excelをマクロ有効ブック(.xlsm)で保存する
- Excelを開く(新規でも既存でもOK)
- 「ファイル」→「名前を付けて保存」
- ファイルの種類を 「Excel マクロ有効ブック (*.xlsm)」 に変更して保存
.xlsx のままだとマクロが保存されない。必ず .xlsm にすること。
手順(コピペ → 実行まで約5分)
VBE(コードを書く画面)を開く
Alt + F11 キーを押すとVBE(Visual Basic Editor)が開く。
一般的にはAlt + F11で開けるが、企業のセキュリティ設定でVBAが無効化されている場合は、IT部門に確認すること。
標準モジュールを挿入する
- VBEのメニュー「挿入」→「標準モジュール」をクリック
- 右側に白い画面(コードウィンドウ)が表示される
コードを貼り付けて実行する
- 下の「コード(最小版)」をコピーして、コードウィンドウに貼り付ける
- コード内の
folderPathを自分の対象フォルダのパスに書き換える - Alt + F8 を押す(または VBE上で F5)
- 「MergeExcelFiles」を選択して「実行」
- 統合先シート(Sheet1)にデータが統合されていることを確認する
フォルダパスの確認方法: エクスプローラーでフォルダを開き、アドレスバーをクリックするとパスが表示される。それをコピーして使う。
パスの末尾に \ を忘れないこと。 例:C:\Users\tanaka\Documents\報告書\
コード(最小版)– 全ファイルのSheet1を統合
フォルダ内の全.xlsxファイルのSheet1データを、1つのシートに統合する。2つ目以降のファイルではヘッダー行をスキップする。
Sub MergeExcelFiles()
Dim folderPath As String
Dim fileName As String
Dim wb As Workbook
Dim ws As Worksheet
Dim destWs As Worksheet
Dim nextRow As Long
Dim copyRange As Range
Dim fileCount As Long
' ★ ここを自分のフォルダパスに書き換える(末尾の \ を忘れずに)
folderPath = "C:\Users\(ユーザー名)\Desktop\報告書フォルダ\"
' 統合先シートを準備
Set destWs = ThisWorkbook.Worksheets("Sheet1")
destWs.Cells.Clear
nextRow = 1
fileCount = 0
' 最初の.xlsxファイルを取得
fileName = Dir(folderPath & "*.xlsx")
Do While fileName <> ""
' ファイルを開く(読み取り専用)
Set wb = Workbooks.Open(folderPath & fileName, ReadOnly:=True)
Set ws = wb.Sheets(1)
If fileCount = 0 Then
' 1つ目のファイル:ヘッダー含む全データをコピー
Set copyRange = ws.UsedRange
Else
' 2つ目以降:ヘッダー行(1行目)をスキップ
If ws.UsedRange.Rows.Count >= 2 Then
Set copyRange = ws.UsedRange.Offset(1, 0).Resize( _
ws.UsedRange.Rows.Count - 1, ws.UsedRange.Columns.Count)
Else
' データが1行(ヘッダーのみ)の場合はスキップ
wb.Close SaveChanges:=False
fileName = Dir()
GoTo NextFile
End If
End If
' 統合先に値を貼り付け
copyRange.Copy
destWs.Cells(nextRow, 1).PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False
nextRow = nextRow + copyRange.Rows.Count
fileCount = fileCount + 1
' ファイルを閉じる(保存しない)
wb.Close SaveChanges:=False
NextFile:
' 次のファイルを取得
fileName = Dir()
Loop
MsgBox fileCount & " 件のファイルを統合しました。", vbInformation
End Sub
シート名について: コード内の "Sheet1" は統合先のシート名(タブに表示される名前)。シート名を変更している場合は、自分のシート名に書き換えること。
ファイル数が多い場合の高速化: 統合するファイルが10件以上ある場合は、処理が遅く感じることがある。コードの先頭(folderPath = ... の前)に以下の2行を追加し、End Sub の前に再開処理を入れると高速化できる(実務版では対応済み)。
' 高速化:先頭に追加
Application.ScreenUpdating = False
' 高速化:End Sub の前に追加
Application.ScreenUpdating = True
パスの入力が面倒な場合(ダイアログで選択する方法):
folderPath = "..." の行を以下に置き換えると、実行時にフォルダ選択ダイアログが表示される。
With Application.FileDialog(msoFileDialogFolderPicker)
.Title = "統合するファイルがあるフォルダを選択"
If .Show = True Then
folderPath = .SelectedItems(1) & "\"
Else
Exit Sub
End If
End With
コード(実務版)– ファイル名列+ヘッダースキップ切替+処理ログ
最小版に以下の機能を追加した実務版。
- ファイル名列(A列):どの行がどのファイル由来かわかる
- ヘッダースキップOn/Off:
skipHeader = Trueでヘッダーをスキップ、Falseで全行統合 - 処理ログ:統合件数・スキップ件数をMsgBoxで表示
- 高速化:
Application.ScreenUpdating = Falseで画面更新を停止
実務版を実行する場合は、Alt + F8 で「MergeExcelFilesAdvanced」を選択して実行すること。
Sub MergeExcelFilesAdvanced()
Dim folderPath As String
Dim fileName As String
Dim wb As Workbook
Dim ws As Worksheet
Dim destWs As Worksheet
Dim nextRow As Long
Dim copyRange As Range
Dim fileCount As Long
Dim skipCount As Long
Dim dataRows As Long
Dim dataCols As Long
Dim i As Long
Dim skipHeader As Boolean
' ★ 設定エリア(ここを自分の環境に合わせて変更する)
folderPath = "C:\Users\(ユーザー名)\Desktop\報告書フォルダ\"
skipHeader = True ' True: 2つ目以降のヘッダーをスキップ / False: 全行統合
' --- ここから下は変更不要 ---
' 高速化:画面更新を停止
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
' 統合先シートを準備
Set destWs = ThisWorkbook.Worksheets("Sheet1")
destWs.Cells.Clear
' ヘッダー行(A1にファイル名列を追加)
destWs.Cells(1, 1).Value = "ファイル名"
nextRow = 1
fileCount = 0
skipCount = 0
' 最初の.xlsxファイルを取得
fileName = Dir(folderPath & "*.xlsx")
Do While fileName <> ""
' ファイルを開く(読み取り専用)
Set wb = Workbooks.Open(folderPath & fileName, ReadOnly:=True)
Set ws = wb.Sheets(1)
dataRows = ws.UsedRange.Rows.Count
dataCols = ws.UsedRange.Columns.Count
' 空ファイル(データなし)のチェック
If dataRows <= 0 Or (ws.UsedRange.Address = "$A$1" And ws.Cells(1, 1).Value = "") Then
skipCount = skipCount + 1
wb.Close SaveChanges:=False
fileName = Dir()
GoTo NextFileAdv
End If
If fileCount = 0 Then
' 1つ目のファイル:ヘッダー含む全データをコピー
' ヘッダー行をB列以降にコピー(A列はファイル名列)
ws.UsedRange.Copy
destWs.Cells(nextRow, 2).PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False
' A列にファイル名を記入(ヘッダー行はそのまま)
For i = nextRow + 1 To nextRow + dataRows - 1
destWs.Cells(i, 1).Value = fileName
Next i
nextRow = nextRow + dataRows
fileCount = fileCount + 1
Else
' 2つ目以降
If skipHeader And dataRows >= 2 Then
' ヘッダーをスキップして2行目以降をコピー
Set copyRange = ws.UsedRange.Offset(1, 0).Resize( _
dataRows - 1, dataCols)
copyRange.Copy
destWs.Cells(nextRow, 2).PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False
' A列にファイル名を記入
For i = nextRow To nextRow + dataRows - 2
destWs.Cells(i, 1).Value = fileName
Next i
nextRow = nextRow + dataRows - 1
fileCount = fileCount + 1
ElseIf Not skipHeader Then
' ヘッダースキップOFF:全行コピー
ws.UsedRange.Copy
destWs.Cells(nextRow, 2).PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False
For i = nextRow To nextRow + dataRows - 1
destWs.Cells(i, 1).Value = fileName
Next i
nextRow = nextRow + dataRows
fileCount = fileCount + 1
Else
' ヘッダーのみのファイル → スキップ
skipCount = skipCount + 1
End If
End If
' ファイルを閉じる(保存しない)
wb.Close SaveChanges:=False
NextFileAdv:
' 次のファイルを取得
fileName = Dir()
Loop
' 高速化:画面更新を再開
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
' 処理ログを表示
' nextRow - 2 の「-2」はヘッダー行1行分とnextRowが次の空行を指すため
MsgBox "統合完了" & vbCrLf & _
"統合ファイル数:" & fileCount & " 件" & vbCrLf & _
"スキップ:" & skipCount & " 件(空ファイル等)" & vbCrLf & _
"統合データ行数:" & nextRow - 2 & " 行(ヘッダー除く)", vbInformation
End Sub
エラー発生時の注意: 実行中にエラーが発生した場合、画面更新の停止(ScreenUpdating = False)や計算モードの手動化(Calculation = xlCalculationManual)が元に戻らないことがある。エラーが起きた場合は、以下の手順で復元すること。
- VBE(Alt + F11)のイミディエイトウィンドウ(Ctrl + G)を開く
- 以下の2行をそれぞれ入力してEnterキーを押す
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
実務版の完成イメージ:
| A | B | C | D | |
|---|---|---|---|---|
| 1 | ファイル名 | 日付 | 店舗 | 売上 |
| 2 | 報告書_東京.xlsx | 2026/01/01 | 東京本店 | 150000 |
| 3 | 報告書_東京.xlsx | 2026/01/02 | 東京駅前 | 120000 |
| 4 | 報告書_大阪.xlsx | 2026/01/01 | 大阪梅田 | 98000 |
| … | … | … | … | … |
A列にファイル名が入るため、「このデータはどのファイルから来たか」が一目でわかる。
よくある落とし穴5選
| # | 症状 | 原因 | 対策 |
|---|---|---|---|
| 1 | 列がずれて統合される | ファイルごとに列の順番や列数が違う | 統合前に全ファイルの列構成を揃える。または列名でマッチングする処理を追加する(カスタマイズが必要な場合はココナラで相談) |
| 2 | 空のファイルで処理が止まる | Sheet1にデータがないファイルが混在している | 実務版ではデータなしファイルを自動スキップする処理が入っている。最小版の場合は手動で空ファイルを除外する |
| 3 | 「実行時エラー ‘1004’」が出る | 統合対象のファイルが既に開かれている | 実行前に対象フォルダ内のExcelファイルをすべて閉じる |
| 4 | シート名が違うファイルでエラー | コードで Sheets(1) を使っているが、1番目のシートが目的のシートでない場合がある |
複数シートがあるファイルの場合は、シートの順番を確認する。必要ならシート名を指定する |
| 5 | 処理が非常に遅い | ファイル数が多い場合に画面更新が毎回走っている | Application.ScreenUpdating = False を先頭に入れる(実務版では対応済み) |
FAQ
Q1: .xlsxだけでなく.xlsも統合したい
Dir関数の引数を Dir(folderPath & "*.xls*") にすれば .xls / .xlsx / .xlsm をまとめて取得できる。ただし自分自身のファイル(マクロブック)も対象になる場合があるので、If fileName <> ThisWorkbook.Name Then で除外すること。
Q2: 特定のファイルだけ除外したい
ファイル名で条件を付ける。例:If InStr(fileName, "テンプレート") = 0 Then で「テンプレート」を含むファイルをスキップできる。
Q3: 統合先を新しいブックにしたい
Workbooks.Add で新しいブックを作成し、そのシートを統合先にすれば元のマクロブックのデータを汚さない。コード内の ThisWorkbook.Worksheets("Sheet1") を新しいブックのシートに変更する。
Q4: 対象フォルダ内のファイルがわからない
記事001「【VBA】フォルダ内のファイル一覧をExcelに自動出力する方法」でまずファイルを確認してから、この統合マクロを実行するのが安全。
Q5: ヘッダー行がないファイルも混在している場合は?
実務版の skipHeader = False に設定すれば、全ファイルの全行をそのまま統合できる。ヘッダー有り/なしが混在する場合は、ファイルを事前に分類するか、カスタマイズが必要(ココナラで相談可能)。
まとめ
この記事で、指定フォルダ内の複数Excelファイルのデータを1つのシートに自動統合できるようになった。
- 最小版:全.xlsxのSheet1を統合。2つ目以降のヘッダーは自動スキップ
- 実務版:ファイル名列の追加、ヘッダースキップOn/Off、処理ログ表示
元ファイルは読み取り専用で開いて閉じるだけなので、データは変更されない。
関連記事:
- 統合前に対象ファイルを確認したい場合は「【VBA】フォルダ内のファイル一覧をExcelに自動出力する方法」(記事001)を参照
- 統合後に不要になった元ファイルを整理したい場合は「【VBA】古いファイルを自動削除する方法」(記事004)を参照
もっとカスタマイズしたい場合
「列の順番が違うファイルを統合したい」「フィルタ条件を付けて一部のデータだけ統合したい」「複数シートをまとめたい」など、業務に合わせたカスタマイズが必要な場合は、ココナラで相談できます。
相談時に以下の情報があるとスムーズです:
- Excel のバージョン / OS
- 統合対象ファイルの列名(ヘッダー行)
- 出力の見本(統合後にどんな形にしたいか)
- ファイルの数とデータの行数(目安)

コメント