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を押下しながら複数ファイルを選択することができます。また結果が配列にて返却される為、要素を取り出しループすることで、全ての選択ファイル名を取得することができます。