\ お問い合わせはこちら /

【VBA】ブックを安全に開く方法【存在/重複チェック+読み取り専用+パスワード対応】

Excel VBAで作業を自動化でよく使うのが、「外部ブックを開く」という処理です。

ところが、ただ Workbooks.Open を呼ぶだけでは存在しないファイル・既に開いている同名ブック・パスワード付きファイル などで処理が止まることがあります。

この記事では、以下の流れで「安全に止まらず開く」方法を解説します。

  • 基本の最短コード
  • 引数を明示して書く
  • エラー無視の一時対応
  • 存在確認してから開く
  • ダイアログで選択させる
  • 同名ブックの開き済み確認
  • 実務テンプレ(読み取り専用/パスワード対応)

ぜひ、最後までご覧ください。

【VBA】ブックを安全に開く方法

最短コードでブックを開く

まずは一番シンプルな方法です。とりあえず動作確認をする段階で使います。

VB
Sub OpenBook_Min()
    Workbooks.Open "C:\Book1.xlsx"
End Sub

Workbooks.Open にフルパスを渡すだけです。

ただし、このままだと存在しないファイルや開き済みの同名ブックでエラーになります。

引数名を明示する

実務コードでは、引数名を付けて書くことを推奨します。

後から別の引数(例:読み取り専用、パスワード)を追加するときに安全です。

VB
Sub OpenBook_WithArg()
    Workbooks.Open Filename:="C:\Book1.xlsx"
End Sub

Filename:= は省略可能ですが、可読性と保守性のため付ける習慣を持つと良いと思います。

存在確認してから開く

エラーを避けるには、事前に Dir 関数でファイルの存在を確認します。

VB
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

これでパスの打ち間違いや移動によるエラーを防げます。

ダイアログで選択させる

パスが固定できない場合は、ユーザーに選ばせるのが安全です。

VB
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では同名ブックを同時に開けません。事前にチェックします。

VB
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

拡張子込みで比較することで誤判定を防ぎます。

実務テンプレ(読み取り専用・パスワード対応)

ここからが本題です。

存在確認・同名チェックに加え、読み取り専用パスワード付きブックにも対応した汎用関数を作ります。

VB
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

これで、かなり安全にブックを開けるようになりました。

呼び出し例

ファイルを開く際のオプションのバリエーションをご紹介します。

読み取り専用で開く

VB
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

開くためのパスワード付き

VB
Sub Example_Open_WithOpenPassword()
    Dim wb As Workbook
    Set wb = OpenWorkbookSafe( _
        "C:\Secure\Budget.xlsx", _
        ReadOnly:=True, _
        OpenPassword:="open-1234")
End Sub

書込保護パスワード付き(編集可能で開く)

VB
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 は単純だが実務では不十分
  • 存在チェック+同名チェックで安定化
  • 読み取り専用やパスワードにも対応できる汎用関数化が最適解
  • 一度作っておけば、どのプロジェクトでも再利用できる
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

はじめまして。旅行をこよなく愛するITエンジニアのNommyです。
これまでUberEatsの配達員、金融業界、ミステリーショッパーなど色々なお仕事を経験してきました。
本ブログでは僕が経験してきたことなどを執筆していきます。

コメント

コメントする

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)