【エクセルVBA】ファイルダイアログで選択されたファイル一覧を取得する(Application – FileDialog)

前回の記事で「フォルダ配下(サブフォルダ含む)の全ファイルの一覧取得」はできたけど、今度は「ユーザーが選択したファイルの一覧取得」をしたいんだよな。

どうやってユーザーに選択させたらよいのやら。

ファイルダイアログを表示させて、ユーザーにファイルを選択してもらう方法があるよ。

エクセルを開いたり保存したりする時に出てくるダイアログと同じものね。

なるほど、そういう方法があるのか。

ユーザーも見慣れているだろうし、使いやすそうですね。

どのようにしたらいいのでしょう?

いくつかの方法があるけど「Applicatoin.FileDialog」を使うのが個人的にはお勧めね。

ということで、

ファイルダイアログを表示してユーザーが選択したファイル一覧を取得する方法

について紹介します。

はじめに

まずは、ファイルダイアログの表示でよく使われる3つの方法に触れておきます。

以下にそれぞれの概要を示していますが、詳細についてはマイクロソフトのサイトを参照ください。

  • 「Allication.GetOpenFilename」メソッド
    ユーザーがファイルを選択するための「ファイルを開く」 ダイアログが表示されます。ただし、ファイルを選択して開くボタンを押下しても、ファイル自体は実際には開かれません。「Get~」とある通りファイルパスが返却されるだけなので、ファイルを開く処理は自分で実装する必要があります。
  • Application.GetSaveAsFilenameメソッド
    ユーザーがファイル名を設定するための「名前を付けて保存」ダイアログが表示されます。ただし、ファイル名を設定して保存ボタンを押下しても、ファイル自体は実際には保存されません。「Get~」とある通りファイルパスが返却されるだけなので、ファイルの保存処理は自分で実装する必要があります。
  • Application.FileDialogオブジェクト
    ファイルを開いたり保存するための「ファイルを開く」 および「名前を付けて保存 ダイアログが表示されます。ダイアログの種類は「ファイルを選択」「フォルダを選択」「ファイルを開く」「ファイルを保存」の4種類を引数に設定することで選択でき、開くと保存では「Execute」メソッドを呼ぶことで、ファイルを開いたり保存したりする処理が実行されます。

いかがでしょう。

やはり、3つ目の「Application.FileDialog」が個人的には使い勝手がよいかと思います。

この記事では「Application.FileDialog」を「ファイルを選択」のタイプで使用しています。

ソースコード

'-----------------------------------------------------------------------
'ファイルダイアログで選択されたファイルのパスを取得する
'-----------------------------------------------------------------------
Public Function GetSelectedFilePaths(ByVal initialPath As String, ByVal isMulti As Boolean) As Object

    'ファイルダイアログのタイプを「ファイル選択(msoFileDialogFilePicker)」とする
    With Application.FileDialog(msoFileDialogFilePicker)

        '引数「initialPath」の値に従い、ファイルダイアログを開いた時の初期フォルダのパスを設定
        .InitialFileName = initialPath

        '引数「isMulti」の値(Ture/False)に従い、複数ファイル指定可能にするかを設定
        .AllowMultiSelect = isMulti

        'ファイルダイアログのタイトルを設定
        .Title = "ファイルを選択してください。"

        'ファイルダイアログを表示し、「開く」ボタンが押下された場合は、選択されたファイルを返却する
        '「キャンセル」ボタンが押下された場合は、マクロを終了する
        '(終了させないとファイルが選択されていないのに以降の処理が走ってしまうため)
        If .Show Then
            Set GetSelectedFilePaths = .SelectedItems
        Else
            End
        End If
    End With
End Function

参照設定から「Microsoft Office xx.xx Object Library」を有効にしてください。

「xx.xx」の部分はエクセルのバージョンにより異なります

テストコード

Sub Test()
    Dim filePath As Variant
    For Each filePath In GetSelectedFilePaths("C:\00_myenv\99_tmp", True)
        Debug.Print filePath
    Next filePath
End Sub

実行結果

実行するとファイルダイアログが開くので、取得したいファイルを選択します。

テストコードでは引数「isMulti」を「True」に設定しているので、下の画像のように複数選択ができるようになります。

さらに深いフォルダのファイルを選択したい場合は、エクスプローラーのようにフォルダを辿っていくこともできます。

ファイル選択ダイアログ

指定したフォルダ配下の全てのファイルではなく、選択したファイルのみが取得されます。

実行結果

説明

ソースコードの説明はコメントの通りとなります。

「InitialFileName」「AllowMultiSelect」「Title」などのプロパティは、ソースコードで使っているもの以外にもありますので、これもマイクロソフトのサイトをご確認ください。

それから、実行結果に示したような1階層にあるファイルだけではなく、階層が違う複数ファイルを取得したい場合があると思います。

この場合は、ファイルダイアログ上で検索を実施すると、以下のように検索結果が表示されるので、その中から任意のファイルを選択をすることで取得できます。

ファイル選択ダイアログで検索した状態

違う階層でも選択したファイルのみが取得出来ています。

実行結果(違う階層のファイル選択時)

また、取得するファイルを複数ではなく1つだけにしたい場合は、引数「isMulti」を「False」にして呼び出します。

そうすると、ファイルダイアログ上でファイルは1つしか選択できないようになります。

この場合、呼び出し側ではテストコードに書いたような「For Each」のループ処理は不要となりますが、以下のように最後に「(1)」を付けることで値を取得できます。

Debug.Print GetSelectedFilePaths("C:\00_myenv\99_tmp", False)(1)

まとめ

ファイルダイアログを表示して、ユーザーがファイル選択する方法を「Application.FileDialog」を使って紹介しました。

処理対象とするファイルが毎回変わるような場合に便利かと思います。

また、今回は使いませんでしたが、「Application.FileDialog」はダイアログのタイプを変えれば「ファイルを開く」や「ファイルを保存」などもできますので、興味のある方は見てみるのもよいかと思います。

以上、ご覧いただきありがとうございました。