VBAでユーザーにファイルを選択させたい場合、Application.GetOpenFilename
メソッドを使用すると、ファイル選択ダイアログを簡単に表示できます。
この記事では、Application.GetOpenFilename
メソッドの基本構文から各引数の意味、ファイルフィルターの設定方法、複数ファイル選択のやり方、キャンセル時の処理方法、さらに初期フォルダ指定の応用テクニックまで、実務に役立つ内容を徹底解説します。
GetOpenFilenameの基本構文と引数
Application.GetOpenFilename
メソッドは、ファイル選択ダイアログを表示し、選択されたファイルのフルパスを返します。
GetOpenFilenameの基本構文
下記がApplication.GetOpenFilename
メソッドの基本構文です。
Application.GetOpenFilename([FileFilter], [FilterIndex], [Title], [ButtonText], [MultiSelect])
GetOpenFilenameの引数(全て省略可)
Application.GetOpenFilename
メソッドの引数は下表の通りですが、全ての引数が省略可能であり、
引数 | 説明 |
---|---|
FileFilter | 表示するファイルの種類を指定(例:”Excel ファイル (*.xlsx), *.xlsx”) |
FilterIndex | デフォルトで選択されるフィルターの番号(1から始まる) |
Title | ダイアログのタイトルバーに表示される文字列 |
ButtonText | Mac専用:ボタンのラベルを指定(Windowsでは無視される) |
MultiSelect | 複数選択を許可するか(True =複数可、False =1つのみ) |
Application.GetOpenFilename
メソッドの引数は表に示す通りですが、全ての引数が省略可能であり、最もシンプルな形式では下記コードのように記述できます。
Dim filePath as String
filePath = Application.GetOpenFilename()
GetOpenFilenameの戻り値
Application.GetOpenFilename
メソッドの戻り値は、ユーザーがファイル選択したか、もしくはキャンセルしたかによって異なります。
さらに、ファイル選択が単一か複数かによっても下表のように異なります。
MultiSelect の値 | ユーザーがファイル選択した場合 | ユーザーがキャンセルした場合 |
---|---|---|
False (省略時も含む) | ファイルパスの文字列(Variant型) | False(Boolean型) |
True | ファイルパスの配列(Variant型) |
MultiSelect=False
(単一選択)時 → 選択されたファイルのフルパス(Variant型)MultiSelect=True
(複数選択)時 → ファイルパスの配列(Variant型)
GetOpenFilenameの基本コード
Application.GetOpenFilename
メソッドの基本コードは下記の通りです。
Sub SelectFile()
Dim filePath As Variant
filePath = Application.GetOpenFilename()
If filePath = False Then
MsgBox "ファイルが選択されませんでした。"
Else
MsgBox "選択されたファイル: " & filePath
End If
End Sub
ユーザーのファイル選択結果を変数filePath
に格納して、filePath
の値によってファイルが選択されているかどうかを判定しています。
ファイルフィルターの設定方法
Application.GetOpenFilename
メソッドでは、特定のファイルに絞り込んだ状態で選択ウィンドウを表示することができます。
Sub SelectExcelFile()
Dim filePath As Variant
filePath = Application.GetOpenFilename("Excelファイル (*.xlsx), *.xlsx")
If filePath = False Then
MsgBox "ファイルが選択されませんでした。"
Else
MsgBox "選択されたファイル: " & filePath
End If
End Sub
上記コードを実行すると、下図のようにワード・パワーポイント・エクセル等複数の種類のファイルが保存されている場合でも、エクセルファイル(拡張子が.xlsx)のみを選択できるようにすることもできます。

ファイルフィルターの構文
Application.GetOpenFilename
メソッドでファイルフィルターを設定するための構文は下記の通りです。
Application.GetOpenFilename("任意の説明,文字列パターン,任意の説明,文字列パターン,...")
文字列パターンには、絞り込みたいファイルの拡張子を含めた文字列を指定するのがおすすめです。
ワイルドカード(*)の意味と使い方
ワイルドカードとして *
は「任意の文字列」を意味します。
使い方としては下表の例のようにして、文字列をあいまいに指定することができます。
文字列パターン | 意味 |
---|---|
*.* | 拡張子を問わずすべてのファイル |
*.xlsx | .xlsx 拡張子のファイルのみを対象とする |
*.csv | .csv 拡張子のファイルのみを対象とする |
複数ファイルの選択
Application.GetOpenFilename
メソッドを使って、複数のファイルを選択させることも可能です。
その場合、選択されたファイルは配列として返されます。
Sub SelectMultipleFiles()
Dim filePaths As Variant
Dim i As Integer
filePaths = Application.GetOpenFilename("すべてのファイル (*.*),*.*", , "複数ファイルを選択", , True)
If IsArray(filePaths) = True Then
For i = LBound(filePaths) To UBound(filePaths)
MsgBox "ファイル " & (i + 1) & ": " & filePaths(i)
Next i
Else
MsgBox "ファイルが選択されませんでした。"
End If
End Sub
コードの解説
MultiSelect
オプションをTrue
に設定することで複数のファイルを選択可能にしています。- 選択されたファイルパスは配列
filePaths
に格納され、各ファイルのパスがループ内で処理されます。 IsArray
関数がTrue
を返す場合を、ユーザーがファイルを選択したと判定しています。
配列については下記記事で詳しく解説しています。
応用例:特定のフォルダを初期表示する
通常、Application.GetOpenFilename
メソッドでユーザーに向けて初期表示されるフォルダは、ユーザーが最近表示していたフォルダが表示されます。
ある特定のフォルダを初期表示するように仕組み化しておく方が、ユーザーの手数が減り満足度の高いマクロになります。
下記はユーザーのデスクトップを初期表示する場合のコードです。
Sub SelectFileFromDesktop()
Dim filePath As Variant
Dim desktopPath As String
desktopPath = CreateObject("WScript.Shell").SpecialFolders("Desktop")
ChDir desktopPath
filePath = Application.GetOpenFilename()
If filePath = False Then
MsgBox "ファイルが選択されませんでした。"
Else
MsgBox "選択されたファイル: " & filePath
End If
End Sub
初期表示するフォルダをデスクトップではなく細かく設定したい場合は下記コードを参考にしてみてください。
Sub SelectFileFromAcrobatFolder()
Dim filePath As Variant
Dim folderPath As String
folderPath = "C:\Users\Username" '←初期表示したいディレクトリをここで指定する
ChDir folderPath
filePath = Application.GetOpenFilename("すべてのファイル (*.*), *.*", , "ユーザーフォルダから選択")
If filePath = False Then
MsgBox "ファイルが選択されませんでした。"
Else
MsgBox "選択されたファイル: " & filePath
End If
End Sub
まとめ
Application.GetOpenFilename
は、ユーザーにファイルを選択させる便利なメソッド- 引数をうまく活用することで、目的に応じた柔軟なファイル選択処理が可能
- キャンセル時の処理、複数ファイル選択、初期フォルダの指定なども簡単に実装可能
実務でのファイル操作をよりスムーズにするために、ぜひこのメソッドを活用してください!