ダイアログボックスを開いてユーザーにファイルを選択してもらう方法を解説します。
GetOpenFilenameメソッドを使用する方法と、
FileDialogオブジェクトを使用する方法の2種類があります。
GetOpenFilenameメソッド
基本コード
' ユーザーにファイルを指定してもらう(返り値はファイルパス) Dim ユーザー指定ファイルパス As String ユーザー指定ファイルパス = Application.GetOpenFilename ' 指定されたファイルを開く Workbooks.Open ユーザー指定ファイルパス
' Excelファイルだけを対象とし、ダイアログのタイトルを変更する場合 ユーザー指定ファイルパス = Application.GetOpenFilename( _ FileFilter:="Excelファイル,*.xls*", _ Title:="処理ブックを選択してください。")
引数の種類
Application.GetOpenFilename(FileFilter, FilterIndex, Title, ButtonText, MultiSelect)
| 引数 | 内容 |
|---|---|
| FileFilter | ファイルの種類を指定する文字列("Excelファイル,*.xls*"など) |
| FilterIndex | 複数のファイル種類を指定した場合に何番目を規定とするか |
| Title | ダイアログボックスのタイトルを指定します。 この引数を省略すると「ファイルを開く」になります。 |
| ButtonText | MacPC限定の設定です。 |
| MultiSelect | Trueを指定すると複数のファイルを選択できます。 この場合は結果は配列として返されます。 |
解説
ダイアログボックスを表示してユーザーにファイルを選択してもらうには、
GetOpenFilenameメソッドを使用するのが一番簡単です。
サンプルの通り1行コードで実行することができ、
特に指定がない場合は引数も0個で動かすことができます。
結果値はファイルパスの文字列(String)が返ります。
ただし「キャンセル」時は""ではなくFalseが返る点に注意してください。
※ この仕様のためメソッドの返り値はStringではなくVariantになっています。
また「Open」と銘打っていますが、実際にはファイルは開かれません。
ファイルへの処理はそのあとにWorkbooks.Openなどを書く必要があり、
逆に言えば必ずしもファイルを開く必要はありません。
「Open」というメソッド名が反映されているのはタイトルだけで、

このようにダイアログタイトルが「ファイルを開く」になるだけです。
ファイルを開かない用途で使用する際は、
Titleを指定してダイアログの用途を表示しておきましょう。
なおGetOpenFilenameメソッドは複数のファイルを選択させることもでき
この場合は配列が返り値として返ります。
詳細はこちらの記事をご覧ください。
[準備中]
初期フォルダの指定
GetOpenFilenameメソッドは初期表示フォルダを指定する機能がなく、
カレントディレクトリ(現在使用中のフォルダ)が開かれます。
カレントディレクトリは下記コードで変更ができるため、
この方法で疑似的に初期表示フォルダを変更することは可能です。
' カレントディレクトリを変更 ChDir 初期表示フォルダのパス そのあとでGetOpenFilenameメソッドを実行 ユーザー指定ファイルパス = Application.GetOpenFilename
ただしカレントディレクトリを変更すると、
ユーザー操作や他プロセスへの影響が発生してしまいます。
これを回避したい場合は、初期表示フォルダの指定引数を持つ、
後述のFileDialogオブジェクトを使用してください。
FileDialogオブジェクト
ファイルをダイアログボックスから選択する方法には、
FileDialogオブジェクトを使用する方法もあります。
こちらの方が高機能ですが、コードが多少複雑です。
基本コード
Dim FileDialogオブジェクト As FileDialog Set FileDialogオブジェクト = Application.FileDialog(msoFileDialogFilePicker) ' 初期表示フォルダ FileDialogオブジェクト.InitialFileName = ThisWorkbook.Path ' ファイルの種類 FileDialogオブジェクト.Filters.Add "Excelファイル", "*.xlsx" FileDialogオブジェクト.Filters.Add "Excelファイル", "*.xls" FileDialogオブジェクト.Filters.Add "Excelファイル", "*.xlsm" ' ダイアログのタイトル FileDialogオブジェクト.Title = "処理するファイルを選択してください。" ' 単独のファイル指定しかできないように制御 FileDialogオブジェクト.AllowMultiSelect = False ' ダイアログを表示して選択されたファイルパスを取得 Dim ユーザー指定ファイルパス As String If FileDialogオブジェクト.Show = True Then ユーザー指定ファイルパス = FileDialogオブジェクト.SelectedItems(1) End If
ダイアログを表示・実行するプロパティ
| メソッド | 内容 |
|---|---|
| Show | ダイアログボックスを表示してユーザーから選択ファイルを受け取ります。受け取ったファイルはSelectedItemsに格納されます。このメソッド自体はファイル選択が実行された/キャンセルされたかどうかをTrue/Falseで返します。 |
| Execute | ダイアログごとのファイルへの処理が実行されます。msoFileDialogFilePickerでファイルを選択するダイアログを指定している場合は「ファイルを開く」が実行されます。 |
ダイアログの表示設定を行うプロパティ
| プロパティ | 内容 |
|---|---|
| Title | FileDialog オブジェクトを使用して表示されるファイルのダイアログ ボックスのタイトルを取得または設定します。 |
| ButtonName | ダイアログボックスの実行ボタンのテキストを設定できます。 |
| InitialView | フォルダの表示状態(詳細やプレビュー、大アイコンなど)を指定できます。 |
| InitialFileName | 初期表示するフォルダパス・ファイル名を指定します。 |
| Filters | 表示するファイルの種類をAddメソッドで追加できます。 |
| FilterIndex | 表示するファイルの種類が複数ある場合に何番目を規定とするか指定します。 |
| AllowMultiSelect | Tureを指定すると複数ファイルを選択できるようになります。 規定値はTrueです。 |
値・状態を取得するプロパティ
ユーザーが選択したパスを取得するために使用するSelectedItemsが重要ですが、
それ以外はほぼ使用しないと思います。
| プロパティ | 内容 |
|---|---|
| SelectedItems | FileDialogSelectedItems コレクションを取得します。 |
| Application | 指定したFileDialogオブジェクトのコンテナーアプリケーションを表すApplication オブジェクトを取得します。 |
| Creator | FileDialogオブジェクトが作成されたアプリケーションを示す32 ビットの整数を取得します。 |
| DialogType | ダイアログボックスの種類を表すMsoFileDialogTypeの定数を取得します。 |
| Item | 指定したオブジェクトに関連付けられたテキストを取得します。 |
| Parent | FileDialogオブジェクトの親オブジェクトを取得します。 |
解説
ファイルをダイアログボックスから選択する方法には、
FileDialogオブジェクトを使用する方法もあります。
上記の通りかなり高機能なオブジェクトで、
様々な設定のもとでダイアログを表示することが可能です。
FileDialogはメソッドではなく「オブジェクト」ですので、
基本コードの通り引数ではなくプロパティへの代入で設定を変更します。
' GetOpenFilenameメソッドでタイトルを指定する場合 選択パス = Application.GetOpenFilename(Title:="処理するファイルを選択してください。) ' FileDialogオブジェクトでタイトルを指定する場合 FileDialogオブジェクト.Title = "処理するファイルを選択してください。"
各種設定が終わったのち、ダイアログを表示する場合はShowメソッドを実行します。
受け取ったファイルはSelectedItemsに格納されますので、
実際のファイルパスはこちらを読み取って取得します。
Showメソッド自体が選択/キャンセルをTrue/Falseで返すため、
以下のようなコードで選択ファイルパスを取得することになります。
Dim ユーザー指定ファイルパス As String If FileDialogオブジェクト.Show = True Then ユーザー指定ファイルパス = FileDialogオブジェクト.SelectedItems(1) End If
このオブジェクト操作は一連の流れで実行されることが多いため、
オブジェクト変数ではなくWithステートメントを使うのも便利です。
With Application.FileDialog(msoFileDialogFilePicker) ' 初期表示フォルダ .InitialFileName = ThisWorkbook.Path ' ファイルの種類 .Filters.Clear .Filters.Add "Excelファイル", "*.xlsx" .Filters.Add "Excelファイル", "*.xls" .Filters.Add "Excelファイル", "*.xlsm" ' ダイアログのタイトル .Title = "処理するファイルを選択してください。" ' 単独のファイル指定しかできないように制御 .AllowMultiSelect = False ' ダイアログを表示して選択されたファイルパスを取得 Dim ユーザー指定ファイルパス As String If .Show = True Then ユーザー指定ファイルパス = .SelectedItems(1) End If End With
こちらの書き方も覚えておいてください。