Excel VBAでブックを開くWorkbooks.Openメソッドは、実行するとエラーで止まることがあります。多くは「ファイルが見つからない」「形式が合わない」「すでに開いている」「読み取り専用やパスワード」「リンク更新のダイアログで止まる」「保護ビューでブロックされる」のいずれかが原因です。このページでは、原因を症状から切り分ける表と、最小で確実に動くVBAコードを使って、原因ごとの直し方をまとめます。専門用語はできるだけ避け、実際に直すための手順を中心に解説します。
Workbooks.Openの基本の書き方
Workbooks.Openは、指定したパスのExcelファイルを開くメソッドです。もっとも基本的な書き方は次のとおりです。
vbaコード
Sub OpenWorkbook()
Dim wb As Workbook
Set wb = Workbooks.Open(Filename:="C:\data\sample.xlsx")
' ここから wb に対して処理を書く
End Sub
Filenameには、開きたいファイルのフルパス(ドライブ名から始まる完全なパス)を文字列で指定します。Microsoftの公式リファレンスでは、Openメソッドの最初の引数がFileName(開くブックのファイル名)と定義されています。エラーの多くは、このファイル名の指定や、ファイルの状態が原因で起きます。
Workbooks.Openでエラーが出る原因と直し方
まず、症状から原因を切り分けましょう。次の表は、よくある原因と「なぜ起きるか」「直し方」を一覧にしたものです。
| 症状 | 主な原因 | 直し方 |
|---|---|---|
| 「Method ‘Open’ of object ‘Workbooks’ failed(実行時エラー 1004)」などで止まる | パスが違う、ファイルが存在しない | パスを見直し、Dir関数で存在を確認してから開く |
| 開けない、または別ファイルとして扱われる | 拡張子・ファイル形式の不一致(.xlsx / .xls / .xlsm / .csv) | 実体に合った拡張子を指定する。CSVは区切り文字に注意する |
| 「読み取り専用」になる、または開いた後にエラー | そのファイルがすでに開かれている、排他ロック中 | 開いているか判定してから処理を分岐。読み取り専用で開く |
| パスワードの入力ダイアログが出て止まる | パスワード保護されている | Password引数でパスワードを渡す |
| 「リンクの更新」ダイアログが出て止まる | 外部参照(リンク)の更新確認 | UpdateLinks引数で更新するかしないかを指定する |
| 開くが編集できない、警告バーが出る | 保護ビュー(インターネット由来・添付・安全でない場所) | 信頼できる場所に置く、または「編集を有効にする」 |
ここからは、原因ごとに最小のコードで直し方を見ていきます。
パスが違う・ファイルが存在しない
指定したパスにファイルがないと、開く処理が失敗します。表計算ファイルを開くときにもっとも多い原因です。防ぐには、開く前にDir関数でファイルの存在を確認します。公式リファレンスでは、Dir関数は指定したパスにファイルが見つからないとき、長さ0の文字列(””)を返すと定義されています。これを使って存在チェックができます。
vbaコード
Sub OpenWorkbook_CheckExists()
Dim FilePath As String
FilePath = "C:\data\sample.xlsx"
If Dir(FilePath) = "" Then
MsgBox "指定したファイルが見つかりません。パスを確認してください。"
Exit Sub
End If
Dim wb As Workbook
Set wb = Workbooks.Open(Filename:=FilePath)
End Sub
ファイル名を直接書かず、ThisWorkbook.Path(このマクロが入っているブックがあるフォルダ)を起点にすると、フォルダごと移動しても動きやすくなります。
vbaコード
Dim FilePath As String
FilePath = ThisWorkbook.Path & "\data\sample.xlsx"
パスの区切り文字「\」の入れ忘れや、全角スペースの混入もよくある失敗です。Dirでチェックしてから開くようにしておくと、原因がパスにあるのかどうかをすぐ切り分けられます。
拡張子・ファイル形式が合っていない
Excelのファイルにはいくつかの形式があり、拡張子で見分けます。指定した拡張子と実体が合っていないと、開けなかったり、開けても想定どおりに扱えないことがあります。
| 拡張子 | 中身 |
|---|---|
| .xlsx | 通常のブック(マクロを含まない) |
| .xlsm | マクロを含むブック |
| .xls | 古い形式のブック(Excel 2003以前) |
| .csv | カンマ区切りのテキスト。文字や日付がずれることがある |
テキストファイルを開くときは、列をどこで区切るかをFormat引数で指定できます。公式リファレンスでは、Format引数は、Excelがファイルをテキストとして開くときの区切り文字を表すと定義されています(1=タブ、2=カンマ、3=スペース、4=セミコロン、5=区切りなし、6=カスタム文字。カスタムは別途Delimiter引数で区切り文字を指定します)。区切り文字の指定例として、タブ区切りのテキストを開くなら次のように書きます。
vbaコード
Workbooks.Open Filename:="C:\data\list.txt", Format:=1
ただし注意したいのは、Format引数はあくまで列の区切り位置を決めるものだという点です。.csvをWorkbooks.Openで開いたときに起きやすい「先頭の0が消える」「数字が日付になる」といった自動変換のずれは、Formatでは直りません。各列の書式を指定して読み込みたい場合は、Workbooks.OpenではなくQueryTablesやOpenTextを使い、列ごとにxlTextFormatなどの書式を指定して読み込みます。
なお、1シートあたりの最大行数は形式で異なり、.xlsxは1,048,576行、古い.xlsは65,536行までです。このため最終行を取得するコードでは行数を決め打ちせず、シートを明示してRows.Countでそのシートの最大行数を取得すると、形式の違いによるずれを防げます。
vbaコード
Dim ws As Worksheet
Set ws = wb.Sheets("Sheet1")
Dim LastRow As Long
LastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
ファイルがすでに開かれている・排他ロック中
同じ名前のファイルの扱いには、状況によって2つのパターンがあります。(A)自分のExcelで既に開いている同名ブックは、もう一度Workbooks.Openしても新しく開き直されず、既存のものがそのまま使われます。(B)他のユーザーや他のプロセスがロック中のファイルは、読み取り専用で開かれたり、開けなかったりします。どちらの場合も、開く前に同じ名前のブックがすでに開かれていないかを確認しておくと安全です。
vbaコード
Sub OpenWorkbook_IfNotOpen()
Dim FilePath As String
FilePath = "C:\data\sample.xlsx"
' 存在チェック(不在ならここで止める)
If Dir(FilePath) = "" Then
MsgBox "指定したファイルが見つかりません。"
Exit Sub
End If
' パス文字列からファイル名を切り出す(Dirの順序依存を避ける)
Dim targetName As String
targetName = Mid(FilePath, InStrRev(FilePath, "\") + 1)
Dim wb As Workbook
For Each wb In Workbooks
If StrComp(wb.Name, targetName, vbTextCompare) = 0 Then
MsgBox "そのファイルはすでに開いています。"
Exit Sub
End If
Next wb
Set wb = Workbooks.Open(Filename:=FilePath)
End Sub
他の人がそのファイルを開いていて書き込みができない場合は、読み取り専用で開く方法(次の項目)に切り替えると、処理を止めずに済みます。なお公式リファレンスによると、Notify引数をTrueにすると、書き込み可能で開けないファイルを読み取り専用で開いたうえで、空くと通知する動作になります。
読み取り専用で開く・パスワード保護
書き込みの必要がなく、ロックを避けたいだけなら、ReadOnly引数をTrueにして読み取り専用で開きます。公式リファレンスでも、ReadOnlyは「読み取り専用モードで開くならTrue」と定義されています。
vbaコード
Set wb = Workbooks.Open(Filename:="C:\data\sample.xlsx", ReadOnly:=True)
パスワードで保護されたファイルは、何も指定しないとパスワード入力のダイアログが出て止まります。Password引数でパスワードを渡せば、止まらずに開けます(公式リファレンスでは、保護されたブックを開くために必要なパスワードを表す文字列、と定義されています)。
vbaコード
Set wb = Workbooks.Open(Filename:="C:\data\sample.xlsx", Password:="yourpassword")
読み取り専用で開く方法をもっと詳しく知りたい場合は、Excel VBAで読み取り専用でブックを開く方法もあわせてご覧ください。
リンク更新のダイアログで止まる
開こうとするブックが、他のブックのデータを参照(外部参照・リンク)していると、開くときに「リンクの更新」を確認するダイアログが出て、マクロが止まることがあります。公式リファレンスによると、UpdateLinks引数を省略すると更新方法をユーザーに確認する動作になり、値を指定すれば確認を出さずに進められます。
| UpdateLinksの値 | 動作 |
|---|---|
| 0 | 外部参照(リンク)を更新せずに開く |
| 3 | 外部参照(リンク)を更新して開く |
更新の確認ダイアログを出さずに、リンクを更新しないで開きたいときは、UpdateLinks:=0を指定します。
vbaコード
Set wb = Workbooks.Open(Filename:="C:\data\sample.xlsx", UpdateLinks:=0)
保護ビュー・信頼できる場所でブロックされる
インターネットからダウンロードしたファイル、メールの添付ファイル、安全でない場所にあるファイルは、Excelが「保護ビュー」という読み取り専用の状態で開くことがあります。これはウイルスなどから守るための仕組みで、Microsoftの公式情報でも、インターネット由来・メール添付・安全でない場所などが保護ビューのきっかけとして挙げられています。保護ビューで開いた場合は、画面上部の警告バーにある「編集を有効にする」を押すと編集できます。
マクロで毎回扱うファイルは、保護ビューがかからない「信頼できる場所(信頼できる場所として登録したフォルダ)」に置いておくと、ブロックされずに開けます。なお、ネットワーク上の場所は既定では信頼できる場所として許可されないため、共有フォルダのファイルは保護ビューや権限の影響を受けやすくなります。まずローカルにコピーして試すと原因の切り分けがしやすくなります。
実際にExcel 2019で動かして確かめた結果
ここまでの原因と対処を、当サイトの作業環境(Windows 11・Excel 2019)で実際にVBAを書いて動かし、本当に出るエラー番号とメッセージを確認しました。次の表は、その実機での結果です。

| 試したこと | 出た実行時エラー番号 | Excelが実際に表示したメッセージ |
|---|---|---|
| 存在しないパスのファイルを開く | 1004 | 申し訳ございません。○○が見つかりません。名前が変更されたか、移動や削除が行われた可能性があります。 |
| 拡張子は.xlsxだが中身がテキスト(形式不一致) | 1004 | Excel でファイル ‘○○.xlsx’ を開くことができません。ファイル形式またはファイル拡張子が正しくありません。ファイルが破損しておらず、ファイル拡張子とファイル形式が一致していることを確認してください。 |
| すでに開いている同名ブックをもう一度開く | 0(エラーなし) | エラーにならず、すでに開いていた同じブックがそのまま返ってきました。 |
この結果から、現場で役に立つポイントが2つ見えてきます。
- 「ファイルが見つからない」も「形式が違う」も、実機では同じ実行時エラー1004で出ました。つまりエラー番号だけ見ても原因は区別できません。番号で切り分けようとせず、
Err.Description(メッセージの本文)まで読むのが確実です。本文に「見つかりません」とあればパスの問題、「ファイル形式または拡張子が正しくありません」とあれば中身と拡張子の不一致、と判断できます。 - すでに開いている同名ブックをもう一度
Workbooks.Openしても、エラーにはならず既存のブックがそのまま返りました(エラー番号0)。二重に開かれてしまう心配はありませんが、ディスク上の最新ファイルではなく「いま開いているほうのブック」を操作している点には注意してください。最新の内容で開き直したいときは、いったん閉じてから開きます。
止まらないようにするエラー処理の最小例
ここまでの対策を入れても、想定外の理由で開けないことはあります。そのときマクロ全体が止まらないように、On Errorを使ったエラー処理を最小限だけ入れておくと安心です。
vbaコード
Sub OpenWorkbook_Safe()
Dim FilePath As String
FilePath = "C:\data\sample.xlsx"
If Dir(FilePath) = "" Then
MsgBox "ファイルが見つかりません。"
Exit Sub
End If
Dim wb As Workbook
On Error Resume Next
Set wb = Workbooks.Open(Filename:=FilePath, ReadOnly:=True, UpdateLinks:=0)
On Error GoTo 0
If wb Is Nothing Then
MsgBox "ファイルを開けませんでした。パスや形式、開いているかを確認してください。"
Exit Sub
End If
' ここから wb に対して処理を書く
End Sub
このコードは、存在チェック・読み取り専用・リンク更新なしをまとめて指定し、それでも開けなかった場合はメッセージを出して止めます。On Error Resume Nextはエラーを一時的に読み飛ばす書き方なので、開く処理の前後だけで使い、On Error GoTo 0ですぐ元に戻すのがポイントです。
なお、マクロ実行中のエラーそのものを抑える方法や、止まる原因を切り分ける考え方は、ExcelVBAのエラーをOFFにする正解7選でまとめています。
よくある質問
Workbooks.Openでエラーが出て止まるのはなぜですか(1004 など)
多くはパスが間違っているか、ファイルが存在しない・開けない状態のときです。エラー番号は状況によって1004のほか53(File not found)などになることもあります。まずDir関数でファイルの存在を確認し、パスの区切り文字や拡張子が合っているかを見直してください。
ファイルを読み取り専用で開くにはどうすればよいですか
ReadOnly引数をTrueにして開きます。書き込みをしないならロックを避けられ、他の人が開いていても開けることがあります。
パスワード保護されたファイルを開くには
Password引数にパスワードを文字列で渡します。指定しないとパスワード入力のダイアログが出て、マクロが止まります。
開くときに「リンクの更新」ダイアログが出て止まります
外部参照を含むブックが原因です。UpdateLinks:=0を指定すると、確認を出さずにリンクを更新しないで開けます。更新したい場合は3を指定します。
相対パスでファイルを開きたいです
VBAに相対パス専用の指定はありませんが、ThisWorkbook.Pathを起点にしてフルパスを組み立てれば、同じ効果が得られます。マクロのブックと同じフォルダ構成を保ったまま移動できます。
まとめ
Workbooks.Openでのエラーは、原因を切り分ければ多くが防げます。開く前にDir関数で存在を確認し、必要に応じてReadOnly・Password・UpdateLinksといった引数を指定するのが基本です。保護ビューや排他ロックなど、ファイル側の状態が原因のこともあるので、まずローカルのファイルで試して切り分けると解決が早くなります。今回のポイントを押さえて、安定して動くマクロに仕上げてください。
最終確認日 2026年6月
uri uri


コメント