マクロで作成したファイルを特定のフォルダに保存したり、特定のフォルダ内にある複数のファイルを一括で処理したりする際に、その対象フォルダをユーザー自身に選んでもらいたい、という場面は非常に多くあります。
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ツールを作成しましょう。
