〖ExcelVBA〗フォルダ選択ダイアログの出し方|保存先・読込先をユーザーに選ばせる基本コード

ExcelVBA

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)
  • 実務では末尾 \ を付けると便利

ぜひ、ファイル一括処理やバックアップ機能などに組み込んでみてください。

スポンサーリンク
スポンサーリンク
ExcelVBA
いがぴをフォローする

コメント

タイトルとURLをコピーしました