
Photo by
nviveto
[VBA]ダイアログを使って、安全にファイルを開く
やりたかったこと
定番のダイアログを使って、ファイルを指定して、
安全にファイルを開く

結論
Option Explicit
Sub test()
If safetyOpenFile = False Then
Exit Sub
End If
Range("A1").Value = "test"
End Sub
'ファイルが正しく開けた場合はtureを返す。
'ファイルが正しく開けなかった場合はfalseを返す。
'親元では、falseの場合、exit sub すればよい。
Function safetyOpenFile() As Boolean
Dim openFilePath As String '開くファイル
Dim wb As Workbook 'workbook変数
openFilePath = Application.GetOpenFilename("Microsoft Excelブック,*.xls?")
'同名のファイルを開いていないか確認する
For Each wb In Workbooks
If wb.FullName = openFilePath Then
MsgBox openFilePath & vbCrLf & "はすでに開いています", vbExclamation
safetyOpenFile = False
Exit Function
End If
Next wb
'未指定でなければファイルを開く
If openFilePath <> "False" Then
safetyOpenFile = True
Workbooks.Open openFilePath
Else
MsgBox "ファイルが指定されませんでした", vbExclamation, "ファイルオープン"
safetyOpenFile = False
Exit Function
End If
End Function
経緯
ダイアログを使ってファイルを開く方法はわかる。
が、(同名のファイルであるなど)すでにファイルが開かれていたり
キャンセルを押された場合どうするかっていうのは
意外とわかっていなかった。
ので、今回勉強のために作った。
解説
Function safetyOpenFile() As Boolean
が本体。
openFilePath = Application.GetOpenFilename("Microsoft Excelブック,*.xls?")
ここで、ダイアログを使って開くファイルのパスを取得する。
'同名のファイルを開いていないか確認する
For Each wb In Workbooks
If wb.FullName = openFilePath Then
MsgBox openFilePath & vbCrLf & "はすでに開いています", vbExclamation
safetyOpenFile = False
Exit Function
End If
Next wb
for eachで、すでに開いていないかを確認する。
開いていた場合、戻り値をfalseにする。
'未指定でなければファイルを開く
If openFilePath <> "False" Then
safetyOpenFile = True
Workbooks.Open openFilePath
Else
MsgBox "ファイルが指定されませんでした", vbExclamation, "ファイルオープン"
safetyOpenFile = False
Exit Function
End If
キャンセルされると、"False"が返ってくるので、
キャンセルの場合も戻り値をfalseにする。
すでに開いておらず、かつファイルもしっかり指定されている場合は、
戻り値をtureにして、ファイルを開く。
Sub test()
If safetyOpenFile = False Then
Exit Sub
End If
親では、falseだったら処理を終了させれば安全。