日々の業務でファイル操作、していませんか? 私も毎日のようにやっています。
特定のフォルダからファイルを探して、開いて、コピーして、保存して…と、地味だけど手間のかかる作業の連続です。
しかも、ちょっと油断すると「ファイルが見つかりません」や「使用中です」のエラーで処理が止まってしまうこともあって、何度ヒヤッとしたかわかりません。
だからこそ、VBAでフォルダ内のファイルを一括処理できるスキルは、一度覚えておくと本当に便利です。
時間もミスも減らせて、作業がスルスル進むようになります!
この記事では、VBA初心者の方でも実践しやすい「ファイル一括処理」の方法を、やさしく丁寧にご紹介します。
明日からの業務にすぐ使える内容になっていますので、ぜひ一緒に習得してみましょう!
はじめに:なぜVBAでファイルを一括処理するのか?
日々の業務で「ファイル操作」をしている方、きっと多いのではないでしょうか?
私自身も、ExcelやCSVファイルをフォルダから開いては、データを確認したり、コピーしたり、別のブックに転記したり…という作業をよく行っています。
でも、こうした操作を毎回手作業でやっていると本当に大変です。
- 処理漏れが発生しやすい
- ファイル名のミスやクリック間違いで違うファイルを開いてしまう
- 作業時間がどんどん膨らんでいく
…そんな経験、きっと誰にでもあるはずです。
さらに、処理を途中で止めてしまうようなエラーも発生しがちで、私は何度も「やり直し地獄」に陥ったことがあります…。
VBAで「ファイルを自動で処理する」世界へ!
そうした問題を一気に解決できるのが、VBAによる「ファイル一括処理」です。
VBAを使えば、
- 指定したフォルダの中身を自動的に読み取る
- 条件に合ったファイルだけを開いて処理する
- 作業が終わったら自動で閉じる/別フォルダへ移動する
…といったことをすべてプログラムで実行できます。
まさに、“毎日の繰り返し作業”を一瞬で片づける魔法の仕組みなんです!
一度覚えてしまえば、ずっと使える!
この記事で紹介するテクニックは、私も業務の中で繰り返し使ってきた「実務で使えるVBAの鉄板パターン」ばかりです。
覚えるまでは少し難しく感じるかもしれませんが、 慣れてしまえば「もう手作業には戻れない!」と感じるはずです。
このあと、フォルダの中からファイルを1つずつ読み込む方法や、条件付きで処理する方法などを、丁寧にステップ解説していきます。
初めての方でも大丈夫。
あなたの業務をちょっとラクにする、VBAの力を一緒に使いこなしていきましょう!
【基本編】VBAでフォルダ内のファイルを取得する方法
VBAでファイルを一括処理するためには、まず「フォルダの中にどんなファイルがあるか?」を知る必要があります。
ここでは、VBAのDir関数を使って、指定したフォルダ内のファイルを1つずつ取得する基本の方法をご紹介します。
Dir関数とは?
Dir関数は、フォルダの中から条件に合うファイル名(やフォルダ名)を取得するための便利な関数です。
fileName = Dir("C:\SampleFolder\*.xlsx")
上記のように書くと、Cドライブ内の「SampleFolder」フォルダにある .xlsxファイルのうち最初の1件の名前 が取得されます。
すべてのファイルを取得するには「ループ処理」とセットで!
Dir関数は、最初の1件を取得したあと、何度も呼び出すことで次のファイル名を順番に取得できます。
以下は、指定フォルダ内のExcelファイルをすべて取得し、イミディエイトウィンドウに一覧表示するコード例です
Sub ListFiles()
Dim folderPath As String
Dim fileName As String
folderPath = "C:\SampleFolder\" ' ←自分のフォルダパスに置き換えてください
fileName = Dir(folderPath & "*.xlsx")
Do While fileName <> ""
Debug.Print fileName ' ←ファイル名を表示(または別の処理へ)
fileName = Dir() ' 次のファイルへ
Loop
End Sub
このコードでは、
- Dir(folderPath & “*.xlsx”) → 最初のExcelファイル名を取得
- Dir() → 続けて次のファイル名を取得という流れを Do While ループで繰り返しています。
拡張子のバリエーションもOK!
指定するファイルの種類(拡張子)を変えることで、さまざまなファイルに対応できます。
- “*.csv” → CSVファイルだけ対象にする
- “.xls” → .xlsや.xlsxなど、Excel全般を対象にする
- “.” → すべてのファイルを対象にする(ただし注意が必要)
この段階でできること
- フォルダ内のファイル名を一覧で取得できる
- 処理対象を「ファイル名で判断」できるようになる
- どんな処理でも「ループの中で順番に実行」できるようになる
まとめ
- Dir関数を使えば、フォルダ内のファイルを順番に取得できる
- 最初の呼び出し → Dir(“パス”)、その後は → Dir()
- ループ処理と組み合わせて、「1ファイルずつ処理する」基盤が完成!
次の章では、「条件に応じて処理対象を絞り込む」応用テクニックをご紹介していきます。
「特定の文字列が入っているファイルだけ」や「今日作成されたファイルだけ」など、実務に直結するアイデア満載です!
【応用編】フォルダ内のファイルを条件別に処理する
「フォルダ内のファイルをすべて処理」できるようになると便利ですが、 実務では次のようなケースがよくあります
- 「CSVファイルだけまとめて読み込みたい」
- 「ファイル名に ‘2024’ が入っているものだけを対象にしたい」
- 「更新日が今日のファイルだけ処理したい」
つまり、条件を指定して「必要なファイルだけ選んで処理する」スキルが大切になります。
ここでは、代表的なパターンとそのコード例を紹介します。
条件①:拡張子で絞り込む(例:CSVだけ)
もっとも基本的な条件指定です
fileName = Dir(folderPath & "*.csv")
.csv の部分を変えることで、
- *.xlsx → Excelブック
- *.txt → テキストファイル
*.*
→ すべてのファイル
など、ファイルの種類ごとに対象を変えることができます。
条件②:ファイル名に特定の文字列が含まれているか確認する
例えば、”売上” という名前が含まれているファイルだけ処理したい場合
Do While fileName <> ""
If InStr(fileName, "売上") > 0 Then
' 処理対象!
Debug.Print "対象ファイル:" & fileName
End If
fileName = Dir()
Loop
InStr(文字列, 検索語) は、「その語が含まれていれば位置を返す」関数です。
> 0 で含まれているかを判定できます。
条件③:更新日時やサイズなどでさらに絞り込む
「今日作成されたファイルだけ対象にしたい」など、日付や属性ベースで制御したいときは FileDateTime や FileLen を活用できます
Dim filePath As String
Do While fileName <> ""
filePath = folderPath & fileName
If FileDateTime(filePath) >= Date Then
' 今日作成 or 更新されたファイルだけ処理!
Debug.Print "今日のファイル:" & fileName
End If
fileName = Dir()
Loop
他にも
- FileLen(filePath) → ファイルサイズ(バイト単位)を取得
- GetAttr(filePath) → 読み取り専用かどうか、隠しファイルかなどを判定可能
応用パターンの組み合わせ例
複数の条件を同時に使うことで、処理対象をもっと柔軟に絞り込めます。
If Right(fileName, 4) = ".csv" And InStr(fileName, "売上") > 0 Then
' 「売上」が名前に含まれるCSVファイルだけ処理!
End If
まとめ
- 拡張子やファイル名で 対象を柔軟に選ぶ ことで、実務によりフィットする処理が可能に
- InStr や FileDateTime などを組み合わせれば、必要なファイルだけを安全に・効率よく処理できる
- 条件付き処理が書けるようになると、一括処理マクロが“賢く”なる!
次章ではいよいよ実践編として、「取得したファイルを開いてデータを読み込み、レポートなどにまとめる」流れを構築していきます!
【実践編】フォルダ内のExcelファイルを開いてデータ処理する
ここからはいよいよ実務的なファイル処理の実践編です。 具体的には、以下のような流れを自動化していきます。
- フォルダ内のExcelファイルを1つずつ開く
- ファイルの中のデータを読み取る(例:A1セルの値)
- メインブックにコピーするなどの処理を行う
- 処理が終わったらそのファイルを閉じる
この作業をVBAで組めば、複数ファイルをまとめて開いて、自動的に必要な処理をこなしてくれるようになります。
どんな場面で使える?
- 毎日届くレポートファイルからデータを抜き出す
- 月ごとの売上ファイルをまとめて1シートに統合する
- 各部署から提出されたExcelを1つの表に整理する
「1つずつ開いてコピペ」という手作業を卒業できます!
基本の構文(ファイルを順番に開いて処理)
Sub ImportFromFolder()
Dim folderPath As String
Dim fileName As String
Dim wb As Workbook
Dim mainWs As Worksheet
Dim lastRow As Long
folderPath = "C:\SampleFolder\" ' ★自分のフォルダパスに変更してください
fileName = Dir(folderPath & "*.xlsx")
Set mainWs = ThisWorkbook.Sheets("統合シート") ' 統合先のシート名
Do While fileName <> ""
Set wb = Workbooks.Open(folderPath & fileName) ' ファイルを開く
' A1セルのデータを取得して、統合シートに転記
lastRow = mainWs.Cells(Rows.Count, 1).End(xlUp).Row + 1
mainWs.Cells(lastRow, 1).Value = wb.Sheets(1).Range("A1").Value
mainWs.Cells(lastRow, 2).Value = fileName ' ファイル名も記録
wb.Close SaveChanges:=False ' ファイルを閉じる(保存しない)
fileName = Dir() ' 次のファイルへ
Loop
MsgBox "データの取り込みが完了しました!"
End Sub
ポイント解説
- Workbooks.Open → 指定したファイルを開く
- wb.Sheets(1).Range(“A1”).Value → 開いたブックのA1セルを取得
- ThisWorkbook → このマクロが書かれているブック(処理先のメイン)
- SaveChanges:=False → 自動処理なので開いたファイルは保存せずに閉じる
よくある応用
- 指定のセル範囲(例:A2~D10)を丸ごとコピー
- 別シートや別ブックから値を取得
- データの整形(空白行の削除、見出し行のスキップ)なども追加可能
まとめ
- Workbooks.Open を使うと、フォルダ内のファイルを1つずつ開いて中身を処理できる
- データを取得して、メインのブックに整理することで作業がグッと効率化
- ファイルが複数でも自動で順番に処理されるので、「全員分のファイルを集計してレポート化」などもカンタンに!
次章では、「エラーが起きたときにどうするか?」というよくあるトラブルへの備え方を解説していきます。
ファイルが開けない/空っぽだった/途中で止まった…そんなときにどうすれば?という実践的な内容です。
【エラー対策】VBAファイル処理で気をつけるべきポイント
フォルダ内のファイルを一括処理するマクロはとても便利ですが、 実際に使い始めると、思わぬエラーに遭遇することがよくあります。
ここでは、私自身も体験してきた“あるあるトラブル”とその解決方法を紹介します。
事前に知っておくだけで、ストレスがグッと減ります!
ケース①:ファイルが開けない・見つからない
Set wb = Workbooks.Open(folderPath & fileName)
このコードで「ファイルが開けません」というエラーが出るときは
主な原因
- folderPath の末尾に \ がついていない
- fileName に空白や不正な文字列が含まれている
- ファイルが他のアプリで開かれてロックされている
解決策
- フォルダパスは Right(folderPath, 1) <> “\” でチェックして補う
- Dirで取得したファイル名が空でないか確認
- ファイルを開くときは ReadOnly:=True をつけると、他ユーザーと競合しにくくなります
ケース②:空っぽのファイルを開いてエラー
対象ファイルのシート数が0だったり、セルが何も書かれていないとき、 .Sheets(1) や .Range(“A1”) などの指定でエラーになることがあります。
解決策
If wb.Sheets.Count > 0 Then
If Application.WorksheetFunction.CountA(wb.Sheets(1).UsedRange) > 0 Then
' 処理する内容を書く
End If
End If
シート数とUsedRangeに値があるかを確認すれば、安全に処理できます!
ケース③:処理中にファイルを閉じ忘れてトラブルに
Workbooks.Open で開いたファイルを Close しないままマクロが終わると、 複数のファイルが開きっぱなしになってしまいます…。
解決策
- 開いたら必ず wb.Close SaveChanges:=False で閉じる
- エラーが発生しても確実に閉じるように、On Error と Finally 相当の処理を入れる
On Error GoTo ErrorHandler
Set wb = Workbooks.Open(…)
' 処理内容…
wb.Close SaveChanges:=False
Exit Sub
ErrorHandler:
MsgBox "エラーが発生しました:" & Err.Description
If Not wb Is Nothing Then wb.Close SaveChanges:=False
まとめ:トラブル回避ができると「実務でも安心して使える!
よくあるトラブル | 原因と対策キーワード |
---|---|
ファイルが開けない | パスミス/ReadOnly指定/Dirで取得確認 |
中身が空で処理失敗 | UsedRangeをCountAで確認 |
ファイルを閉じ忘れる | Closeを必ず書く/On Errorで補足処理 |
マクロは“書けたあと”がスタートです。
いざ実務で使ったときに止まらずに動き続けるか? という視点で、少しずつエラー対策の習慣をつけていくと安心ですよ。
次章では、今回学んだVBAファイル処理を振り返りながら、 「自動化の威力」と「これからの広がり」についてまとめていきます!
まとめ:ファイル一括処理をマスターして業務の自動化を加速しよう
ここまで、VBAを使ってフォルダ内のファイルを一括処理する方法をステップごとに解説してきました。
最初は「難しそう…」と感じた方も、 少しずつ「これならできるかも」と思っていただけたのではないでしょうか?
今回の学びの振り返り
- Dir関数を使って、フォルダ内のファイルを一つずつ取得する方法
- InStrや拡張子条件を使った「処理対象の絞り込み」
- Workbooks.OpenやCloseで、ファイルの開閉とデータ取得
- 発生しやすいエラーとその対策法
これらを組み合わせれば、「人が毎回やっていたファイル整理・集計・転記作業」が一瞬で自動化できるようになります。
VBAは、“ちょっとした勇気”が明日をラクにしてくれる
VBAの魅力は、「繰り返し作業」を任せられる頼もしさにあります。
最初はちょっとドキドキするかもしれません。コードに間違いがあったり、うまく動かなかったり…。
でも、一度うまく動いたときの感動は、きっと想像以上です。
そしてそのコードは、今日だけでなく明日も明後日も、あなたの代わりに働き続けてくれます。
次のステップは?
今回のファイル一括処理を応用して…
- 各ファイルのデータを1つのレポートに集計する
- ファイル名や日付をもとに、処理内容を変える
- 取得した情報をデータベース(例:PostgreSQL)に登録する
といった「高度な自動化」へつなげることも可能です!
おわりに:あなたのVBAは、もう“できる人”です!
「また同じ作業か…」と思ったときこそ、自動化のチャンスです。
今回の学びを、ぜひあなたの業務に活かしてみてください。
そして「できた!」という小さな一歩を、どうか誇りに思ってくださいね。

「VBAでファイルを一括処理する」なんて、一見むずかしそうに見えるかもしれません。 でも、今回の記事を通して、少しでも「これなら自分にもできそう」「やってみたい」と思っていただけたなら、とても嬉しく思います。
私も、最初はエラーで何度もつまずきました。 けれど少しずつVBAの楽しさに気づき、「毎日の作業がどんどんラクになる」実感を持てるようになりました。
このVBAマクロが、あなたのExcel作業にそっと寄り添ってくれますように。 そして、あなたの「やってみよう」を心から応援しています!
コメント