Excel VBA:[ファイルを開く]ダイアログボックスを表示(GetOpenFilenameメソッド)してファイル名を取得する方法

ExcelのVBAを使用して[ファイルを開く]ダイアログボックスを表示し、選択されたファイルの名前を取得するサンプルプログラム。

ExcelのVBAではAccessと違って最初から[ファイルを開く]ダイアログボックスを開くための"GetOpenFilename"メソッドが用意されている。

このメソッドを使うことで容易に[ファイルを開く]ダイアログボックスのインターフェースを利用することができる。

以下に"GetOpenFilename"メソッドの説明とサンプルプログラムを記述する。

スポンサーリンク

GetOpenFilenameメソッドについて

"GetOpenFilename"メソッドは、5つの引数を指定できるが、Windows版のExcelでは4つの引数のみ有効となる。

残りの1つの引数はMAC版のExcel用の引数となる。

GetOpenFilenameメッソの書式

変数 = Application.GetOpenFilename(FileFilter,FilterIndex,Title,ButtonText,MultiSelect)

以下に各引数について説明する。

FileFilter引数

[ファイルを開く]ダイアログボックスで指定できるファイルの種類を制限するための引数。

例えば指定できるファイルをCSVファイルだけに限定したいとか、ある特定の拡張子のファイルだけに限定したいときに指定する。

[ファイルを開く]ダイアログボックスの[ファイルの種類]コンボボックスの設定値。

指定の書式は以下のとおり。

"表示文字列,指定できる拡張子"

例:"CSVファイル,*.csv"

1つのフィルタに複数の拡張子を指定することもでき、その際には拡張子を";"(セミコロン)で区切る。

CSVファイルとTXTファイルの2つを指定できるようにするのであれば、

"CSVもしくはTXTファイル,*.csv;*.txt"

また、複数のフィルタを指定することもできる。

例えば、CSVファイルとExcelファイルの2つのフィルタを用意したければ、

"CSVファイル,*.csv,Excelファイル,*.xls;*.xlt"

このように指定した場合、[ファイルを開く]ダイアログボックスの[ファイルの種類]コンボボックスの一覧に"CSVファイル"と"Excelファイル"の2つがリストとして表示され、コンボボックスでどちらかを選択できるようになる。

フィルタを設定した例

FilterIndex引数

前述のFileFilter引数で複数のフィルタを設定した場合に、初期表示するフィルタの番号を指定する。

フィルタを"CSVファイル,*.csv,Excelファイル,*.xls;*.xlt"と指定した場合、"CSVファイル"と"Excelファイル"の2つのフィルタが[ファイルの種類]コンボボックスに表示される。

この2つのうちどちらのフィルタを[ファイルを開く]ダイアログボックスが開いたときに初期表示として表示させるかを番号で指定することができる。

例えば、"2"を指定すれば、初期表示されるフィルタは、"Excelファイル"になる。

この引数を省略した場合は、最初のフィルタが初期表示される。

Title引数

[ファイルを開く]ダイアログボックスのタイトルバーに表示する文字列を指定する。

この引数を省略した場合は、既定のタイトルである"ファイルを開く"が設定される。

タイトルバーの文字列を任意の文字列に変更した例

ButtonText引数

[開く]ボタンの表示文字列を指定できる引数で、Windows版では指定しても無効になり、MAC版のみ有効となる。

MultiSelect引数

開くファイルの指定を複数選択できるようにするかどうかをTrue/Falseで指定する。

この引数を省略した場合は、単一選択になる。

Trueに設定すると選択されたファイルは配列として返される。

複数ファイルの選択を可能にした例

GetOpenFilenameメソッドの返り値

GetOpenFilenameメソッドの実行結果として返される値は、指定されたファイル名を表す文字列となる。

MultiSelectをTrueに設定して複数選択できる場合は、選択された複数のファイルのファイル名を配列で返す(1つしか選択されなくても配列となる)。

また、[ファイルを開く]ダイアログボックスの[キャンセル]ボタンがクリックされた場合には"False"を返す。

GetOpenFilenameメソッド実行時のカレントフォルダについて

[ファイルを開く]ダイアログボックスを表示した際のカレントフォルダを指定したい場合は、"ChDir"を使用して、[ファイルを開く]ダイアログボックスを表示する前にカレントフォルダを変更しておく。

カレントフォルダをデスクトップフォルダなど、Windowsの特殊フォルダにしたい場合は、以下の記事を参考。

VBA共通:デスクトップフォルダやマイドキュメントフォルダなどWindowsの特殊フォルダのパスをVBAで取得するサンプルプログラム
マイドキュメントフォルダやデスクトップフォルダなどログインユーザーによってパスが変わるフォルダやWindowsがセットアップ時に作成するSystemフォルダなどの特殊なフォルダのパスをVBAで取得するサンプルプログラムを覚書。紹介するサンプ...

GetOpenFilenameメソッドを使ったサンプルプログラム1

以下のサンプルは最もシンプルな[ファイルを開く]ダイアログボックスの表示例で、フィルタを設定せず全てのファイル(*.*)を指定できる。

また、[ファイルを開く]ダイアログボックスを表示した際のカレントフォルダをデスクトップフォルダに変更してからダイアログボックスを表示している。

Sub OpenFileSample01()
Dim OpenFileName
Dim wScriptHost As Object, strInitDir As String
  'カレントディレクトリをデスクトップに変更
  Set wScriptHost = CreateObject("WScript.Shell")
    ChDir wScriptHost.SpecialFolders("Desktop")
    OpenFileName = Application.GetOpenFilename()
      If OpenFileName <> False Then
         MsgBox "指定されたファイルは、" & OpenFileName & " です。", vbInformation
      Else
         MsgBox "キャンセルがクリックされました。", vbInformation
      End If
End Sub

GetOpenFilenameメソッドを使ったサンプルプログラム2

指定できるファイルの種類としてCSVファイルとTXTファイルだけを指定できるように設定。

Sub OpenFileSample02()
Dim OpenFileName
Dim wScriptHost As Object, strInitDir As String

  'カレントディレクトリをデスクトップに変更
  Set wScriptHost = CreateObject("WScript.Shell")
    ChDir wScriptHost.SpecialFolders("Desktop")
    OpenFileName = Application.GetOpenFilename("CSVファイルもしくはTXTファイル,*.csv;*.txt")
      If OpenFileName <> False Then
         MsgBox "指定されたファイルは、" & OpenFileName & " です。", vbInformation
      Else
         MsgBox "キャンセルがクリックされました。", vbInformation
      End If
End Sub

実行結果

以下は上記のサンプルプログラムの実行結果の画面ショット。

OpenFileSample02の実行結果

GetOpenFilenameメソッドを使ったサンプルプログラム3

指定できるファイルの種類として"CSVファイルもしくは、TXTファイル"と"Excelファイル"の2つの種類を設定。

また、[ファイルを開く]ダイアログボックスのタイトルバーの文字列も設定。

Sub OpenFileSample03()
Dim OpenFileName
Dim wScriptHost As Object, strInitDir As String
    'カレントディレクトリをデスクトップに変更
    Set wScriptHost = CreateObject("WScript.Shell")
    ChDir wScriptHost.SpecialFolders("Desktop")
    OpenFileName = Application.GetOpenFilename( _
            "CSV、TXTファイル(*.csv;*.txt;),*.csv;*.txt,Excelファイル(*.xls;*.xlt),*.xls;*.xlt" _
            , 2, "開きたいファイルを指定してください。")
        If OpenFileName <> False Then
            MsgBox "指定されたファイルは、" & OpenFileName & " です。", vbInformation
        Else
            MsgBox "キャンセルがクリックされました。", vbInformation
        End If
End Sub

実行結果

以下は上記のサンプルプログラムの実行結果の画面ショット。

OpenFileSample03の実行結果

GetOpenFilenameメソッドを使ったサンプルプログラム4

MultiSelect引数をTrueに設定し、複数のファイルを選択できるように設定。

ファイルが指定された場合、配列で返されるためIsArray関数を用いてファイルが指定されたか[キャンセル]がクリックされたかを判定している。

Sub OpenFileSample04()
Dim OpenFileName, i As Integer
Dim wScriptHost As Object, strInitDir As String
  'カレントディレクトリをデスクトップに変更
  Set wScriptHost = CreateObject("WScript.Shell")
    ChDir wScriptHost.SpecialFolders("Desktop")
    OpenFileName = Application.GetOpenFilename("すべてのファイル(*.*),*.*", , _
                    "複数のファイルを指定できます。", , True)
                    
      If IsArray(OpenFileName) Then
        For i = LBound(OpenFileName) To UBound(OpenFileName)
            MsgBox "指定されたファイルは、" & OpenFileName(i) & " です。", vbInformation
        Next i
      Else
        MsgBox "キャンセルがクリックされました。", vbInformation
      End If
End Sub

実行結果

以下は上記のサンプルプログラムの実行結果の画面ショット。

OpenFileSample04の実行結果

以上。

Accessでは"WIZHOOK"なんていう非公開オブジェクトを使ってちょっと面倒なことをしないとできないけど、Excelではあらかじめ用意されているのでとても簡単にできる。

コメント

タイトルとURLをコピーしました