見出し画像

[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だったら処理を終了させれば安全。


この記事が参加している募集

仕事について話そう

この記事が気に入ったらサポートをしてみませんか?