マクロで作成したファイルを特定のフォルダに保存したり、特定のフォルダ内にある複数のファイルを一括で処理したりする際に、その対象フォルダをユーザー自身に選んでもらいたい、という場面は非常に多くあります。
VBAには、このような「フォルダ選択」ダイアログボックスを表示するための方法が主に2つ用意されています。この記事では、それぞれの特徴と使い方を解説します。
目次
方法1:Application.FileDialog
を使う方法(推奨)
Application.FileDialog
オブジェクトは、Excelに標準で組み込まれている機能で、モダンなフォルダ選択ダイアログを表示できます。コードがシンプルで分かりやすく、現在ではこちらの方法が最も推奨されます。
完成したVBAコード
Sub SelectFolder_WithFileDialog()
' 変数を宣言します
Dim folderPath As String
' FileDialogオブジェクトを「フォルダ選択モード」で作成
With Application.FileDialog(msoFileDialogFolderPicker)
' ダイアログのタイトルを設定
.Title = "処理対象のフォルダを選択してください"
' ダイアログを表示し、「OK」が押されたかを判定
' .Showが-1を返す場合、OKが押されたことを意味します
If .Show = -1 Then
' 選択されたフォルダのパスを取得
folderPath = .SelectedItems(1)
MsgBox "以下のフォルダが選択されました。" & vbCrLf & folderPath
Else
' 「キャンセル」が押された場合
MsgBox "フォルダの選択がキャンセルされました。"
End If
End With
End Sub
コードのポイント解説
Application.FileDialog(msoFileDialogFolderPicker)
:FileDialog
オブジェクトを生成します。引数にmsoFileDialogFolderPicker
を指定することで、「フォルダ選択」モードになります。.Show = -1
:.Show
メソッドでダイアログが表示されます。ユーザーが「OK」ボタンを押すと-1
が、キャンセルすると0
が返ってくるため、If
文で分岐させます。.SelectedItems(1)
: ユーザーが選択したフォルダのフルパスが、このプロパティに格納されています。
方法2:Shell.Application
を使う方法(旧来の方法)
Windowsのシェル機能を呼び出す、より古くから使われている方法です。少し古い形式のダイアログが表示されます。
完成したVBAコード
Sub SelectFolder_WithShell()
' 変数を宣言します
Dim shellApp As Object
Dim selectedFolder As Object
Dim folderPath As String
' Shell.Applicationオブジェクトを生成
Set shellApp = CreateObject("Shell.Application")
' フォルダ選択ダイアログを表示
' 引数: (ウィンドウハンドル, タイトル, オプション)
Set selectedFolder = shellApp.BrowseForFolder(0, "処理対象のフォルダを選択してください", 0)
' フォルダが選択されたかを判定
If Not selectedFolder Is Nothing Then
' 選択されたフォルダのパスを取得
folderPath = selectedFolder.Self.Path
MsgBox "以下のフォルダが選択されました。" & vbCrLf & folderPath
Else
' 「キャンセル」が押された場合
MsgBox "フォルダの選択がキャンセルされました。"
End If
' オブジェクトを解放
Set selectedFolder = Nothing
Set shellApp = Nothing
End Sub
コードのポイント解説
CreateObject("Shell.Application")
: Windowsのシェル機能を操作するためのオブジェクトを生成します。.BrowseForFolder(...)
: フォルダ選択ダイアログを表示するメソッドです。If Not selectedFolder Is Nothing Then
: ユーザーが「キャンセル」ボタンを押した場合、戻り値は空のオブジェクトNothing
になります。これを利用して分岐を判定します。
まとめ
方法 | ダイアログの外観 | コードの簡潔さ | 推奨度 |
Application.FileDialog | モダンで使いやすい | 簡潔で直感的 | 高(強く推奨) |
Shell.Application | 古いツリー形式 | やや複雑 | 低(互換性維持などの特殊な場合) |
結論として、これから新しくコードを書くのであれば、シンプルで高機能なApplication.FileDialog
メソッドを利用するのが最適です。
ユーザーにフォルダを選択させる機能は、マクロの柔軟性と利便性を大きく向上させます。このテクニックをマスターして、より使いやすいVBAツールを作成しましょう。