HOME > 即効テクニック > Excel VBA > ファイル操作関連のテクニック > [ファイルを開く]ダイアログボックスを表示する(GetOpenFilenameメソッド)

[ファイルを開く]ダイアログボックスを表示する(GetOpenFilenameメソッド)|Excel VBA

ファイル操作関連のテクニック

[ファイルを開く]ダイアログボックスを表示する(GetOpenFilenameメソッド)

(Excel 97/2000/2002/2003/2007/2010/2013/2016)

GetOpenFilenameメソッドは、 [ファイルを開く]ダイアログボックスを表示し、ユーザーが選択したファイルのフルパスを返します。
ダイアログボックスにはカレントフォルダを表示します。
また、ファイルフィルタを使ってファイルの種類をフィルタすることができます。

構文 Object.GetOpenFilename(FileFilter, FilterIndex, Title, ButtonText, 
                             MultiSelect)
設定項目 内容
ObjectApplicationオブジェクト [省略不可]
FileFilterファイルの種類を指定する文字列(ファイルフィルタ文字列)を指定 [省略可能]
省略すると "すべてのファイル (*.*),*.*"になる
FilterIndex 引数FileFilterで指定したファイルフィルタ文字列の中で、何番目のフィルタを既定値とするかを指定 [省略可能]
Titleダイアログボックスのタイトルを指定 [省略可能]
ButtonTextMacintoshのみ指定できる [省略可能]
MultiSelect複数ファイルを選択できる(True)、1つのファイルしか選択できない(False:既定値) [省略可能]

■1つのファイルを選択する

サンプル1では、ファイルの種類にcsvファイルを指定して、[ファイルを開く]ダイアログボックスを表示します。
ファイルを選択すると、そのファイルのフルパスがメッセージボックスに表示されます。

GetOpenFilenameメソッドの戻り値はバリアント型です。
ファイルを選択すると、そのパスを返すだけで、実際にファイルは開かれません。
[キャンセル]ボタンをクリックしたり、[×]ボタンでダイアログボックスを閉じるなど、ファイルの選択をキャンセルした場合はFalseを返します。
キャンセルされたかどうかはVarType関数で判定します。

●サンプル1●

Sub Sample1()
    Dim myFile As Variant
    
    ChDir "C:\Data"
    myFile = Application.GetOpenFilename("CSVファイル(*.csv),*.csv")

    If VarType(myFile) = vbBoolean Then
        MsgBox "キャンセルされました"
    Else
        MsgBox myFile & " が選択されました"
    End If
End Sub

引数FileFilterには、ファイルフィルタ文字列とワイルドカードをペアにして、「,(カンマ)」で区切りって指定します。ファイルの種類を複数指定する場合は、各ペアを「,」で区切って指定します。各ペアは、[ファイルの種類]ボックスのリストに表示されます。
ペアごとではなく、引数に指定する文字列全体を「"」で囲むことに注意してください。

例)CSVファイルとテキストファイルを指定
"CSV ファイル (*.csv),*.csv,テキストファイル (*.txt),*.txt"

1つのファイルフィルタ文字列に複数のワイルドカードを対応させるには、ワイルドカードを「;(セミコロン)」で区切って指定します。

例)Excelファイルに3種類のワイルドカードを対応させる
"Excel ファイル (*.xls; *.xlsx; *.xlsm),*.xls; *.xlsx; *.xlsm"

■複数のファイルを選択する

複数ファイルを選択可能にするには、引数MultiSelectをTrueにします。
その場合、GetOpenFilenameメソッドは選択されたファイルのフルパスが入った配列を返します。
選択されたファイルが1つでも配列を返します。
ファイルが選択されたかどうかはIsArray関数で判定します。

サンプル2では、選択されたすべてのファイルのフルパスをイミディエイトウィンドウに出力します。キャンセルされた場合は「False」が出力されます。

●サンプル2●

Sub Sample2()
    Dim myFile As Variant
    Dim f As Variant
    
    ChDir "C:\Data"
    myFile = Application.GetOpenFilename( _
         FileFilter:="Excel ファイル (*.xls; *.xlsx),*.xls; *.xlsx", _
         MultiSelect:=True)
    
    If IsArray(myFile) Then
        For Each f In myFile
            Debug.Print f
        Next
    Else
        Debug.Print myFile
    End If
End Sub