【Excel VBA】Workbooks.Openで外部ファイルを安全に開く方法|存在確認・読み取り専用・リンク更新を停止

みなさんこんにちは。

Excel VBAで業務を自動化していると、別のExcelファイルをVBAから開いて処理したい場面があるかと思います。

外部ファイルを開く場合に使用するのが、Workbooks.Openです。

ただし、単純にファイルを開くだけでは、指定したファイルが存在しなかったり、外部リンクが更新されたり、誤って上書き保存してしまったりする可能性があります。

そのため、実際の業務で使用する場合は、ファイルの存在確認や読み取り専用で開く設定などを合わせて実装しておくと安心です。

今回は、Workbooks.Openで外部ファイルを安全に開く方法について、Dir関数による存在確認、リンク更新の停止、読み取り専用で開く方法、開いたブックの取得、既に開いている場合やパスを間違えた場合の対処まで順番にご紹介したいと思います。


この記事はこんな人におすすめ

  • VBAから別のExcelファイルを開きたい人
  • Workbooks.Openの基本的な使い方を知りたい人
  • 外部リンクを更新せずにファイルを開きたい人
  • 元ファイルを変更しないよう読み取り専用で開きたい人
  • ファイルが存在しない場合や、既に開いている場合のエラーを防ぎたい人

Dir関数でファイル一覧を取得する方法

今回の記事では、外部ファイルが存在するか確認するためにDir関数を使用します。

Dir関数を使用してフォルダ内のファイル一覧を取得する方法については、以下の記事でも詳しくご紹介しています。

https://epsilon-delta-blog.com/vba-dir-file-list

今回使用するファイル

今回は、VBAを記述するExcelファイルと同じ場所に「テストフォルダ」を作成し、その中に「売上データ_01.xlsx」を保存したものとして説明します。

  • VBAを記述するファイル:WorkbooksOpenテスト.xlsm
  • 開くファイル:テストフォルダ\売上データ_01.xlsx

Workbooks.Openの基本的な使い方

Sub 外部ファイルを開く()

    Dim filePath As String

    filePath = ThisWorkbook.Path & "\テストフォルダ\売上データ_01.xlsx"

    Workbooks.Open Filename:=filePath

End Sub

Filename に開きたいファイルのフルパスを指定することで、Excelファイルを開くことができます。

Dir関数でファイルが存在するか確認する

Sub ファイルの存在を確認して開く()

    Dim filePath As String

    filePath = ThisWorkbook.Path & "\テストフォルダ\売上データ_01.xlsx"

    If Dir(filePath) = "" Then

        MsgBox "指定したファイルが見つかりません。" & vbCrLf & filePath, vbExclamation

        Exit Sub

    End If

    Workbooks.Open Filename:=filePath

End Sub

Dir関数で指定したファイルが見つからない場合は空文字列が返されるため、Dir(filePath) = "" で存在確認を行うことができます。

外部リンクを更新せずに開く

外部リンクを更新せずに開きたい場合は、UpdateLinks:=0 を指定します。

Workbooks.Open _
    Filename:=filePath, _
    UpdateLinks:=0

Microsoft Learnでは、UpdateLinksに0を指定すると、ブックを開いたときに外部参照のリンクを更新しないと説明されています。

読み取り専用で開く

元のファイルを編集する必要がない場合は、ReadOnly:=True を指定して読み取り専用で開いておくと安心です。

Workbooks.Open _
    Filename:=filePath, _
    UpdateLinks:=0, _
    ReadOnly:=True

開いたブックをWorkbook型の変数へ格納する

Workbooks.Openは、開いたWorkbookオブジェクトを返します。その後の処理で操作する場合は、Workbook型の変数へ格納しておくと便利です。

Dim wb As Workbook

Set wb = Workbooks.Open( _
            Filename:=filePath, _
            UpdateLinks:=0, _
            ReadOnly:=True)

処理後に保存せず閉じる場合は、以下のように記述します。

wb.Close SaveChanges:=False

本当に読み取り専用で開かれているか確認する

If wb.ReadOnly = True Then

    MsgBox "読み取り専用で開いています。"

End If

Workbook.ReadOnlyは、ブックが読み取り専用で開かれている場合にTrueを返します。

既に同じファイルが開かれている場合を確認する

Function IsWorkbookOpen(ByVal filePath As String) As Boolean

    Dim wb As Workbook

    For Each wb In Application.Workbooks

        If StrComp(wb.FullName, filePath, vbTextCompare) = 0 Then

            IsWorkbookOpen = True

            Exit Function

        End If

    Next wb

    IsWorkbookOpen = False

End Function
If IsWorkbookOpen(filePath) = True Then

    MsgBox "指定したファイルは既に開かれています。", vbInformation

    Exit Sub

End If
Excel VBAで対象ファイルが既に開かれている場合にメッセージを表示した画面

存在確認・リンク更新停止・読み取り専用をまとめて実装する

Sub 外部ファイルを安全に開く()

    Dim filePath As String
    Dim wb As Workbook

    filePath = ThisWorkbook.Path & "\テストフォルダ\売上データ_01.xlsx"

    If Dir(filePath) = "" Then

        MsgBox "指定したファイルが見つかりません。" & vbCrLf & filePath, vbExclamation

        Exit Sub

    End If

    If IsWorkbookOpen(filePath) = True Then

        MsgBox "指定したファイルは既に開かれています。", vbInformation

        Exit Sub

    End If

    On Error GoTo ErrHandler

    Set wb = Workbooks.Open( _
                Filename:=filePath, _
                UpdateLinks:=0, _
                ReadOnly:=True, _
                IgnoreReadOnlyRecommended:=True)

    If wb.ReadOnly = True Then
        MsgBox "ファイルを読み取り専用で開きました。", vbInformation
    End If

    Exit Sub

ErrHandler:

    MsgBox "ファイルを開く際にエラーが発生しました。" & vbCrLf & _
           "エラー番号:" & Err.Number & vbCrLf & _
           "内容:" & Err.Description, vbExclamation

End Sub

パスを間違えた場合の動作を確認する

filePath = ThisWorkbook.Path & "\テストフォルダ\存在しないファイル.xlsx"

存在しないファイルを指定すると、Workbooks.Openを実行する前にDir関数による存在確認で処理が止まり、「指定したファイルが見つかりません。」と表示されます。

Excel VBAで存在しないファイルを指定してファイルが見つからないメッセージを表示した画面

Workbooks.Openでよく使用する引数

引数内容今回の指定
Filename開くファイルのパスfilePath
UpdateLinks外部リンクの更新方法0(更新しない)
ReadOnly読み取り専用で開くかTrue
IgnoreReadOnlyRecommended読み取り専用推奨のメッセージを表示しないTrue

信頼できないファイルを開く場合は注意する

Microsoft Learnでは、プログラムからファイルを開く場合、既定ではマクロが有効になると説明されています。

そのため、出所が分からないExcelファイルや信頼できないファイルをVBAから自動的に開く運用は避け、必要に応じてExcelのマクロセキュリティについても確認してください。

参考情報

最後に

いかがでしたでしょうか。

今回は、Excel VBAのWorkbooks.Openを使用して外部ファイルを安全に開く方法についてご紹介しました。

ファイルを開く前にDir関数で存在確認を行い、UpdateLinks:=0で外部リンクの更新を停止し、ReadOnly:=Trueで読み取り専用にしておくことで、意図しないエラーや変更を防ぎやすくなります。

さらに、開いたWorkbookを変数へ格納したり、既に同じファイルが開かれていないか確認したりすることで、その後の一括処理にも発展させやすくなります。

複数ファイルを自動で開いて集計するといった処理の基本になりますので、少しでも参考になればと思います。


開発依頼について

ココナラでWebスクレイピング開発サービスを出品しております。

自分で開発をしようと思ったけど、VBAでのネット記事が少なく困っている方も多いかと思います。

そんな方はいつでもお気軽にご相談ください。

また、本ブログからご依頼いただいた方については割引特典がございますので、

ご不明点と合わせてメッセージをいただけると幸いです。

Excelにてブラウザ操作自動化ツールを作成します その作業、webスクレイピングを使って自動化しましょう!

Webスクレイピング以外にもWebアプリの開発サービスも出品しております。

こちらについても、本ブログからご依頼いただいた方については割引特典がございますので、

お気軽にご相談ください。

スモールスケールのWebアプリ開発します 先ずはスモールスケールのWebアプリから始めませんか?

ご興味がある方はこちら!!

コメントを残す

メールアドレスが公開されることはありません。 ※ が付いている欄は必須項目です

CAPTCHA