概要
SelectFileは、Excel VBAでファイル選択ダイアログを表示し、ユーザーが選んだファイルのフルパスを文字列で返す汎用関数です。
最初に開くフォルダ、ダイアログのタイトル、選択対象にしたい拡張子を引数で渡せます。ファイルが選択された場合はフルパスを返し、キャンセルされた場合は空文字を返します。
使う場面
- Excelブック、CSV、テキストファイルなどをユーザーに選ばせたい
- ファイル選択ダイアログの初期フォルダやタイトルを処理ごとに変えたい
Application.FileDialogの設定を毎回書かず、1行の呼び出しにまとめたい- 複数の拡張子を対象にしたファイル選択処理を共通化したい
処理イメージ図
SelectFileの処理は、次の流れです。
- 引数で受け取った拡張子から、
*.xlsx;*.xlsmのようなフィルター文字列を作る - ファイル選択ダイアログを作成し、タイトル、初期フォルダ、フィルターを設定する
- ユーザーがファイルを選んだら、そのフルパスを返す
- キャンセルされたら、空文字を返す
使用例
下の例では、ユーザーのドキュメントフォルダを最初に開き、Excelブックだけを選択対象にします。
コードを読み込み中...戻り値が空文字の場合は、ユーザーがキャンセルしたと判断して処理を中断できます。
コピー可能な実装コード
コードを読み込み中...初心者向けコード解説
FolderPath As Stringは、ダイアログで最初に開くフォルダです。Caption As Stringは、ダイアログ上部に表示するタイトルです。
ParamArray Extensions() As Variantは、拡張子を可変個数で受け取るためのParamArrayです。"xlsx", "xlsm"のように複数指定できます。
For Each Extension In Extensionsでは、渡された拡張子を順番に取り出し、*.xlsx;*.xlsmのようなフィルター文字列を組み立てています。空文字が渡された場合は、拡張子フィルターを作らず、すべてのファイルを対象にする設計です。
Application.FileDialog(msoFileDialogFilePicker)が、ファイル選択ダイアログを作っている行です。ここで作成したダイアログに対して、.Filters.Clear、.Filters.Add、.Title、.InitialFileNameを設定しています。
.InitialFileName = FolderPath & Application.PathSeparatorでは、最初に表示するフォルダを指定しています。Application.PathSeparatorを使うことで、パス区切り文字をExcel側の環境に合わせて付けられます。
.Show = Trueならファイルが選択された状態です。この場合は.SelectedItems(1)で選択されたファイルのフルパスを取り出します。キャンセルされた場合はOutput = ""として、空文字を返します。
最後のSelectFile = Outputで、呼び出し元にファイルパスを返しています。戻り値で結果を受け取れるため、呼び出し側ではIf FilePath = "" Then Exit Subのように分岐できます。
注意点
- 拡張子はドットなしで
"xlsx"のように渡します。".xlsx"ではなく"xlsx"です。 - 複数ファイル選択には対応していません。戻るのは最初に選ばれた1ファイルのフルパスです。
FolderPathが存在しない場合、環境によっては意図したフォルダが開かないことがあります。- 空文字を拡張子として渡すと、フィルターを設定せず、すべてのファイルを対象にします。
- 元コード内の古い公式ブログURLは、実装の出典メモとして残しています。記事本文はこのTech Blog内で使い方が分かるように整理しています。
まとめ
SelectFileを使うと、VBAでファイル選択ダイアログを表示し、選択されたフルパスを受け取る処理を共通化できます。
ExcelブックやCSVを読み込むマクロの入口として、毎回同じFileDialog設定を書かずに使える汎用プロシージャです。
