Excel VBAで作業を自動化でよく使うのが、「外部ブックを開く」という処理です。
ところが、ただ Workbooks.Open
を呼ぶだけでは存在しないファイル・既に開いている同名ブック・パスワード付きファイル などで処理が止まることがあります。
この記事では、以下の流れで「安全に止まらず開く」方法を解説します。
- 基本の最短コード
- 引数を明示して書く
- エラー無視の一時対応
- 存在確認してから開く
- ダイアログで選択させる
- 同名ブックの開き済み確認
- 実務テンプレ(読み取り専用/パスワード対応)
ぜひ、最後までご覧ください。
【VBA】ブックを安全に開く方法
最短コードでブックを開く
まずは一番シンプルな方法です。とりあえず動作確認をする段階で使います。
Sub OpenBook_Min()
Workbooks.Open "C:\Book1.xlsx"
End Sub
Workbooks.Open
にフルパスを渡すだけです。
ただし、このままだと存在しないファイルや開き済みの同名ブックでエラーになります。
引数名を明示する
実務コードでは、引数名を付けて書くことを推奨します。
後から別の引数(例:読み取り専用、パスワード)を追加するときに安全です。
Sub OpenBook_WithArg()
Workbooks.Open Filename:="C:\Book1.xlsx"
End Sub
Filename:=
は省略可能ですが、可読性と保守性のため付ける習慣を持つと良いと思います。
存在確認してから開く
エラーを避けるには、事前に Dir
関数でファイルの存在を確認します。
Sub OpenBook_CheckExists()
Const TARGET As String = "C:\Book1.xlsx"
If Dir(TARGET) = "" Then
MsgBox "ファイルが見つかりません。" & vbCrLf & TARGET, vbExclamation
Exit Sub
End If
Workbooks.Open Filename:=TARGET
End Sub
これでパスの打ち間違いや移動によるエラーを防げます。
ダイアログで選択させる
パスが固定できない場合は、ユーザーに選ばせるのが安全です。
Sub OpenBook_PickDialog()
Dim filePath As Variant
filePath = Application.GetOpenFilename("Excelブック,*.xls?")
If VarType(filePath) = vbBoolean And filePath = False Then Exit Sub ' キャンセル
Workbooks.Open Filename:=CStr(filePath)
End Sub
戻り値はファイルパス(文字列)または False
(キャンセル時)になります。
同名ブックの開き済み確認
Excelでは同名ブックを同時に開けません。事前にチェックします。
Sub OpenBook_CheckDuplicate()
Const TARGET As String = "C:\Book1.xlsx"
Dim fileName As String: fileName = Dir(TARGET)
Dim wb As Workbook
For Each wb In Workbooks
If wb.Name = fileName Then
MsgBox fileName & " は既に開いています。", vbExclamation
Exit Sub
End If
Next
Workbooks.Open Filename:=TARGET
End Sub
拡張子込みで比較することで誤判定を防ぎます。
実務テンプレ(読み取り専用・パスワード対応)
ここからが本題です。
存在確認・同名チェックに加え、読み取り専用やパスワード付きブックにも対応した汎用関数を作ります。
Option Explicit
'========================================
' 安全に外部ブックを開く
'========================================
Public Function OpenWorkbookSafe( _
ByVal targetPath As String, _
Optional ByVal ReadOnly As Boolean = False, _
Optional ByVal OpenPassword As String = "", _
Optional ByVal WriteResPassword As String = "" _
) As Workbook
Dim fileName As String
Dim wb As Workbook
' 存在チェック
fileName = Dir(targetPath)
If fileName = "" Then
MsgBox targetPath & vbCrLf & "は存在しません。", vbExclamation
Exit Function
End If
' 同名チェック
For Each wb In Application.Workbooks
If wb.Name = fileName Then
MsgBox fileName & " は既に開いています。", vbExclamation
Exit Function
End If
Next
On Error GoTo OpenFailed
' 開く(リンク更新・読み取り専用推奨の確認を抑止)
Set OpenWorkbookSafe = Workbooks.Open( _
Filename:=targetPath, _
UpdateLinks:=0, _
ReadOnly:=ReadOnly, _
Password:=OpenPassword, _
WriteResPassword:=WriteResPassword, _
IgnoreReadOnlyRecommended:=True)
Exit Function
OpenFailed:
MsgBox "ブックを開けませんでした。" & vbCrLf & _
"理由: " & Err.Number & " - " & Err.Description, vbCritical
Set OpenWorkbookSafe = Nothing
End Function
これで、かなり安全にブックを開けるようになりました。
呼び出し例
ファイルを開く際のオプションのバリエーションをご紹介します。
読み取り専用で開く
Sub Example_Open_ReadOnly()
Dim wb As Workbook
Set wb = OpenWorkbookSafe("C:\Data\Report.xlsx", ReadOnly:=True)
If wb Is Nothing Then Exit Sub
' 後続処理…
End Sub
開くためのパスワード付き
Sub Example_Open_WithOpenPassword()
Dim wb As Workbook
Set wb = OpenWorkbookSafe( _
"C:\Secure\Budget.xlsx", _
ReadOnly:=True, _
OpenPassword:="open-1234")
End Sub
書込保護パスワード付き(編集可能で開く)
Sub Example_Open_WithWriteResPassword()
Dim wb As Workbook
Set wb = OpenWorkbookSafe( _
"C:\Secure\Template.xlsm", _
WriteResPassword:="write-9999")
End Sub
運用のポイント
UpdateLinks:=0
リンク更新ダイアログを抑止し、速度も確保できます。
IgnoreReadOnlyRecommended:=True
「読み取り専用で開きますか?」のダイアログを抑止できます。
パスワードは直書きしない
入力フォームや暗号化ファイルから取得する運用も検討しましょう。
同名ブックチェック
拡張仕込みで行うことで安全に処理できます。
まとめ
Workbooks.Open
は単純だが実務では不十分- 存在チェック+同名チェックで安定化
- 読み取り専用やパスワードにも対応できる汎用関数化が最適解
- 一度作っておけば、どのプロジェクトでも再利用できる
コメント