Excelで仕事をしていると、次のような場面によく遭遇しませんか?
- 「各拠点から送られてきた100個のファイルを1つにまとめなきゃいけない…」
- 「毎月、大量のデータをコピペして集計シートを作っている」
- 「コピペ作業だけで午前中が終わってしまう」
1つや2つのファイルなら手作業でもいいですが、数が多くなると「貼り付けミス」や「漏れ」が怖いですし、何より時間がもったいないですよね。
この記事では、指定したフォルダの中にあるすべてのExcelファイルを、ボタン一つで1つのシートに結合するマクロをご紹介します。
コピペしてすぐに使えるコードを用意しましたので、ぜひ活用してみてください!
フォルダ内のファイルを結合するVBAコード
以下のコードは、マクロを書いたブックと同じフォルダにある「全Excelファイル」を開き、その中身を今のシートに順番に貼り付けていくものです。
VBAコード
Sub MergeExcelFiles()
Dim targetDir As String
Dim fileName As String
Dim wbSource As Workbook
Dim wsDest As Worksheet
Dim lastRow As Long
Dim nextRow As Long
' 貼り付け先のシート(このマクロがあるブックの1枚目のシート)
Set wsDest = ThisWorkbook.Sheets(1)
' マクロがあるブックと同じフォルダを対象にする
targetDir = ThisWorkbook.Path & "\"
' フォルダ内のExcelファイル(.xlsx)を探す
fileName = Dir(targetDir & "*.xlsx")
' 画面更新を停止(高速化のため)
Application.ScreenUpdating = False
Do While fileName <> ""
' 自分自身のファイルはスキップ
If fileName <> ThisWorkbook.Name Then
' ファイルを開く
Set wbSource = Workbooks.Open(targetDir & fileName)
' コピー元(1枚目のシート)のデータ最終行を取得
lastRow = wbSource.Sheets(1).Cells(Rows.Count, 1).End(xlUp).Row
' 貼り付け先の次の行を取得
nextRow = wsDest.Cells(Rows.Count, 1).End(xlUp).Row + 1
' 2行目から最終行までをコピーして貼り付け(1行目は見出し想定)
If lastRow >= 2 Then
wbSource.Sheets(1).Rows("2:" & lastRow).Copy wsDest.Rows(nextRow)
End If
' ファイルを閉じる(保存しない)
wbSource.Close SaveChanges:=False
End If
' 次のファイルを探す
fileName = Dir()
Loop
' 画面更新を再開
Application.ScreenUpdating = True
MsgBox "結合が完了しました!"
End Sub
このマクロの使い方
使い方はとても簡単です。
- 新しいExcelファイルを作成し、「Excel マクロ有効ブック (.xlsm)」として保存します。
Alt+F11でVBAエディタを開き、「挿入」→「標準モジュール」に上記のコードを貼り付けます。- まとめたいExcelファイルが入っているフォルダの中に、このマクロブックを保存します。
- マクロを実行すると、同じフォルダにあるすべての
.xlsxファイルのデータが1枚のシートに集まります。
コードのポイント解説
今回のコードで使っている重要なテクニックを3つ解説します。
1. Dir関数でファイル一覧を取得
Dir(targetDir & "*.xlsx") というコードを使うことで、フォルダの中から特定の条件(今回は拡張子が.xlsxのもの)に合うファイル名を1つずつ取り出すことができます。 すべてのファイルを取り出し終えると、Dir は空白(””)を返すため、Do While ループで繰り返し処理を行っています。
2. ThisWorkbook.Path で場所を自動取得
ThisWorkbook.Path を使うと、マクロブックが保存されているフォルダのパスを自動で取得してくれます。 これにより、会社と自宅でフォルダの場所が違っても、コードを書き直す必要がありません。
3. End(xlUp) で最終行を判定
Cells(Rows.Count, 1).End(xlUp).Row は、データの最後がどこにあるかを自動で見つける定番の書き方です。 これを使うことで、ファイルごとにデータの行数が違っても、重なったり隙間ができたりすることなく、綺麗に下に繋げていくことができます。
注意点:見出しはどうなる?
今回のコードは、「すべてのファイルに共通の見出し(1行目)がある」ことを想定し、コピーする範囲を2行目からに設定しています。
VBA
' 2行目から最終行までをコピー
wbSource.Sheets(1).Rows("2:" & lastRow).Copy
もし「見出しも含めて全部コピーしたい」という場合は、"2:" の部分を "1:" に変更してください。
まとめ
今回は、実務で役立つ「ファイル結合マクロ」をご紹介しました。
手作業で一つずつファイルを開いて、コピーして、閉じて…という作業を繰り返すのは、人間ではなくコンピュータの得意分野です。
このマクロを使えば、100個のファイル結合も数秒で終わります。浮いた時間で、データの分析や他のクリエイティブな仕事に取り組んでいきましょう!
これからも、日々の業務が少しでも楽になるVBAテクニックを記録していきます。


コメント