Excel VBAで業務を自動化していると、フォルダ内のExcelファイルをまとめて開いたり、特定のファイルだけを検索して開いたりしたい場面があります。
例えば月次処理では、共有フォルダ内の売上ファイルを順番に開いて集計したり、日付付きファイルの中から最新データを検索したりすることも珍しくありません。
しかし実際には、
- ユーザーにフォルダを選ばせたい
- フォルダ内の全ファイルを開きたい
- ファイル名の一部が一致するものだけ開きたい
- エラーで処理が止まるのを防ぎたい
といった実務的な課題が発生します。
この記事では、VBAでフォルダを指定してファイルを開く方法を、実務で使いやすいコードと設計思想を交えながら解説します。
✅ VBAでフォルダを指定してファイルを開く基本
フォルダ内のファイルを開く処理は、一見するとWorkbooks.Openだけで実現できます。
しかし実務では、
- フォルダが存在しない
- ファイル名が変更される
- 保存場所が変わる
といったケースが発生します。
そのため「固定パスで開くコード」だけでなく、運用しやすい設計を意識することが重要です。
・Workbooks.Openでファイルを開く基本構文
まずは最も基本的な方法です。
Sub OpenWorkbook()
Dim targetFilePath As String
targetFilePath = "C:\Data\売上.xlsx"
Workbooks.Open targetFilePath
End Sub
・なぜ変数へ格納する設計が重要なのか
実務ではファイルパスを直接コードへ書くよりも、変数へ格納する方が保守しやすくなります。
例えば保存先が変更された場合でも、修正箇所を最小限にできます。
また後ほど紹介するフォルダ選択ダイアログやファイル検索処理とも組み合わせやすくなります。
・実務で注意したいファイルパス管理
固定パス指定は簡単ですが、
- PC変更
- サーバー移行
- 共有フォルダ変更
で動かなくなることがあります。
そのため実務ではダイアログ選択や設定シート管理がよく利用されます。
固定パスを指定してファイルを開く方法は基本ですが、実務ではユーザーに対象ファイルを選択してもらいたい場面も少なくありません。ファイル選択ダイアログを利用した方法については、【VBA】ファイルを選択して開く方法|Application.GetOpenFilenameとWorkbooks.Openの実践例の記事で詳しく解説しています。
✅ VBAでフォルダ選択ダイアログを表示してファイルを開く方法
ユーザーにフォルダを選択してもらう方式は、多くの現場で採用されています。
保存場所が変わっても対応しやすく、マクロの再利用性も向上します。
・フォルダ選択ダイアログを表示するコード
まずはフォルダを選択する仕組みを作ります。
Sub SelectFolder()
Dim folderDialog As FileDialog
Dim selectedFolderPath As String
Set folderDialog = Application.FileDialog(msoFileDialogFolderPicker)
If folderDialog.Show <> -1 Then Exit Sub
selectedFolderPath = folderDialog.SelectedItems(1)
MsgBox selectedFolderPath
End Sub
・なぜこの方法が実務で使われるのか
FolderPickerを使用すると、
- フォルダ移動に強い
- ユーザーが自由に指定できる
- 保守担当者でも扱いやすい
というメリットがあります。
特に共有フォルダ運用では非常に有効です。
・運用で失敗しないためのポイント
ユーザーがキャンセルした場合を考慮して、
If folderDialog.Show <> -1 Then Exit Sub
を入れておくことが重要です。
この処理がないと実行エラーの原因になります。
フォルダ選択ダイアログはファイルを開く場面だけでなく、保存先をユーザーに選択してもらう場合にも活用できます。ダイアログを利用した保存処理については、【VBA】ダイアログで名前を付けて保存・同じフォルダに保存する方法の記事で詳しく解説しています。
✅ VBAでフォルダ内の全ファイルを開く方法
月次集計や帳票作成では、フォルダ内の複数ファイルをまとめて処理したいケースがあります。
この場合はDir関数を利用します。
・フォルダ内の全Excelファイルを開くコード
まずは実務で扱いやすい基本コードです。
Sub OpenAllFiles()
Dim targetFolderPath As String
Dim currentFileName As String
targetFolderPath = "C:\Data\"
currentFileName = Dir(targetFolderPath & "*.xlsx")
Do While currentFileName <> ""
Workbooks.Open targetFolderPath & currentFileName
currentFileName = Dir
Loop
End Sub
・なぜDir関数を使用するのか
Dir関数はVBA標準機能のため、
- 追加ライブラリ不要
- 処理速度が速い
- 多くの環境で利用可能
というメリットがあります。
単純なファイル検索なら十分実務で利用できます。
Dir関数は単にファイル名を取得するだけでなく、ファイル操作全体の保守性や柔軟性を高めるためにも重要な役割を持っています。ファイル検索や存在確認を含めた実務向けの活用方法については、【VBA】Dir関数の活用法|ファイル操作を自動化する実務向け完全ガイドの記事で詳しく解説しています。
・大量ファイル処理で注意すること
数百ファイル以上を開く場合は、
- ScreenUpdating停止
- Calculation停止
などの高速化対策も検討しましょう。
大量ファイルを処理するマクロでは、ファイル取得ロジックだけでなく処理環境の最適化も重要です。画面更新を停止する【VBA】Application.ScreenUpdatingプロパティの使用方法と特徴や、自動再計算を制御する【VBA】Application.Calculationプロパティの使い方とその重要性を活用すると、大幅な高速化につながる場合があります。詳しい設定方法は関連記事で解説しています。
✅ VBAでファイル名の一部を指定して開く方法
実務ではファイル名が毎回変わることがあります。
例えば、
- 売上_202507.xlsx
- 売上_202508.xlsx
- 売上_202509.xlsx
のようなケースです。
・一部一致で検索するコード
Sub OpenMatchedFile()
Dim targetFolderPath As String
Dim currentFileName As String
targetFolderPath = "C:\Data\"
currentFileName = Dir(targetFolderPath & "*売上*.xlsx")
If currentFileName <> "" Then
Workbooks.Open targetFolderPath & currentFileName
End If
End Sub
・なぜ完全一致ではなく部分一致を使うのか
日付や管理番号が付くファイルでは、完全一致指定だと保守性が低くなります。
部分一致を利用すると、
- 年月変更に対応しやすい
- 運用変更に強い
- メンテナンスコストを削減できる
というメリットがあります。
部分一致検索が活きるのは、日付や管理番号を含めた命名ルールが整備されている場合です。実務でよく使われる「日付付きファイル名による世代管理」や「上書き防止の仕組み」については、【VBA】日付を含むファイル名で自動保存する方法|上書き防止と実務設計まで解説の記事で詳しく解説しています。
・実務で注意したいポイント
複数ファイルがヒットする可能性があります。
例えば、
- 売上.xlsx
- 売上バックアップ.xlsx
が存在すると意図しないファイルが開かれる場合があります。
運用ルールを明確にしておくことが重要です。
✅ フォルダ選択後に対象ファイルを自動で開く実践コード
ここまでの内容を組み合わせると、より実務的なマクロを作成できます。
・実務向けサンプルコード
Sub OpenTargetFile()
Dim folderDialog As FileDialog
Dim selectedFolderPath As String
Dim targetFileName As String
Set folderDialog = Application.FileDialog(msoFileDialogFolderPicker)
If folderDialog.Show <> -1 Then Exit Sub
selectedFolderPath = folderDialog.SelectedItems(1)
targetFileName = Dir(selectedFolderPath & "\*売上*.xlsx")
If targetFileName = "" Then
MsgBox "対象ファイルが見つかりません。"
Exit Sub
End If
Workbooks.Open selectedFolderPath & "\" & targetFileName
End Sub
・この構成をおすすめする理由
このコードは、
- フォルダ変更に対応できる
- ファイル名変更にも対応できる
- エラーを減らせる
という実務向けの設計になっています。
固定パス+固定ファイル名よりも保守性が高く、多くの業務で流用できます。
・現場で長く使うための設計ポイント
さらに発展させる場合は、
- 対象ファイル一覧表示
- 最新ファイル自動取得
- ログ出力
などを追加すると運用しやすくなります。
✅ VBAでファイルを開く処理を安定運用するコツ
フォルダ指定処理は簡単に見えますが、実際には運用面が重要です。
マクロ作成時は「将来誰がメンテナンスするか」を意識しましょう。
・固定パス依存を避ける
共有フォルダ変更で動かなくなるケースが多発します。
可能な限りダイアログ選択を活用しましょう。
・エラー処理を準備する
ファイル削除や移動は必ず発生します。
存在チェックやメッセージ表示を入れることで運用トラブルを減らせます。
ファイル操作では「存在しないファイルを開こうとする」「移動済みのフォルダを参照する」などのエラーが発生することがあります。エラー処理を実装する際の考え方については、【VBA】On Error Resume Nextでエラーを無視してエラーの制御|危険な理由の記事も参考にしてみてください。
・ファイル名ルールを決める
部分一致検索を利用する場合は、
- 売上_yyyymm.xlsx
- 受注_yyyymm.xlsx
のような命名ルールを決めておくと誤動作を防げます。
✅ まとめ:VBAでフォルダ指定してファイルを開く方法を使い分けよう
今回紹介した方法を使うことで、フォルダ内のファイル操作を効率化できます。
- Workbooks.Openで基本的なファイルオープン
- FolderPickerでフォルダ選択
- Dir関数で全ファイル取得
- 部分一致検索で柔軟なファイル選択
- ダイアログ+検索を組み合わせて実務運用
ファイル操作は多くの業務自動化の入口です。まずはフォルダ選択と部分一致検索を組み合わせた仕組みから導入し、より実務的なマクロへ発展させてみてください。