【VBA】ダイアログからファイル・フォルダパスを取得する

エクセルVBAで使用するコードの備忘録。VBAでダイアログボックスを開き、ユーザーが選択したファイルのパスを取得するコード。

スポンサーリンク

FileDialogオブジェクト

ファイル選択をユーザーに行わせるダイアログを表示させるにはFileDialogを使用します。ここではFileDialogオブジェクトを使用する際の設定方法について順番に説明していきます。

なお、コードを使用する際はカッコに囲まれた部分([***])を自分のプログラムに合わせて変更してください。

FileDialogオブジェクトの作成

FileDialogオブジェクトは下記のようにして設定します。

'--- FileDialogオブジェクトの設定 ---'
Dim fd As FileDialog
Set fd = Application.FileDialog([ダイアログのタイプ])

ダイアログのタイプとしては以下の定数が設定できます。VBAを使用してユーザーが選択したファイルやフォルダのパスを取得するには「msoFileDialogFilePicker」や「msoFileDialogFolderPicker」を指定します。

定数説明
msoFileDialogFilePicker選択したファイルのパスを
FileDialogSelectedItemsに保存する
msoFileDialogFolderPicker選択したフォルダのパスを
FileDialogSelectedItemsに保存する
msoFileDialogOpen選択したファイルを開く
msoFileDialogSaveAs選択した名前でファイルを保存する

読み込みファイルの種類

(フォルダパスを選択する場合にこの項目を設定しようとするとエラーになります)

次は読み込むファイルの種類を指定します。何も指定しなければすべてのファイルを選択することが可能です。設定はFileDialogオブジェクトのFiltersオブジェクトを使って次のように行います(fdは上で作成したFileDialogオブジェクトです)。Clearメソッドでまずフィルターを全て消去してAddメソッドで新規にフィルターを設定します。

'--- 選択可能なファイルの種類 ---'
Call fd.Filters.Clear
Call fd.Filters.Add("[表示ファイルタイプ]", "[拡張子などの条件]")

[表示ファイルタイプ]の部分にはダイアログに表示する読み込み可能ファイルを示す文字列を入力します。わかりにくいと思うので下記の例を見てください。

[拡張子などの条件]部分には読み込み可能とするファイルを判定する文字列をワイルドカード形式で入力します。例えば拡張子が「.xls」となっているものだけを読み取り対象としたいのであれば「*.xls」と入力します。複数のファイルタイプを選択可能とする場合にはセミコロン「;」を使って条件をつなげます。

下記では例として拡張子が「.xls」か「.xlsx」となっているエクセルファイルのみを選択できるように設定します。

'--- 選択可能なファイルの種類 ---'
Call fd.Filters.Clear
Call fd.Filters.Add("Excelファイル", "*.xls; *.xlsx")

初期表示フォルダ

FileDialogを開いたときにデフォルトで表示されるフォルダを指定することも可能です。指定しなければ前回使用した時に開いていたフォルダが初めに表示されます。設定にはFileDialogオブジェクトのInitialFileNameプロパティに表示したいフォルダパスを指定します。

ちなみに、デスクトップなどのユーザーごとに異なるフォルダパスを指定する場合はこちらを三個にしてみてください。

'--- 初期表示フォルダ ---'
fd.InitialFileName = "[フォルダパス]"

表示アイコンのサイズ

この辺りはもう設定してもしなくても構いませんが、一応メモしておきます。FileDialogを開いたときに表示されるアイコンの大きさを設定できます。設定にはFileDialogオブジェクトのInitialViewプロパティに値を設定します。

'--- 表示アイコンの大きさ ---'
fd.InitialView = [表示アイコンのタイプ]

表示アイコンのタイプとしては下記の定数を指定します。好みにもよりますが「msoFileDialogViewSmallIcons」などが無難で見やすいです。

定数説明
msoFileDialogViewDetailsファイル詳細を表示
msoFileDialogViewLargeIcons大アイコン
msoFileDialogViewList一覧
msoFileDialogViewPreviewプレビュー
msoFileDialogViewPropertiesプロパティ
msoFileDialogViewSmallIcons小アイコン
msoFileDialogViewThumbnailサムネイル
msoFileDialogViewTilesタイル

ダイアログを表示~クリック時の処理

FileDialogの表示設定が終わったら、実際にダイアログを表示してユーザーの操作を受け付けられるようにします。ダイアログを表示するにはFileDialogオブジェクトのShowメソッドを利用します。この時、ユーザーがちゃんとファイルを選択して選択ボタンを押した時だけファイルやフォルダを取得できるように処理を書く必要がありますが、これにはShowメソッドの戻り値を利用します。Showメソッドは選択ボタンが押されて閉じられた場合にTrueを返すので、これを利用してユーザーの操作を判定します。

'--- ファイルパスを格納する変数 ---'
Dim strFilePath As String

'--- 有効なボタンがクリックされた時の処理 ---'
If (fd.Show = True) Then
    strFilePath = fd.SelectedItems.Item(1)
Else
    strFilePath = ""
End If

サンプルコード

下記のサンプルコードでは、拡張子が「.xls」と「.xlsx」であるエクセルファイルを選択するためのダイアログを開き、ユーザーが選択したファイルのパスを取得しています。ファイルは複数を選択することも可能ですが、サンプルコードでは一番初めの一つのみフォルダパスを取得しています。

なお、繰り返しになりますが、コードを使用する際はカッコに囲まれた部分([***])を自分のプログラムに合わせて変更してください。

Public Sub FileSelectDialog()
    
    '--- ファイル選択ダイアログ ---'
    Dim fd As FileDialog
    Set fd = Application.FileDialog(msoFileDialogOpen)
    
    '--- 選択可能なファイルの種類 ---'
    Call fd.Filters.Clear
    Call fd.Filters.Add("Excelファイル", "*.xls; *.xlsx")
    
    '--- 初期表示フォルダ ---'
    fd.InitialFileName = "[フォルダパス]"
    
    '--- 表示アイコンの大きさ ---'
    fd.InitialView = msoFileDialogViewSmallIcons

    '--- ファイルパスを格納する変数 ---'
    Dim strFilePath As String
    
    '--- 有効なボタンがクリックされた時の処理 ---'
    If (fd.Show = True) Then
        strFilePath = fd.SelectedItems.Item(1)
    Else
        strFilePath = ""
    End If
    
End Sub