VBAで使うファイルのパスを、毎回コードを開いて書き換えるのが面倒くさい…
自分以外の人が間違ったパスを手入力してエラーが起きるのを防ぎたい!
実務でVBAを活用していると、フォルダアドレスの問題に直面することがよくあります。自分だけで使うVBAであれば張り付けでもいいですが、ほかの人が使うVBAであれば、貼り付けの形式を伝えるだけで一苦労ですよね。
そんな時に活躍するのが「FileDialog(ファイルダイアログ)」です。これを使えば、Windowsでおなじみの「ファイルを開く」画面を呼び出せます。直感的にファイルやフォルダを選ばせることができるため、パスの入力ミスを劇的に減らすことが可能です。
この記事では、コピペですぐに動く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」を押せば今いるフォルダのアドレスを取得できます。
よく似た機能に「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点です。
- フォルダ選択が可能である(最大のメリット)
前述の通り、GetOpenFilenameではフォルダのみを選択することが不可能です。 - 細かい設定(カスタマイズ)ができる
オブジェクトとして扱うため、「ダイアログのタイトル文字」や「ボタンの名前」などを自由に変更できます。これにより、ツールを使うユーザーにとって非常に親切な設計が可能になります。
【カスタマイズ】FileDialogのプロパティ設定
そのまま使っても便利なFileDialogですが、少しプロパティを設定するだけで使いやすさ(UX)が劇的に向上します。
設定項目はたくさんありますが、全部覚える必要はありません。実務でよく使うものだけを厳選して紹介します。
| プロパティ名 | 設定内容の例 | 効果 |
|---|---|---|
.Title | “集計するデータを選んでください” | ダイアログ左上の文字を変更。ユーザーへの指示出しに使える。 |
.InitialFileName | “C:\Users\Desktop\” | 最初に開くフォルダ(初期位置)を指定する。 |
.Filters | Excelのみ、CSVのみ等 | 選択できるファイルを制限し、誤操作を防ぐ。 |
.ButtonName | “取り込み”、”実行” | 「開く」ボタンの文字を変更し、何が起きるか明確にする。 |
.AllowMultiSelect | True | 複数のファイルを同時に選択できるようになる。 |
紹介したプロパティを使ったサンプルコード
今回紹介したプロパティをすべて使用した場合のサンプルコードを紹介します。
複数選択を許可しているので、ループ処理が発生しています。ここについては後で詳しく解説します。
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\(最後に \ がある場合)
→ 「Test」というフォルダの中身を初期表示C:\Test(最後に \ がない場合)
→ PCの初期設定のフォルダを表示することがある。
これは、「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+生成AIを2年間月1800円以下で使える、お得なキャンペーンをMicrosoftが実施しています。裏技的なやり方ですが大変お得なキャンペーンなので、興味がある方はぜひこの記事も参考にしてみてください!
MicrosoftのOffice+生成AIが月1800円以下で使えるお得な裏技はコチラ!

