【EXCEL VBA】ファイル選択ダイアログの初期フォルダおよび拡張子を指定したい

ファイル選択ダイアログの初期フォルダおよび拡張子を指定する方法を紹介します。ファイル選択ダイアログを利用するにはApplication.GetOpenFilenameを使います。しかしデフォルトのままでは、やや使いづらい印象があります。使いやすいファイル選択ダイアログにするための方法を紹介します。

Application.GetOpenFilenameとChDirで解決する

まずは拡張子を指定する方法を紹介します。ファイル選択ダイアログを表示するにはApplication.GetOpenFilenameを使いますが、引数としてFileFilterを引数とすることがポイントとなります。具体的な指定方法をサンプルプログラムを参照ください。

参考として、Application.GetOpenFilenameの引数一覧をいかに示します。

名前必須/オプションデータ型説明
FileFilterOptionalVariantファイルの候補を指定する文字列 (ファイル フィルター文字列) を指定します。
FilterIndexOptionalVariantFileFilterで指定したファイル フィルター文字列の中で、1 から何番目の値を既定値とするかを指定します。 この引数を省略するか、ファイル フィルター文字列の数より大きい数値を指定すると、最初のファイル フィルター文字列が既定値となります。
TitleOptionalVariantダイアログ ボックスのタイトルを指定します。 この引数を省略すると “ファイルを開く” になります。
ButtonTextOptionalVariantMacintoshでのみ指定できます。
MultiSelectOptionalVariantTrueを指定すると、複数のファイルを選択できます。 Falseを指定すると、1 つのファイルしか選択できません。 既定値は False です。

次に初期フォルダを指定する方法を紹介します。Application.GetOpenFilenameには初期フォルダを指定する引数がありません。よって、Application.GetOpenFilenameを呼ぶ手前でChDirにてフォルダの位置を変更することがポイントになります。もう少し工夫することで、ネットワークパスも設定することができるため使い勝手はよいと思います。詳細はサンプルプログラムを参照ください。

サンプルプログラム

サンプルプログラムを動かすには参照設定が必要です。「Windows Script Host Object Model」を事前に選択しておいてください。

Option Explicit

Sub sample()
    'デフォルト
    Application.GetOpenFilename

    '単一の拡張子を指定
    Application.GetOpenFilename "Excelファイル,*.xlsx"

    '複数の拡張子を指定1
    Application.GetOpenFilename "新旧Excelファイル,*.xls;*.xlsx"

    '複数の拡張子を指定2
    Application.GetOpenFilename "新旧Excelファイル,*.xls;*.xlsx,Excelマクロ,*.xlsm,CSVファイル,*.csv"

    '初期表示フォルダを変更
    ChDir "C:\Program Files"
    Application.GetOpenFilename

    '初期表示フォルダを変更(ネットワークパス)
    Dim sh As New IWshRuntimeLibrary.WshShell
    sh.CurrentDirectory = "\\raspi4\raspi_share"
    Application.GetOpenFilename

End Sub
Application.GetOpenFilename
Application.GetOpenFilename “Excelファイル,*.xlsx”
Application.GetOpenFilename “新旧Excelファイル,*.xls;*.xlsx”
Application.GetOpenFilename “新旧Excelファイル,*.xls;*.xlsx,Excelマクロ,*.xlsm,CSVファイル,*.csv”
ChDir “C:\Program Files”
Application.GetOpenFilename
Dim sh As New IWshRuntimeLibrary.WshShell
sh.CurrentDirectory = “\\raspi4\raspi_share”
Application.GetOpenFilename