【ExcelVBA】ファイルダイアログを開いてファイルを選択する

仕事効率化
スポンサーリンク

  • VBAで任意のファイルを選択して処理するにはどうすればいいの?
  • ファイルダイアログから選択したい
  • ファイルダイアログを開く方法が知りたい
と思ったこともあるのではないでしょうか。

そこで今回は、ファイルダイアログを表示して任意のファイルを選択できる「GetOpenFilename」メソッドのサンプルコード、その他の使い方について紹介します。

スポンサーリンク

VBAでファイルダイアログを開くサンプルコード

'ファイルダイアログを開いてファイルを選択
Dim trgtFile As Variant
trgtFile = Application.GetOpenFileName("すべてのファイル (*.*),*.*")

If trgtFile = False Then
    '「キャンセル」ボタンまたは「×」ボタンを押した時は「False」となる
    MsgBox "ファイルが選択されていません。"
Else
    '選択したファイルのフルパスをMsgBoxで表示
    MsgBox trgtFile
End If
上記コードを実行すると、下記のファイルダイアログが表示されます。
01-VBAファイルダイアログイメージ
その後、ダイアログ上の処理によって「If文」を使って条件分岐しています。ファイルダイアログでファイルを指定した場合は、画像のMsgBoxでフルパスが表示されます。
02-VBAファイルダイアログフルパスMsgBoxイメージ
ファイルを指定しなかった場合は、次の画像のMsgBoxが表示されます。
03-VBAファイルダイアログファイル選択なしMsgBoxイメージ
詳しい解説は次に続きます。

VBAでファイルダイアログを開くコードの解説

ファイルダイアログを開くGetOpenFileName

はじめに、今回のメインとなる「GetOpenFileName」メソッドについて解説します。
'ファイルダイアログを開いてファイルを選択
Dim trgtFile As Variant
trgtFile = Application.GetOpenFileName("すべてのファイル (*.*),*.*")
上記コードは、ファイルダイアログを開く「GetOpenFileName」メソッドを変数「trgtFile」に定義しています。

変数に定義することで「GetOpenFileName」メソッドで選択したファイル名を保持することができます。また「GetOpenFileName」メソッドは、ファイルを指定した時は「ファイル名フルパス」を文字列で返し、「キャンセル」や「×」を押した時には「False」を返すので、変数の型は「Variant」となります。

GetOpenFileNameの返り値を判定

続いて、ファイルダイアログを開いたあとの返り値を判定して、値によって処理を分岐させます。
If trgtFile = False Then
    '「キャンセル」ボタンまたは「×」ボタンを押した時は「False」となる
    MsgBox "ファイルが選択されていません。"
Else
    '選択したファイルのフルパスをMsgBoxで表示
    MsgBox trgtFile
End If
「If trgtFile = False Then」の部分で、ファイルダイアログ上で「キャンセル」か「×」を押していないかを判定しています。「trgtFile = False」の場合、ファイルを選ばずにファイルダイアログを閉じているので、MsgBoxで「ファイルが選択されていません。」と表示します。
04-VBAファイルダイアログファイル選択なしMsgBoxイメージ-2
何かファイルを指定した場合は、MsgBoxで指定したファイルのフルパスを表示します。
05-VBAファイルダイアログフルパスMsgBoxイメージ-2

GetOpenFileNameの引数一覧

今回紹介した「GetOpenFileName」メソッドの引数一覧を紹介します。
  1. 基本構文
Application.GetOpenFileName([FileFilter], [FilterIndex], [Titlee], [ButtonText], [MultiSelect])
  1. 引数一覧
引数名省略既定値詳細
FileFilter省略可“すべてのファイル (.),.ファイル候補を指定(例は後述)
FilterIndex省略可最初のFileFilter複数のFileFilterを指定した場合に、何番目のFileFilterを規定にするかを指定
Title省略可“ファイルを開く”ダイアログボックスのタイトルを指定
ButtonText省略可Macでのみ指定可能
MultiSelect省略可FalseTrue:複数のファイルを選択可能(返り値は配列)
False:1つのファイルのみ選択可能(返り値は文字列)
第一引数「FileFilter」に指定できる文字列の例をいくつか記載します。
  • 「FileFilter」に指定できる文字列の例
    • “すべてのファイル (*.*),*.*”
    • “CSVファイル(*.csv), *.csv”
    • “テキストファイル (*.txt),*.txt”
    • “Excel ファイル (*.xls),*.xls”
    • “Excel ファイル (*.xlsx),*.xlsx”
    • “Excel ファイル (*.xlsm),*.xlsm”
    • “Excel ファイル (*.xls; *.xlsx; *.xlsm),*.xls; *.xlsx; *.xlsm”

GetOpenFileNameのその他の使い方

デフォルトフォルダを設定する方法

'カレントフォルダを指定
ChDir "C:\Sample"

'ファイルダイアログを開いてファイルを選択
Dim trgtFile As Variant
trgtFile = Application.GetOpenFileName("すべてのファイル (*.*),*.*")
「GetOpenFileName」メソッドでファイルダイアログを開いた際に表示されるフォルダは「カレントフォルダ(作業中フォルダ)」です。このカレントフォルダの移動には「ChDir」を使用します。

つまり、サンプルコードのように「GetOpenFileName」の直前で「ChDir」を実行することで、任意のフォルダをデフォルトフォルダとしてファイルダイアログを開くことができます。
06-VBAファイルダイアログデフォルトフォルダイメージ

ファイルではなくフォルダを選択する方法

With Application.FileDialog(msoFileDialogFolderPicker)
    If .Show = False Then
        '「キャンセル」ボタンまたは「×」ボタンを押した時は「False」となる
        MsgBox "フォルダが選択されていません。"
    Else
        '選択したフォルダのフルパスをMsgBoxで表示
        Dim trgtFolder  As Variant
        trgtFolder = .SelectedItems(1)
        MsgBox trgtFolder
    End If
End With
ファイルではなくフォルダを選択したい時には、「GetOpenFileName」ではなく、「FileDialog」を使用します。

サンプルコードでは、「FileDialog」の引数に「msoFileDialogFolderPicker」を指定して、フォルダを選択できるよう設定しています。また「キャンセル」か「×」を押した際には「False」を返すことを利用して、処理を分けています。
07-VBAファイルダイアログフォルダピッカーイメージ
「False」を返す場合、つまりファイルを選択せず「キャンセル」か「×」を押した際は「フォルダが選択されていません。」とMsgBoxで表示します。
08-VBAファイルダイアログフォルダピッカーフォルダ選択なしMsgBoxイメージ
フォルダを選択した場合は「選択したフォルダのフルパス」をMsgBoxで表示します。
09-VBAファイルダイアログフォルダピッカーフォルダフルパスMsgBoxイメージ

VBAでファイルダイアログを開くまとめ

今回はVBAでファイルダイアログを表示して任意のファイルを選択する「GetOpenFileName」メソッドと、あわせて知っておくと便利な応用を紹介しました。
GetOpenFileNameとあわせて知っておきたい応用
  • デフォルトフォルダを設定する方法
  • ファイルではなくフォルダを選択する方法
基本的な使い方はもちろん、各種引数の使い方や上記の応用についても理解しておくと、操作しやすいマクロを作ることができるので、ぜひ覚えておきましょう。