【Excel VBA】Workbooks.Openで外部ファイルを安全に開く方法|存在確認・読み取り専用・リンク更新を停止
みなさんこんにちは。
Excel VBAで業務を自動化していると、別のExcelファイルをVBAから開いて処理したい場面があるかと思います。
外部ファイルを開く場合に使用するのが、Workbooks.Openです。
ただし、単純にファイルを開くだけでは、指定したファイルが存在しなかったり、外部リンクが更新されたり、誤って上書き保存してしまったりする可能性があります。
そのため、実際の業務で使用する場合は、ファイルの存在確認や読み取り専用で開く設定などを合わせて実装しておくと安心です。
今回は、Workbooks.Openで外部ファイルを安全に開く方法について、Dir関数による存在確認、リンク更新の停止、読み取り専用で開く方法、開いたブックの取得、既に開いている場合やパスを間違えた場合の対処まで順番にご紹介したいと思います。
この記事はこんな人におすすめ
- VBAから別のExcelファイルを開きたい人
- Workbooks.Openの基本的な使い方を知りたい人
- 外部リンクを更新せずにファイルを開きたい人
- 元ファイルを変更しないよう読み取り専用で開きたい人
- ファイルが存在しない場合や、既に開いている場合のエラーを防ぎたい人
Dir関数でファイル一覧を取得する方法
今回の記事では、外部ファイルが存在するか確認するためにDir関数を使用します。
Dir関数を使用してフォルダ内のファイル一覧を取得する方法については、以下の記事でも詳しくご紹介しています。
今回使用するファイル
今回は、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

存在確認・リンク更新停止・読み取り専用をまとめて実装する
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関数による存在確認で処理が止まり、「指定したファイルが見つかりません。」と表示されます。

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アプリから始めませんか?
