Excelで作業していると、「複数のファイルの中からユーザーに選ばせて開きたい」というシーンがよくあります。毎回ファイル名をコードに書き込むのは非効率であり、業務効率化を目指すなら 「ファイルを選択して開く処理」 をVBAで組むのが最適です。
この記事では、「vba ファイルを選択して開く」というテーマで、初心者にも分かりやすいように以下の流れで解説します。
✅ VBAでファイルを選択して開く基本構文
✅ Application.GetOpenFilenameの使い方
✅ 選択したファイルをWorkbooks.Openで開く実例
✅ 複数ファイル選択の方法と活用例
✅ 実務で使えるサンプルコード集
✅ エラー対策・ユーザビリティ改善のポイント
目次
✅ ファイルを選択して開く基本構文
ExcelVBAでファイル選択ダイアログを表示するには Application.GetOpenFilename を使います。そして、実際にファイルを開くには Workbooks.Open を組み合わせます。
基本的な流れは次のとおりです。
Dim filePath As Variant
filePath = Application.GetOpenFilename("Excelファイル,*.xlsx")
If filePath <> False Then
Workbooks.Open filePath
End If
Application.GetOpenFilename
→ ファイル選択ダイアログを表示する。選択したファイルのパスを返す。Workbooks.Open
→ 返ってきたパスを指定してブックを開く。
この2つを組み合わせるのが王道の書き方です。
参考:【VBA】ダイアログを開いてファイルを開く方法|ユーザーに選ばせて安全に自動化
✅ Application.GetOpenFilenameの基本
Application.GetOpenFilename は、ファイルを開くのではなく「ファイルパスを文字列として返すメソッド」です。これを変数に格納し、その後 Workbooks.Open に渡して開きます。
・ 書式
Application.GetOpenFilename(FileFilter, FilterIndex, Title, ButtonText, MultiSelect)
主な引数
- FileFilter : ファイルの種類を指定(例
"Excelファイル,*.xlsx") - FilterIndex : フィルタの既定値(1が最初)
- Title : ダイアログのタイトル
- MultiSelect : Trueで複数選択可(既定はFalse)
・ 例1:Excelファイルのみ選択可能にする
Dim filePath As Variant
filePath = Application.GetOpenFilename("Excelファイル,*.xlsx")
If filePath <> False Then
MsgBox "選択されたファイル:" & filePath
End If
・ 例2:複数の種類を指定する
filePath = Application.GetOpenFilename( _
FileFilter:="Excelファイル,*.xlsx,CSVファイル,*.csv,すべてのファイル,*.*", _
FilterIndex:=1, Title:="開くファイルを選択してください")
このようにカンマ区切りで複数のファイル形式を指定できます。
✅ Workbooks.Openで実際に開く
ファイルパスを取得した後に Workbooks.Open を使えば実際に開けます。
・ 例:選択したファイルを開く
Dim filePath As Variant
filePath = Application.GetOpenFilename("Excelファイル,*.xlsx")
If filePath <> False Then
Workbooks.Open filePath
Else
MsgBox "キャンセルされました"
End If
- キャンセル時は
Falseが返るので、その場合は処理をスキップします。 - これを入れないとキャンセル時にエラーになるため注意が必要です。
参考:【VBA】ファイルを開く・閉じる(OpenメソッドとCloseメソッド)
✅ 複数ファイルを選択して開く方法
MultiSelect:=True を指定すると、複数ファイルを一度に選択できます。
この場合、戻り値は「配列」になるためループで処理します。
・ サンプルコード:複数ファイルを開く
Sub OpenMultipleFiles()
Dim filePaths As Variant
Dim i As Integer
filePaths = Application.GetOpenFilename( _
FileFilter:="Excelファイル,*.xlsx", _
Title:="複数のファイルを選択してください", _
MultiSelect:=True)
If IsArray(filePaths) Then
For i = LBound(filePaths) To UBound(filePaths)
Workbooks.Open filePaths(i)
Next i
Else
MsgBox "キャンセルされました"
End If
End Sub
これにより、選んだExcelファイルを一括で開くことができます。
特に「複数の売上データを順に処理する」といった業務で便利です。
✅ 実務で使える応用例
・ 例1:CSVファイルを選んで開く
Dim filePath As Variant
filePath = Application.GetOpenFilename("CSVファイル,*.csv")
If filePath <> False Then
Workbooks.Open filePath
End If
・ 例2:ユーザーが選んだファイルをコピーして集約
Dim filePath As Variant
filePath = Application.GetOpenFilename("Excelファイル,*.xlsx")
If filePath <> False Then
Workbooks.Open filePath
ActiveSheet.Range("A1:D10").Copy ThisWorkbook.Sheets("集計").Range("A1")
End If
・ 例3:特定フォルダのパスを初期表示に設定
ChDir "C:\Users\Public\Documents"
filePath = Application.GetOpenFilename("Excelファイル,*.xlsx")
ChDir でカレントフォルダを変更してからダイアログを表示すれば、毎回目的のフォルダを表示できます。
✅ エラー対策とユーザビリティ向上
- キャンセル時の処理を必ず書く
If filePath <> False Thenを入れる- これがないとキャンセル時にエラーが発生します
- ファイルが存在するか確認する
If Dir(filePath) = "" Then
MsgBox "ファイルが存在しません"
Exit Sub
End If
- 読み取り専用で開くオプション
Workbooks.Open Filename:=filePath, ReadOnly:=True
- タイトルを工夫してユーザーに分かりやすく
Application.GetOpenFilename(Title:="売上データを選択してください")
■ まとめ
ExcelVBAで「ファイルを選択して開く」処理を作るには、
Application.GetOpenFilenameでパスを取得Workbooks.Openでファイルを開く- 複数ファイル選択時は配列処理を行う
- エラー対策(キャンセル時処理・存在確認)を入れる
という流れが基本です。
この仕組みを使えば、ユーザーに柔軟にファイルを選ばせながら自動処理を進めるマクロが実現できます。特に、日次・週次で異なるファイルを処理するような業務において大幅な効率化が可能です。