サイトアイコン 効率化大全

【コピペでOK】VBA FileDialogの決定版!ファイル・フォルダ選択から複数処理まで徹底解説!

VBAで使うファイルのパスを、毎回コードを開いて書き換えるのが面倒くさい…
自分以外の人が間違ったパスを手入力してエラーが起きるのを防ぎたい!

実務でVBAを活用していると、フォルダアドレスの問題に直面することがよくあります。自分だけで使うVBAであれば張り付けでもいいですが、ほかの人が使うVBAであれば、貼り付けの形式を伝えるだけで一苦労ですよね。

そんな時に活躍するのが「FileDialog(ファイルダイアログ)」です。これを使えば、Windowsでおなじみの「ファイルを開く」画面を呼び出せます。直感的にファイルやフォルダを選ばせることができるため、パスの入力ミスを劇的に減らすことが可能です。

FileDialogのイメージ画像

この記事では、コピペですぐに動くFileDialogコードをご紹介します。実務で役立つカスタマイズ方法まで網羅していますので、ぜひ活用してください。

【結論】コピペで使える「ファイル選択」「フォルダ選択」のコピペコード

まずは、標準モジュールに貼り付けるだけですぐに使えるコードを2つ紹介します。

A. ファイルを選択してパスを取得するコード(FilePicker)

1つのファイルを選択し、そのファイルのフルパス(保存場所とファイル名)を取得する基本コードです。

Sub SelectFile()
    Dim fd As FileDialog
    Dim filePath As String
    
    'ファイル選択ダイアログをセット
    Set fd = Application.FileDialog(msoFileDialogFilePicker)
    
    'ダイアログを表示
    If fd.Show = True Then
        '選択されたアイテム(1つ目)のパスを取得
        filePath = fd.SelectedItems(1)
        MsgBox "選択したファイル: " & filePath
    Else
        'キャンセルボタンが押された場合の処理
        MsgBox "キャンセルされました。"
    End If
    
    Set fd = Nothing
End Sub

このコードを実行すると、選択したファイル名がメッセージボックスで表示されます。

実際のVBAで使用する際は、「MsgBox “選択したファイル: ” & filePath」の部分を、アドレスを貼り付けたい場所や変数に変更してください。

このコードは途中に「キャンセル」ボタンが押された時のエラー回避処理(If fd.Show = True Then)を含めています。これにより、ユーザーが何も選ばずに画面を閉じた際のエラーを防ぐことが可能です。

Office付きで有料AIを月1800円以下で使う方法をコチラで紹介しています!

B. フォルダを選択してパスを取得するコード(FolderPicker)

次は「ファイル」ではなく、「フォルダ」そのものを選択するコードです。

Sub SelectFolder()
    Dim fd As FileDialog
    Dim folderPath As String
    
    'フォルダ選択ダイアログをセット
    Set fd = Application.FileDialog(msoFileDialogFolderPicker)
    
    'ダイアログを表示
    If fd.Show = True Then
        '選択されたフォルダのパスを取得
        folderPath = fd.SelectedItems(1)
        MsgBox "選択したフォルダ: " & folderPath
    Else
        MsgBox "キャンセルされました。"
    End If
    
    Set fd = Nothing
End Sub

こちらは、フォルダを取得するVBAとなっています。画面上「検索条件に一致する項目はありません」と表示されますが、「OK」を押せば今いるフォルダのアドレスを取得できます。

フォルダを選択したときの画面イメージ。中のファイルは表示されないがOKで今いるフォルダを取得できます。

よく似た機能に「GetOpenFilename」というメソッドがあります。しかし、あちらは「ファイル」しか選択できません。VBAで「フォルダ」を選ばせたい場合は、このFileDialogを使う必要があります。

ここからは、FileDialogの詳細について解説していきます。

Office付きで有料AIを月1800円以下で使う方法をコチラで紹介しています!

FileDialogとは?GetOpenFilenameより推奨される理由

FileDialogとは、ExcelやWordなどOffice共通の「ファイル操作ダイアログ」を呼び出すためのオブジェクトです。

ダイアログを呼び出す際、カッコ内に「定数」を指定することで、画面の役割を切り替えることができます。

定数名役割実務での使用頻度
msoFileDialogFilePickerファイルを選択する★最頻出
msoFileDialogFolderPickerフォルダを選択する★最頻出
msoFileDialogOpenファイルを開くあまり使わない
msoFileDialogSaveAs名前を付けて保存するあまり使わない

実務でVBAを組む場合、下2つはあまり使いません。基本的には「FilePicker」と「FolderPicker」の2つを覚えておけば十分です。

なぜGetOpenFilenameより推奨されるのか?

VBAの入門書などでは、ファイル選択にGetOpenFilenameが紹介されることが多いです。しかし、実務では圧倒的にFileDialogの方が重宝します。その理由は以下の2点です。

【カスタマイズ】FileDialogのプロパティ設定

そのまま使っても便利なFileDialogですが、少しプロパティを設定するだけで使いやすさ(UX)が劇的に向上します。

設定項目はたくさんありますが、全部覚える必要はありません。実務でよく使うものだけを厳選して紹介します。

プロパティ名設定内容の例効果
.Title“集計するデータを選んでください”ダイアログ左上の文字を変更。ユーザーへの指示出しに使える。
.InitialFileName“C:\Users\Desktop\”最初に開くフォルダ(初期位置)を指定する。
.FiltersExcelのみ、CSVのみ等選択できるファイルを制限し、誤操作を防ぐ。
.ButtonName“取り込み”、”実行”「開く」ボタンの文字を変更し、何が起きるか明確にする。
.AllowMultiSelectTrue複数のファイルを同時に選択できるようになる。

紹介したプロパティを使ったサンプルコード

今回紹介したプロパティをすべて使用した場合のサンプルコードを紹介します。

複数選択を許可しているので、ループ処理が発生しています。ここについては後で詳しく解説します。

Sub CustomizedFileDialog()
    Dim fd As FileDialog
    Dim varFile As Variant
    
    ' ファイル選択ダイアログをセット
    Set fd = Application.FileDialog(msoFileDialogFilePicker)
    
    ' Withを使ってFileDialogのプロパティを一括設定
    With fd
        ' ① ダイアログ左上の文字を変更(ユーザーへの指示)
        .Title = "集計するデータを選んでください"
        
        ' ② 最初に開くフォルダを指定
        .InitialFileName = "C:\Users\Desktop\"
        
        ' ③ 選択できるファイルを制限(誤操作防止)
        .Filters.Clear ' まずデフォルトの条件をクリアする
        .Filters.Add "Excelファイル", "*.xlsx; *.xlsm"
        
        ' ④ 「開く」ボタンの文字を変更(何が起きるか明確に)
        .ButtonName = "取り込み"
        
        ' ⑤ 複数ファイルの選択を許可する
        .AllowMultiSelect = True
        
        ' ダイアログを表示し、ユーザーの操作を待つ
        If .Show = True Then
            ' 選択されたすべてのファイルをループ処理
            For Each varFile In .SelectedItems
                ' ここに実際の処理(ファイルを開いてデータ転記など)を書きます
                ' 今回はテストとしてメッセージボックスでパスを表示
                MsgBox "選択されたファイル: " & varFile
            Next varFile
            MsgBox "処理が完了しました。"
        Else
            ' キャンセル時の処理
            MsgBox "キャンセルされました。"
        End If
    End With
    
    ' オブジェクトを解放
    Set fd = Nothing
End Sub

実際はすべてを使用することはないと思うので、必要な部分だけを残して使用してください。また、複数選択しない場合は、For Each…の部分を、初めのコピペコードに変更すると、コードが短くなります(そのままでも使えます)

実行後のサンプル

Office付きで有料AIを月1800円以下で使う方法をコチラで紹介しています!

最初の場所指定(InitialFileName)の末尾には「\」をつける

最初に開く場所を指定する.InitialFileNameですが、バージョンによっては「パスの最後に『\(円マーク)』が必要です。

これは、「Cドライブ」の中にある「Test」という名前のファイルを初期選択しようとすることが原因です。今回は、初めに開くフォルダを選択したいので末尾に「\」をつける必要があります。

最近のOfficeでは「\」をつけなくてもフォルダを開いてくれることもありますが、バージョンによっては開いてくれないこともあります。

「なぜか指定したフォルダが開かない!」と悩む原因の9割がこれです。初期フォルダを指定したい時は、必ず文字列の最後に「\」を付けるように意識してください。

【応用】複数ファイルを選択して一括処理するループ記述

先ほど紹介した、複数選択時のループ処理について解説します。

月次処理などで「各支店から送られてきた10個の見積書を、一気に選んでマスタデータに統合したい」といった需要は非常に高いです。

複数選択のイメージ画像

.AllowMultiSelect = Trueを設定し、配列として処理する応用コードを紹介します。

Sub SelectMultiFiles()
    Dim fd As FileDialog
    Dim varFile As Variant
    Dim msgText As String ' ★複数のパスをまとめるための変数を追加
    
    Set fd = Application.FileDialog(msoFileDialogFilePicker)
    
    With fd
        .Title = "統合する見積書をすべて選択してください"
        .AllowMultiSelect = True '複数選択を許可★
        .Filters.Clear
        .Filters.Add "Excelファイル", "*.xlsx; *.xlsm" '拡張子を制限
        
        If .Show = True Then
            '選択されたすべてのファイルをループ処理で1つの文字列にまとめる
            For Each varFile In .SelectedItems
                ' 改行コード(vbCrLf)を挟んでパスを繋げていく
                msgText = msgText & varFile & vbCrLf
            Next varFile
            
            ' ループが終わった後に、1つのメッセージボックスで一括表示
            MsgBox "以下のファイルが選択されました:" & vbCrLf & vbCrLf & msgText, vbInformation, "選択完了"
        Else
            MsgBox "キャンセルされました。"
        End If
    End With
    
    Set fd = Nothing
End Sub

複数選択を許可した場合、選ばれたファイル群は.SelectedItemsというコレクション(配列のようなもの)に格納されます。そのため、For Each構文を使って一つずつ取り出して処理を繰り返すのが基本の型になります。

今回は、ループ処理で一つずつアドレスを取り出して、一つのメッセージボックスで一括処理できるコードとしています。

Excelに出力する際は、「 ‘ ループが終わった後に、1つのメッセージボックスで一括表示」と書かれた下の部分を変更して使用してください

Office付きで有料AIを月1800円以下で使う方法をコチラで紹介しています!

5. 実装するときの注意点

FileDialogは便利ですが、実務で運用する上で意識しておきたいポイントが2つあります。

キャンセル時の処理を絶対に忘れない

標準の状態では、ダイアログが開いたあとに「キャンセル」や右上の「×」ボタンを押されると、戻り値が空になってしまい、その後のコードでエラーが発生します。

キャンセルのエラー処理をしなかった時のキャンセル画面。

紹介したコードのように、必ずIf .Show = True Thenで分岐を作り、選ばれなかった場合はExit Subなどで処理を安全に終了させる決め事を作っておきましょう。

効率化の観点では「極力使わない」という選択肢も

ここまでダイアログの使い方を解説しましたが、VBAによる業務自動化を突き詰めるのであれば、極力ダイアログを使用しないのがベストです。なぜなら、毎回人間が目で見てファイルを選択する作業は、結局のところ「半自動化」であり、面倒くささが残るからです。

「Cドライブの特定のフォルダに入っているExcelファイルは、無条件で全て読み込む」といったルールを事前に決めておけば、ボタンを1回クリックするだけの「完全自動化」が実現します。他人が使うツールであれば親切なFileDialogは必須ですが、自分専用のツールであれば、あえてダイアログを出さずにパスを固定化してしまった方が、圧倒的な効率化に繋がります。

6. まとめ:FileDialogで汎用性の高いVBAに!

FileDialogは、「フォルダの選択ができる」「ユーザーへの親切なUI設計ができる」という点で、VBAを組む上で必須のスキルと言えます。まずは冒頭のコピペコードから使い始め、慣れてきたらプロパティをカスタマイズして、自分の職場環境に合ったツールへと進化させてみてください。

誰が使うツールなのか、どうすれば一番ミスなく業務が回るのかを考えることが、社会的なスキルアップに繋がります。ぜひ今日のコードを業務に取り入れてみてください!

このブログでは、このように日常業務が楽になるテクニックから、VBA等のスキルになる情報まで幅広く紹介しています。また現在、Office+生成AI2年間月1800円以下で使える、お得なキャンペーンをMicrosoftが実施しています。裏技的なやり方ですが大変お得なキャンペーンなので、興味がある方はぜひこの記事も参考にしてみてください!

MicrosoftのOffice+生成AIが月1800円以下で使えるお得な裏技はコチラ

モバイルバージョンを終了