ファイル選択ダイアログ(VBA)

VBA(Excel)では、よくファイル選択ダイアログを使うシーンがあります。Excelによる入力画面等を作成する際、他システムからの外部ファイルを取り込み、CSV出力する等が経験として多いです。

一般的なファイル選択ダイアログについて掲載します。

  • ファイル選択ダイアログ(単一ファイル)
Sub ファイル選択_Click()

    On Error GoTo NextErr
    
    Dim fType, prompt As String
    Dim fPath As Variant
    Dim fileName As String
    Dim strWork As String
    Dim ws As Worksheet
    
    'アクティブシートを取得する。
    Set ws = ActiveWorkbook.ActiveSheet
    
    '選択できるファイルの種類を拡張子(csv)に限定
    fType = "CSVファイル (*.csv),*.csv"
    
    'ダイアログのタイトルを指定
    prompt = "ファイル選択"
    
    'ファイル参照ダイアログの表示
    fPath = Application.GetOpenFilename(fType, , prompt)
    
    If fPath = False Then
        'ダイアログでキャンセルボタンが押された場合は処理を終了する
        Exit Sub
    End If
    
    'ファイル名を取得する。(絶対パスよりファイル名のみを取得する)
    fileName = Mid(fPath, InStrRev(fPath, "\") + 1, Len(fPath) - InStrRev(fPath, "\"))

    'ファイル名を特定のセルに編集する。
    ws.Range("A1").Value = fileName

    'ファイルの絶対パスをセルに編集する。
    ws.Range("A2").Value = fPath

NextEnd:
    Exit Sub
NextErr:
    MsgBox ("異常が発生しました。エラー内容[" & Err.Description & "]")
End Sub

Application.GetOpenFilenameを使ってファイル選択ダイアログを表示できます。引数にファイルフィルターを指定し、対象の拡張子のファイルをターゲットとできます。またファイル選択ダイアログのタイトルも指定可能です。デフォルトではファイル選択は単一となっています。

  • ファイル選択ダイアログ(複数ファイル)
Sub ファイル選択_Click()

    On Error GoTo NextErr
    
    Dim fType, prompt As String
    Dim fPath As Variant
    Dim fpathItem As Variant
    Dim fileName As String
    Dim strWork As String
    Dim ws As Worksheet
    Dim iFileCnt As Integer
    
    'アクティブシートを取得する。
    Set ws = ActiveWorkbook.ActiveSheet
    
    '選択できるファイルの種類を拡張子(csv)に限定
    fType = "CSVファイル (*.csv),*.csv"
    
    'ダイアログのタイトルを指定
    prompt = "ファイル選択"
    
    'ファイル参照ダイアログの表示
    fPath = Application.GetOpenFilename(fType, , prompt,MultiSelect:=True)

    '選択したファイルが存在する場合
    If IsArray(fpath) = True Then

        iFileCnt = 0

        '選択された全てのファイル名を取得する
        For Each fpathItem In fpath

            iFileCnt = iFileCnt  +1

            'ファイル名を取得する。(絶対パスよりファイル名のみを取得する)
            fileName = Mid(CStr(fpathItem), InStrRev(CStr(fpathItem), "\") + 1, Len(CStr(fpathItem)) - InStrRev(CStr(fpathItem), "\"))

            'ファイル名を特定のセルに編集する。
            ws.Range("A" & iFileCnt).Value = fileName

            'ファイルの絶対パスをセルに編集する。
            ws.Range("B" & iFileCnt).Value = CStr(fpathItem)
        Next
    Else
        'ダイアログでキャンセルボタンが押された場合は処理を終了する
        Exit Sub
    End If

NextEnd:
    Exit Sub
NextErr:
    MsgBox ("異常が発生しました。エラー内容[" & Err.Description & "]")
End Sub

複数ファイル選択時は、Application.GetOpenFilenameの引数に、MultiSelect:=Trueを選択する事で、Ctrlを押下しながら複数ファイルを選択することができます。また結果が配列にて返却される為、要素を取り出しループすることで、全ての選択ファイル名を取得することができます。