ファイルやフォルダを選ばせる(GetOpenFilename と FileDialog、キャンセル時の処理)

公開日:2026年10月7日 執筆:Takuya カテゴリ:ファイル・CSV

マクロの実行時に、取り込むファイルや処理対象のフォルダを利用者に選ばせる方法です。Application.GetOpenFilename と FileDialog の違い、複数選択、キャンセルされたときに止めずに終わる書き方を解説します。

どんな場面で使うか

CSV を取り込むマクロで、ファイルのパスをコードに直接書いていると、ファイル名に日付が入っていたり、保存場所が人によって違ったりするたびにコードを直す必要があります。ほかの人に使ってもらうマクロでは、実行時に「どのファイルを使うか」を画面で選んでもらう方が、使う側にとっても分かりやすくなります。

VBA でファイルを選ばせる方法は主に2つあります。手軽な Application.GetOpenFilename と、フォルダの選択もできる Application.FileDialog です。どちらもファイルを開くわけではなく、選ばれたパスを返すだけなので、その後の処理はコードで行います。

GetOpenFilename でファイルを選ばせる

GetOpenFilename は、ファイルを開くダイアログを表示し、選ばれたファイルのフルパスを返します。キャンセルされたときは文字列ではなく False を返すため、戻り値は String ではなく Variant で受け取る必要があります。String で受け取ると、キャンセル時に「False」という文字列になり、そのファイルを開こうとしてエラーになります。

Sub SelectCsvFile()
    Dim filePath As Variant

    filePath = Application.GetOpenFilename( _
        FileFilter:="CSVファイル (*.csv),*.csv,すべてのファイル (*.*),*.*", _
        Title:="取り込む CSV ファイルを選んでください")

    If VarType(filePath) = vbBoolean Then          ' キャンセルされたとき
        MsgBox "処理を中止しました"
        Exit Sub
    End If

    MsgBox "選ばれたファイル:" & filePath
    ' ここで filePath を使って取り込み処理を行う
End Sub

複数のファイルを選ばせる

MultiSelect:=True を指定すると、Ctrl キーや Shift キーで複数のファイルを選べるようになり、戻り値はパスの配列になります。この配列は 1 から始まるため、LBound と UBound でループします。キャンセル時は False が返る点は同じです。

Dim files As Variant, i As Long
files = Application.GetOpenFilename("Excelブック (*.xlsx),*.xlsx", MultiSelect:=True)
If Not IsArray(files) Then Exit Sub               ' キャンセル
For i = LBound(files) To UBound(files)
    Debug.Print files(i)
Next i

FileDialog でフォルダを選ばせる

フォルダ内のファイルをまとめて処理するマクロでは、フォルダそのものを選ばせたいことがあります。この場合は Application.FileDialog(msoFileDialogFolderPicker) を使います。Show の戻り値が -1 のときは選択された、0 のときはキャンセルです。選ばれたパスは SelectedItems(1) で取得できます。次の関数は、選ばれたフォルダのパスを返し、キャンセル時は空文字を返します。

Function PickFolder(Optional ByVal startPath As String = "") As String
    Dim fd As FileDialog
    Set fd = Application.FileDialog(msoFileDialogFolderPicker)
    With fd
        .Title = "処理するフォルダを選んでください"
        If startPath <> "" Then .InitialFileName = startPath & "\"   ' 最初に開く場所
        If .Show = -1 Then
            PickFolder = .SelectedItems(1)
        Else
            PickFolder = ""                          ' キャンセル
        End If
    End With
End Function

Sub UsePickFolder()
    Dim folderPath As String
    folderPath = PickFolder(ThisWorkbook.Path)
    If folderPath = "" Then Exit Sub
    MsgBox "選ばれたフォルダ:" & folderPath
End Sub

使い分けと注意点

ファイルを1つまたは複数選ばせるだけなら、短く書ける GetOpenFilename で十分です。フォルダを選ばせたいとき、最初に開く場所や表示する種類を細かく指定したいときは FileDialog を使います。FileDialog にはファイルを選ぶ msoFileDialogFilePicker もあり、こちらはキャンセル時の判定を Show の戻り値で統一できる利点があります。

どちらの方法でも、キャンセルされたときの処理を必ず書いておくことが大切です。判定を書き忘れると、キャンセルしただけでエラー画面が表示され、利用者に不安を与えてしまいます。また、ThisWorkbook.Path を最初に開く場所に指定すると、マクロのブックと同じフォルダから選び始められるので、毎回フォルダを移動する手間が省けます。

なお、ブックを OneDrive や SharePoint 上で開いていると、ThisWorkbook.Path が「https://」から始まる URL になり、最初に開く場所として使えない場合があります。その場合はローカルのフォルダを既定値にしてください。

  • GetOpenFilename の戻り値は Variant で受け取る
  • キャンセル時は False(GetOpenFilename)または Show = 0(FileDialog)
  • 複数選択の配列は 1 から始まる

ほかの記事