マクロで外部のExcelファイルを読み込む際に、ファイルパスをコード内に直接書き込む(ハードコーディングする)のではなく、マクロ実行時にユーザー自身にファイルを選択させたい、という場面は非常に多くあります。
VBAの**Application.GetOpenFilename
メソッド**を使えば、お馴染みの「ファイルを開く」ダイアログボックスを簡単に表示し、ユーザーが選択したファイルのフルパスを文字列として取得できます。
この記事では、その基本的な使い方と、ファイルの種類を絞り込むための引数の設定方法などを解説します。
完成したVBAコード
Sub ShowFileOpenDialog()
' 変数を宣言します。戻り値はパス(文字列)かFalse(ブール値)のため、Variant型にします。
Dim selectedFilePath As Variant
'--- 1. 「ファイルを開く」ダイアログボックスを表示 ---
selectedFilePath = Application.GetOpenFilename( _
Title:="処理対象のExcelブックを選択してください", _
FileFilter:="Excel ブック (*.xlsx; *.xlsm),*.xlsx;*.xlsm,すべてのファイル (*.*),*.*")
'--- 2. 選択結果を判定 ---
If selectedFilePath = False Then
' 「キャンセル」が押された場合
MsgBox "ファイルの選択がキャンセルされました。"
Else
' ファイルが選択された場合
MsgBox "以下のファイルが選択されました。" & vbCrLf & selectedFilePath
' (応用) 実際にそのブックを開く処理
' Workbooks.Open selectedFilePath
End If
End Sub
コードのポイント解説
① Application.GetOpenFilename
メソッド
このメソッドを実行すると、「ファイルを開く」ダイアログボックスが表示されます。重要なのは、このメソッドはファイルを実際に開くわけではなく、選択されたファイルのフルパスを文字列として返すだけ、という点です。ファイルを開くには、取得したパスを使って別途Workbooks.Open
を実行する必要があります。
② FileFilter
引数
ダイアログの右下にある「ファイルの種類」のドロップダウンリストを設定するための、非常に重要な引数です。
FileFilter:="表示名1,*.拡張子1,表示名2,*.拡張子2"
表示名
と拡張子のパターン
をカンマ区切りでペアにして指定します。複数の拡張子をまとめたい場合は、セミコロン(;
)で区切ります。
例: "Excel ブック (*.xlsx; *.xlsm),*.xlsx;*.xlsm"
Excel ブック (*.xlsx; *.xlsm)
: ドロップダウンに表示されるテキストです。*.xlsx;*.xlsm
: 対応する拡張子のパターンです。
③ キャンセルされた場合の処理
If selectedFilePath = False Then
ユーザーがダイアログでファイルを選択せずに「キャンセル」ボタンを押した場合、GetOpenFilename
メソッドは**ブール値のFalse
**を返します。
そのため、戻り値を受け取る変数はVariant
型で宣言しておき、If
文でFalse
かどうかを判定することで、キャンセル時の処理を正しく分岐させることができます。
【応用】選択したファイルを実際に開く
GetOpenFilename
で取得したファイルパスを、Workbooks.Open
と組み合わせることで、「ユーザーが選んだファイルを開く」という一連の動作が完成します。
Sub SelectAndOpenFile()
Dim bookPath As Variant
bookPath = Application.GetOpenFilename(FileFilter:="Excel ブック (*.xlsx; *.xlsm),*.xlsx;*.xlsm")
If bookPath <> False Then
Workbooks.Open bookPath
MsgBox ActiveWorkbook.Name & " を開きました。"
End If
End Sub
まとめ
Application.GetOpenFilename
メソッドは、ユーザーとの対話的なマクロを作成する上で不可欠な機能です。
- **戻り値はファイルのフルパス(文字列)**であり、ファイル自体を開くわけではない。
FileFilter
引数で、ユーザーがファイルを選びやすいように種類を絞り込む。- 戻り値を受け取る変数は**
Variant
型にし、False
かどうか**でキャンセルを判定する。
これらのポイントを押さえることで、より柔軟でユーザーフレンドリーなVBAツールを作成することができます。