Excel VBA – FileDialog(ファイルダイアログ)の使用方法とサンプルコード

Excel VBA

VBAから処理のためにユーザーに処理対象のブックを開かせたい、処理結果を保存したいのでファイル名を入力してほしい、そういうことが必要になる場面は必ずあります。

そんなときに使えるのがFileDialogです。

この記事では、FileDialogの使用方法を解説し、サンプルコードを掲載します。

FileDialogとは?

これは「ファイルを開く」のダイアログの例ですが、このようなダイアログを表示して、そしてそこで選ばれたファイルをVBAで開くことができます。

「ファイルを保存」「ファイルを選択」「フォルダを選択」のダイアログもあります。

いずれも、Windows標準のダイアログですので、ユーザーにとっては使い慣れたインターフェースで、利便性の高いものとなります。

VBAでファイルに関する操作をユーザーにしてもらうときにはFileDialogを使用します。

FileDialogの種類

コンストラクタに定数を指定することで、FileDialogの種類を決められます。

コンストラクタの書き方は例えばこうです。

Dim fd As FileDialog
Set fd = Application.FileDialog(msoFileDialogOpen)

FileDialogを格納する変数はDimで宣言します。Dimで宣言しているので、格納時にはSetを使用します。
Applicationから書き始めてください。FileDialogはこのように書かないと作成できません。

ダイアログの種類と定数は以下です。

msoFileDialogOpen:ユーザーがファイルを開く
msoFileDialogSaveAs:ユーザーがファイルを保存
msoFileDialogFilePicker:ユーザーがファイルを選択する
msoFileDialogFolderPicker:ユーザーがフォルダを選択する

複数選択するには?

複数選択するには、AllowMultiSelectプロパティをTrueにします。

ファイルの種類を限定する

ファイルの種類を限定したいときは、以下のように記述します。

With fd
    .Filters.Clear
    .Filters.Add "画像", "*.png; *.jpg"
End With

Filtersにセットするのですが、まずフィルタをクリアしないと、セットすることができません。なので、クリアしてからセットしましょう。
また書き方はこのように書きます。まずその種類の名前、それから拡張子をこのように書きます。*.や;を忘れずに書いてください。

初期ファイル

初期フォルダや初期ファイル名を指定したいときは、以下のように記述します。

With fd
    .InitialFileName = "D:\FileDialogサンプル.png"
End With

フルパスで書いてください。

FileDialogの例

それでは、FileDialogの例を挙げていきます。

ファイルを開く

Sub test1()

    Dim fd As FileDialog
    Set fd = Application.FileDialog(msoFileDialogOpen)

    With fd
        .Filters.Clear
        .Filters.Add "Excelファイル", "*.xlsx; *.xlsm; *.xls"
        .AllowMultiSelect = True
        
        If .Show = -1 Then
            For Each Item In .SelectedItems
                .Execute
            Next
        Else
        End If
    End With

    Set fd = Nothing
End Sub

まずフィルタと複数選択を設定しています。

Showで表示します。戻り値が-1なら「開く」ボタンが押されているので、選択されたファイル(SelectedItemsに入っています)に対してExecuteを実行すれば開けます。

ファイルを保存する

Sub test2()
    Dim fd As FileDialog
    Set fd = Application.FileDialog(msoFileDialogSaveAs)

    With fd
    
        If .Show = -1 Then
            For Each Item In .SelectedItems
                .Execute
            Next
        Else
        End If
    End With

    Set fd = Nothing
End Sub

保存も開く場合と記述の手順は同じです。自分を保存します。

パスを取得する

Sub test3()
    Dim fd As FileDialog
    Set fd = Application.FileDialog(msoFileDialogFilePicker)

    With fd
        .AllowMultiSelect = False
    
        If .Show = -1 Then
            For Each Item In .SelectedItems
                MsgBox (Item)
            Next
        Else
        End If
    End With

    Set fd = Nothing
End Sub

Itemにはフルパスが入っています。
msoFileDialogPickerをmsoFileDialogFolderPickerにすれば、ユーザーにフォルダを選択してそのフルパスを取得することができます。

まとめ

この記事では、FileDialogについて解説してきました。
このFileDialog、マイクロソフトのヘルプだと解説が分散していて少し分かりにくいです。そのために苦手な印象を持っている方もいらっしゃるようですが、実はそれほど難しいものではありません。

具体的には、ユーザーに処理対象のデータが入ったファイルを開いてもらったりするときに使えますので、使っていきましょう。