FileDialogを使用してGetOpenFilenameではできない、フォルダのみ選択できる[参照]ダイアログボックスを表示して選択されたフォルダのパスを取得するサンプルプログラムを覚え書き。
[参照]ダイアログボックスの初期フォルダを指定した上で表示する方法についても紹介しています。
ExcelのVBAでGetOpenFilenameを使用して[ファイルを開く]ダイアログボックスを表示して選択されたファイル名を取得することはできるけど、例えばファイルまでの選択は必要なくてフォルダのみ選択させたい場合には、GetOpenFilenameではできない。
使われるダイアログボックス自体が別物になるので当たり前ではあるんだけれど。
FileDialogオブジェクトを使用した[参照]ダイアログボックスを表示するサンプルプログラムの動作前提条件
後述するExcelのVBAのサンプルプログラムの動作確認は、Excel 2013で行っています。
また、FileDialogオブジェクトを使用する際には必ず[参照設定]で以下のオブジェクトライブラリの参照を有効にしておく必要があります。
参照を有効化するオブジェクトライブラリ
Microsoft Office 15.0 Object Library
※15.0というバージョンは、Excelのバージョンによって異なります。
オブジェクトライブラリの参照手順
以下に「Microsoft Office 15.0 Object Library」の参照手順を記載します。
- Excelのリボンツールバーの[開発]タブをクリックする。
- [開発]タブの左端にある[Visual Basic]をクリックする。
- [Microsoft Visual Basic for Applications]画面(VBAエディタ)が開くので[ツール]メニューの[参照設定]をクリックする。
- [参照可能なライブラリ ファイル]の一覧(五十音順に並んでいます)から「Microsoft Office 15.0 Object Library」のチェックをオンにして[OK]をクリックする。
[参照]ダイアログボックスの表示
[参照]ダイアログボックスは、以下のようにフォルダのみユーザーが選択できるダイアログボックスです。
[参照]ダイアログボックスをExcelのVBAで表示するには、FileDialogプロパティを使用します。
FileDialogプロパティは、指定するオプション次第で[ファイルを開く]ダイアログボックスや[名前をつけて保存]ダイアログボックスとして表示することもできます。
FileDialogプロパティを使用して[参照]ダイアログボックスを表示するサンプルプログラム
まずは簡単な[参照]ダイアログボックスの表示サンプルプログラムを以下に紹介します。
[参照]ダイアログボックスを表示し、選択されたフォルダをメッセージボックスで表示するサンプルプログラムです。
Sub FolderPicker_Sample01()
Dim dlg As Object, blAns As Boolean
Set dlg = Application.FileDialog(msoFileDialogFolderPicker)
blAns = dlg.Show
MsgBox "選択されたフォルダは、「" & dlg.SelectedItems(1) & "」です。"
End Sub
[キャンセル]ボタンが押された時の処理を追加したサンプルプログラム
上記のサンプルプログラムだと[参照]ダイアログボックスで[キャンセル]ボタンが押された場合、エラーとなってしまうので、[キャンセル]ボタンが押された時の処理を追加します。
Sub FolderPicker_Sample02()
Dim dlg As Object, blAns As Boolean
Set dlg = Application.FileDialog(msoFileDialogFolderPicker)
blAns = dlg.Show
If blAns Then
MsgBox "選択されたフォルダは、「" & dlg.SelectedItems(1) & "」です。"
Else
MsgBox "フォルダ選択がキャンセルされました。"
End If
End Sub
FileDialogプロパティを使用して[参照]ダイアログボックスを表示する際の初期フォルダを指定して表示するサンプルプログラム
[参照]ダイアログボックスを開く際にあらかじめ指定したフォルダを初期フォルダとして選択された状態で表示するサンプルプログラムです。
初期フォルダの指定は、"InitialFileName"に初期フォルダとして選択させたいフォルダのパスを指定します。
初期フォルダを指定して[参照]ダイアログボックスを開くサンプルプログラム
Sub FolderPicker_Sample03()
Dim dlg As Object, blAns As Boolean
Set dlg = Application.FileDialog(msoFileDialogFolderPicker)
'初期フォルダの指定
dlg.InitialFileName = "C:¥windows¥"
blAns = dlg.Show
If blAns Then
MsgBox "選択されたフォルダは、「" & dlg.SelectedItems(1) & "」です。"
Else
MsgBox "フォルダ選択がキャンセルされました。"
End If
End Sub
FileDialogプロパティを使用して[お気に入り]フォルダなど特殊なフォルダを初期フォルダとして選択させた状態で表示するサンプルプログラム
[参照]ダイアログボックスの初期フォルダとして[お気に入り]フォルダや[デスクトップ]フォルダを初期フォルダとして指定したい場合のサンプルプログラムです。
[お気に入り]フォルダや[デスクトップ]フォルダは、ログインするユーザーごとにパスが変わるため、プログラム内でパスを固定で指定することができません。
これらの特殊なフォルダのパスを初期フォルダとして指定したい場合は、"Windows Script Host"オブジェクトを使用してパスを取得します。
Sub FolderPicker_Sample04()
Dim dlg As Object, blAns As Boolean
Dim wScriptHost As Object, strInitFolder As String
'"Windows Script Host"オブジェクトを使用する
Set wScriptHost = CreateObject("WScript.Shell")
'[お気に入り]フォルダのパスを取得する
strInitFolder = wScriptHost.SpecialFolders("Favorites")
Set dlg = Application.FileDialog(msoFileDialogFolderPicker)
'取得した[お気に入り]フォルダのパスを初期フォルダに指定
dlg.InitialFileName = strInitFolder
blAns = dlg.Show
If blAns Then
MsgBox "選択されたフォルダは、「" & dlg.SelectedItems(1) & "」です。"
Else
MsgBox "フォルダ選択がキャンセルされました。"
End If
End Sub
指定できる特殊フォルダ一覧
上記の方法で指定できる特殊フォルダは以下のとおりです。
"SpecialFolders"の引数に下記の"対応するフォルダ"の"指定する文字列"の値を"(ダブルクォーテーション)でくくって指定すればよいです。
指定する文字列 | 対応するフォルダ |
---|---|
Desktop | デスクトップフォルダ |
Favorites | お気に入りフォルダ |
Fonts | フォントフォルダ |
MyDocuments | マイドキュメントフォルダ |
Programs | プログラムフォルダ |
Recent | 最近開いたファイルフォルダ |
SendTo | 送るフォルダ |
StartMenu | スタートアップメニューフォルダ |
StartUp | スタートアップフォルダ |
FileDialogプロパティを使用して[Windows]フォルダなどのシステムフォルダを初期フォルダとして選択させた状態で表示するサンプルプログラム
[Windows]フォルダ、[System32]フォルダ、[Temp]フォルダを初期フォルダとして指定したい場合は、"FileSystemObject"オブジェクトを使用して各フォルダのパスを取得します。
[Windows]フォルダはインストール時にユーザーが任意に指定できるので、必ずしも"C:\Windows"とは限りませんし、[Temp]フォルダもログインユーザーごとに異なるパスとなるため、プログラム内で固定して指定することができません。
システムフォルダを初期フォルダとして指定するサンプルプログラム
Sub FolderPicker_Sample05()
Dim dlg As Object, blAns As Boolean
Dim FSO As Object, strInitFolder As String
'"FileSystemObject"オブジェクトを使用する
Set FSO = CreateObject("Scripting.FileSystemObject")
'[Windows]フォルダのパスを取得する
strInitFolder = FSO.GetSpecialFolder(0)
Set dlg = Application.FileDialog(msoFileDialogFolderPicker)
'取得した[Windows]フォルダのパスを初期フォルダに指定
dlg.InitialFileName = strInitFolder
blAns = dlg.Show
If blAns Then
MsgBox "選択されたフォルダは、「" & dlg.SelectedItems(1) & "」です。"
Else
MsgBox "フォルダ選択がキャンセルされました。"
End If
End Sub
各システムフォルダと対応する値
プログラム中の"GetSpecialFolder"に指定する数値によって、[Windows]フォルダ、[System32]フォルダ、[Temp]フォルダのどのフォルダが指定されているのかが決まっているので、指定したいフォルダを表す数値を"GetSpecialFolder"の引数に指定してください。
指定する値 | フォルダ |
---|---|
0 | [Windows]フォルダ |
1 | [System32]フォルダ |
2 | [Temp]フォルダ |
FileDialogプロパティを使用して[参照]ダイアログボックスを表示するサンプルプログラムのまとめ
FileDialogプロパティを使用してフォルダのみ選択できるダイアログボックスを表示するサンプルプログラムを紹介しました。
FileDialogプロパティに指定するオプション次第では[ファイルを開く]や[名前をつけて保存]ダイアログボックスとして使用することもできます。
FileDialogプロパティに関する詳細は、Microsoftの「Office デベロッパーセンター」の「Application.FileDialog プロパティ (Excel)」にも記載されているので参考にしてください。
また[お気に入り]フォルダや[Windows]フォルダなどの特殊なフォルダのパスを取得する方法については、以下の記事にも記載されているので参考にしてください。
ExcelのVBAで[ファイルを開く]ダイアログボックスや[名前をつけて保存]ダイアログボックスを使用するサンプルについては、以下の記事がありますので参考にしてください。
FileDialogプロパティについては、AccessのVBAの過去の記事で結構あるので、参考にしてください。
FileDialogプロパティは、ExcelだけでなくAccessなど他のOfficeアプリケーションのVBAで共通して使えます。
FileDialogプロパティに関する記事は、過去何件か書いているので参考にしてください。
コメント