VBAでよくある要望がこれです。
- CSVを読み込むフォルダをユーザーに選ばせたい
- バックアップ保存先フォルダを選びたい
- 指定フォルダ内のファイルを一括処理したい
こういうとき、パスをコードに直書きすると、別PCや別環境で動かしにくくなります。
そこで便利なのが、フォルダ選択ダイアログです。
この記事では、初心者でもそのまま使えるフォルダ選択ダイアログの基本コードを紹介します。
結論:フォルダ選択は FileDialog を使う
VBAでは、FileDialog(ファイル選択の画面)をフォルダ選択モードで使うのが定番です。
- フォルダ選択:msoFileDialogFolderPicker
- ファイル選択:msoFileDialogFilePicker
基本:フォルダ選択ダイアログを表示してパスを取得する
まずは一番よく使う基本形です。
「選んだフォルダのパス」を文字として取得できます。
Option Explicit
Sub SelectFolder_Basic()
Dim fd As FileDialog
Dim folderPath As String
Set fd = Application.FileDialog(msoFileDialogFolderPicker)
With fd
.Title = "フォルダを選択してください"
.AllowMultiSelect = False
' 何も選ばずキャンセルした場合は 0
If .Show = 0 Then
MsgBox "キャンセルされました。", vbInformation
Exit Sub
End If
' 選択されたフォルダパス(1件)
folderPath = .SelectedItems(1)
End With
MsgBox "選択されたフォルダ:" & vbCrLf & folderPath, vbInformation
End Sub
初心者向け解説(ここだけ押さえればOK)
① .Show の戻り値で「キャンセル判定」
If .Show = 0 Then
ユーザーがキャンセルした場合、.Show は 0 を返します。
ここで終了しておけば、後の処理でエラーになりません。
② 選んだフォルダは SelectedItems(1) で取れる
folderPath = .SelectedItems(1)
フォルダ選択は通常1件なので、(1) を使います。
便利:初期フォルダ(最初に開く場所)を指定する
毎回同じ場所を開くなら、初期フォルダを指定すると親切です。
Option Explicit
Sub SelectFolder_WithInitial()
Dim fd As FileDialog
Dim folderPath As String
Set fd = Application.FileDialog(msoFileDialogFolderPicker)
With fd
.Title = "フォルダを選択してください"
.AllowMultiSelect = False
' 初期フォルダ(例:このブックがある場所)
If Len(ThisWorkbook.Path) > 0 Then
.InitialFileName = ThisWorkbook.Path & "\"
End If
If .Show = 0 Then
MsgBox "キャンセルされました。", vbInformation
Exit Sub
End If
folderPath = .SelectedItems(1)
End With
MsgBox "選択されたフォルダ:" & vbCrLf & folderPath, vbInformation
End Sub
ポイントは .InitialFileName に「フォルダパス+\」を入れることです。
実務でよく使う形:末尾に「\」を付けて使いやすくする
フォルダパスは、後でファイル名をくっつけることが多いです。
その場合、末尾に \ があると扱いやすいです。
Option Explicit
Sub SelectFolder_ReturnWithSlash()
Dim fd As FileDialog
Dim folderPath As String
Set fd = Application.FileDialog(msoFileDialogFolderPicker)
With fd
.Title = "フォルダを選択してください"
.AllowMultiSelect = False
If .Show = 0 Then Exit Sub
folderPath = .SelectedItems(1)
' 末尾に \ がなければ付ける
If Right(folderPath, 1) <> "\" Then
folderPath = folderPath & "\"
End If
End With
MsgBox folderPath, vbInformation
End Sub
応用:選択したフォルダ内のExcelファイルを一覧表示する
フォルダ選択と組み合わせて、「中身を処理する」マクロが作れます。
ここでは例として、フォルダ内の Excel ファイル名をシートに一覧化します。
Option Explicit
Sub ListExcelFilesInSelectedFolder()
Dim fd As FileDialog
Dim folderPath As String
Dim fileName As String
Dim ws As Worksheet
Dim r As Long
Set fd = Application.FileDialog(msoFileDialogFolderPicker)
With fd
.Title = "Excelファイルが入っているフォルダを選択してください"
.AllowMultiSelect = False
If .Show = 0 Then
MsgBox "キャンセルされました。", vbInformation
Exit Sub
End If
folderPath = .SelectedItems(1)
If Right(folderPath, 1) <> "\" Then folderPath = folderPath & "\"
End With
Set ws = ActiveSheet
ws.Cells.Clear
ws.Range("A1").Value = "ファイル名"
ws.Range("B1").Value = "フルパス"
ws.Rows(1).Font.Bold = True
r = 2
fileName = Dir(folderPath & "*.xls*")
Do While fileName <> ""
ws.Cells(r, 1).Value = fileName
ws.Cells(r, 2).Value = folderPath & fileName
r = r + 1
fileName = Dir()
Loop
ws.Columns.AutoFit
MsgBox "一覧を作成しました。", vbInformation
End Sub
よくある質問
Q. Macでも同じように動きますか?
FileDialogは環境によって挙動が異なる場合があります。
WindowsのExcelでは安定して使われる方法です。
Q. 複数フォルダを選べますか?
フォルダ選択は通常1件運用が多いです。.AllowMultiSelect = True にできますが、UIや扱いが複雑になるため、初心者向けには単一選択がおすすめです。
まとめ:フォルダパスの直書きは卒業しよう
フォルダ選択ダイアログを使えば、ユーザーが自分でフォルダを選べるので、
別PC・別環境でもマクロが使いやすくなります。
- 基本は FileDialog(msoFileDialogFolderPicker)
- キャンセル判定は .Show = 0
- 選択結果は .SelectedItems(1)
- 実務では末尾 \ を付けると便利
ぜひ、ファイル一括処理やバックアップ機能などに組み込んでみてください。


コメント