【この記事について】本記事は 2026年11月12日 時点で、Microsoft の公式リファレンス(記事末尾に出典)を確認し、あわせて Windows 版 Microsoft 365 の Excel(バージョン 16.0・ビルド 20527)で、掲載したコードをすべて実行して結果を確かめて書いています。エラーの番号とメッセージは、その実行で実際に出たものです。お使いのバージョンや設定によって、表示が異なることがあります。コードは必ずコピーしたブックで試してから使ってください。本記事の内容の利用は、ご自身の判断と責任でお願いします。
対象環境:Windows 版 Excel(Microsoft 365)。2026年11月12日に動作確認。難易度:マクロを1回でも動かしたことがある人向け。
VBAでファイル(ブック)を開くには、Set wb = Workbooks.Open("C:\data\売上.xlsx") と書きます。開いたブックを変数 wb に入れておくのがコツで、あとの行は wb.Worksheets(1) のように迷わず書けます。場所を固定したくないときは ThisWorkbook.Path、人に選ばせたいときは Application.GetOpenFilename を使います。この記事では、コピペで動く書き方を7つと、「開けない」ときの原因5つを、実機で出たメッセージつきでまとめます。

🔎 あわせて確認されている記事
まずはこれだけ|やりたいこと別の早見表
| やりたいこと | 書き方 |
|---|---|
| 場所が決まっているファイルを開く | Set wb = Workbooks.Open("C:\data\売上.xlsx") |
| マクロのブックと同じフォルダのファイルを開く | Workbooks.Open(ThisWorkbook.Path & "\売上.xlsx") |
| ファイルがあるか、先に確かめる | If Dir(p) = "" Then |
| 開くファイルを、その場で選ばせる | Application.GetOpenFilename |
| 元のファイルを書き換えたくない | ReadOnly:=True |
| フォルダの中を順番に全部開く | Dir と Do While |
| 閉じる(保存しない) | wb.Close SaveChanges:=False |
マクロそのものが動かない(ボタンを押しても何も起きない、黄色い帯が出る)ときは、先に次の記事を見てください。

基本|Workbooks.Open で開いて、変数に入れる
いちばん短い形です。C:\data\売上.xlsx を開き、1枚目のシートの A1 を表示して、保存せずに閉じます。
Sub OpenBook()
Dim wb As Workbook
Set wb = Workbooks.Open("C:\data\売上.xlsx")
MsgBox wb.Worksheets(1).Range("A1").Value
wb.Close SaveChanges:=False
End Sub
実機では、A1 に入れておいた「10月売上」が表示され、ブックは閉じられました。ポイントは3つです。
Setを付ける:ブックは「オブジェクト」なので、変数に入れるときはSetが要ります- かっこを付ける:変数で受け取るときは
Workbooks.Open(…)とかっこで囲みます wb.から書く:開いた直後はそのブックが手前に来ますが、ActiveWorkbookに頼ると、あとで行を足したときに別のブックを触りやすくなります
公式リファレンスでも、Workbooks.Open は開いたブックを表す Workbook オブジェクトを返すと書かれています。返ってきたものを受け取っておけば、名前を書き直さずに最後まで使えます。変数の宣言(Dim)があいまいな人は、次の記事が先です。

マクロのブックと同じフォルダのファイルを開く
C:\data\ のように場所を書き込むと、フォルダを移したり、ほかの人に渡したりしたときに動かなくなります。マクロを書いたブックと同じフォルダに置く決まりにして、ThisWorkbook.Path で場所を作ると、フォルダごと動かしても直さずに済みます。
Sub OpenSameFolder()
Dim wb As Workbook
Dim p As String
p = ThisWorkbook.Path & "\売上.xlsx"
Set wb = Workbooks.Open(p)
MsgBox wb.Name & " を開きました"
wb.Close SaveChanges:=False
End Sub
実機では「売上.xlsx を開きました」と表示されました。ThisWorkbook.Path の最後には \ が付かないので、ファイル名の前に \ を自分で足すのを忘れないでください。
ファイルがあるか確かめてから開く(Dir)
ファイルが無い場所を開こうとすると、マクロは実行時エラーで止まります。Dir は、見つかればファイル名を、見つからなければ空の文字("")を返す関数です。開く前に1回はさんでおくと、止まる代わりに案内を出せます。
Sub OpenIfExists()
Dim wb As Workbook
Dim p As String
p = "C:\data\売上2.xlsx"
If Dir(p) = "" Then
MsgBox "ファイルが見つかりません:" & p
Exit Sub
End If
Set wb = Workbooks.Open(p)
MsgBox wb.Worksheets(1).Range("A1").Value
wb.Close SaveChanges:=False
End Sub
実機で、ファイルが無い状態で動かすと「ファイルが見つかりません:C:\data\売上2.xlsx」と出て、止まらずに終わりました。ファイルを置いてから動かすと、A1 の中身が表示されました。
ダイアログでファイルを選んで開く(GetOpenFilename)
毎月ファイル名が変わるなら、使う人に選んでもらうのが確実です。Application.GetOpenFilename は[ファイルを開く]の画面を出して、選ばれたファイルの場所を文字で返すだけの命令です。この命令だけではファイルは開きません。返ってきた場所を Workbooks.Open に渡します。
Sub OpenByDialog()
Dim f As Variant
Dim wb As Workbook
f = Application.GetOpenFilename("Excel ファイル (*.xlsx;*.xlsm),*.xlsx;*.xlsm")
If VarType(f) = vbBoolean Then
MsgBox "キャンセルされました"
Exit Sub
End If
Set wb = Workbooks.Open(f)
MsgBox wb.Name & " を開きました"
wb.Close SaveChanges:=False
End Sub
実機では、ファイルを選ぶと「売上.xlsx を開きました」、[キャンセル]を押すと「キャンセルされました」と表示されました。
受け取る変数は Variant にする
ここがいちばんの落とし穴です。[キャンセル]が押されると、GetOpenFilename は文字ではなく False を返します。受け取る変数を String にしていると、これが 「False」という文字に変わってしまいます。実機で Dim f As String にしてキャンセルし、そのまま Workbooks.Open(f) に進ませると、次のメッセージで止まりました。
実行時エラー '1004':
申し訳ございません。False.xlsxが見つかりません。名前が変更されたか、移動や削除が行われた可能性があります。
「False.xlsx」というファイルを探しに行ってしまったわけです。変数は Variant で受け、VarType(f) = vbBoolean でキャンセルを見分けると、この事故は起きません。
読み取り専用で開く・リンクの確認を出さない
集計のために中を見るだけなら、読み取り専用で開くのが安全です。うっかり上書きする心配がなくなり、ほかの人が同じファイルを使っていても邪魔をしにくくなります。
Sub OpenReadOnly()
Dim wb As Workbook
Set wb = Workbooks.Open(Filename:="C:\data\売上.xlsx", ReadOnly:=True, UpdateLinks:=0)
MsgBox "読み取り専用:" & wb.ReadOnly
wb.Close SaveChanges:=False
End Sub
実機では「読み取り専用:True」と表示されました。よく使う引数は次の3つです。説明は公式リファレンスの内容です。
| 引数 | 指定 | 意味 |
|---|---|---|
ReadOnly |
True |
読み取り専用で開く |
UpdateLinks |
0 または 3 |
ほかのブックへのリンクを、0 は更新しない、3 は更新する。省略すると、リンクの更新方法を使う人にたずねる画面が出る |
Password |
文字 | パスワード付きのブックを開くための文字。省略すると、パスワードの入力をうながす画面が出る |
夜のあいだに自動で回したい処理で、マクロが途中で止まったまま朝になっていた。そんなときは、リンクやパスワードの画面が返事を待っていることがあります。なお、コードの中にパスワードを書くと、そのブックを開ける人なら誰でも読めてしまいます。書く前に、社内の決まりを確かめてください。
フォルダ内のファイルを順番に全部開く
「月次」フォルダに入っている .xlsx を1つずつ開き、1枚目のシートの B2 を足していく例です。Dir は、2回目からはかっこの中を空にして呼ぶと、次のファイル名を返します。もう無くなると "" が返るので、そこでループが終わります。
Sub OpenAllInFolder()
Dim folderPath As String
Dim fileName As String
Dim wb As Workbook
Dim total As Double
Dim cnt As Long
folderPath = "C:\data\月次\"
fileName = Dir(folderPath & "*.xlsx")
Application.ScreenUpdating = False
Do While fileName <> ""
If LCase(fileName) <> LCase(ThisWorkbook.Name) Then
Set wb = Workbooks.Open(folderPath & fileName, ReadOnly:=True)
total = total + wb.Worksheets(1).Range("B2").Value
cnt = cnt + 1
wb.Close SaveChanges:=False
End If
fileName = Dir()
Loop
Application.ScreenUpdating = True
MsgBox cnt & " 個のファイルを開きました。合計:" & total
End Sub
実機では、4月・5月・6月の3つ(B2 が 100・200・300)を置いたフォルダで動かし、「3 個のファイルを開きました。合計:600」と表示されました。終わったあと、開いたままのブックは残りませんでした。
fileName = Dir()を消さない:これを忘れると、同じファイルを開き続けて終わらなくなります- 自分自身を飛ばす:マクロのブックが同じフォルダにあるときのために、
ThisWorkbook.Nameと同じ名前は飛ばしています - 画面のちらつきを止める:
Application.ScreenUpdating = Falseで、開いたり閉じたりが画面に出なくなります。最後にTrueに戻します
Do While など、ループの書き方そのものは次の記事でまとめています。

“*.xls” と書くと、.xlsx と .xlsm も拾われた
同じフォルダに .xlsm と、古い形式の .xls も足して、Dir に渡す書き方を変えて試しました。
| Dir に渡した書き方 | 実機で返ってきたファイル |
|---|---|
"*.xlsx" |
4月.xlsx、5月.xlsx、6月.xlsx |
"*.xlsm" |
集計マクロ.xlsm |
"*.xls" |
4月.xlsx、5月.xlsx、6月.xlsx、旧形式.xls、集計マクロ.xlsm |
"*.xls*" |
上と同じ5つ |
「古い .xls だけ」のつもりで "*.xls" と書いても、この環境では .xlsx と .xlsm まで返ってきました。拡張子で分けたいときは、ループの中でもう一度、名前の終わりを確かめるのが確実です。
「開けない」ときの原因5つ|実機で出たメッセージ
| 症状(実機の表示) | 原因 | 直し方 |
|---|---|---|
| 実行時エラー 1004「申し訳ございません。…が見つかりません。名前が変更されたか、移動や削除が行われた可能性があります。」 | 場所かファイル名が違う | Dir で先に確かめる。\ の付け忘れ、拡張子、全角と半角を見る |
| 同じ 1004 で「False.xlsxが見つかりません」 | ダイアログのキャンセルを String で受けた |
Variant で受けて VarType で見分ける |
| 実行時エラー 91「オブジェクト変数または With ブロック変数が設定されていません。」 | Set を書き忘れた |
Set wb = Workbooks.Open(…) にする |
| エラーは出ないのに、ブックが開かれていない | 同じ名前のブックが、すでに別の場所から開いている | 先に開いているかを確かめる(下の関数) |
| 実行時エラー 1004「入力したパスワードが間違っています。…」 | Password に渡した文字が違う |
大文字と小文字を含めて見直す |
Set を忘れると、ブックは開いたまま止まる
Set なしで wb = Workbooks.Open(…) と書いて実行すると、エラー 91 で止まりました。このとき開いているブックの数を数えると、1つから2つに増えていました。つまり、ファイルは開いたのに、変数に入れるところで失敗しています。止まったあとにもう一度動かす前に、開いたままのブックを閉じてください。エラー 91 のほかの原因は、次の記事にまとめています。

同じ名前のブックは、フォルダが違っても2つ開けない
エクセルは、同じ名前のブックを同時に2つ開けません。実機で、C:\data\売上.xlsx を開いたまま C:\data\別フォルダ\売上.xlsx を開こうとしたところ(確認メッセージを出さない設定で実行)、エラー番号は出ないまま、2つ目は開かれず、変数は空(Nothing)のままでした。そのまま wb.Worksheets(1) と進めば、そこでエラー 91 になります。
一方、まったく同じファイルをもう一度開いたときは、エラーにならず、ブックの数も増えず、すでに開いているブックがそのまま返ってきました。こちらは、マクロの最後で閉じると、使う人が開いていたブックまで閉じてしまう点に注意が要ります。どちらも、開く前に次の関数で確かめれば防げます。
Function IsBookOpen(bookName As String) As Boolean
Dim wb As Workbook
For Each wb In Workbooks
If LCase(wb.Name) = LCase(bookName) Then
IsBookOpen = True
Exit Function
End If
Next wb
End Function
実機では、開く前は False、開いているあいだは True("売上.XLSX" と大文字で渡しても True)、閉じたあとは False が返りました。
CSV を開くと、先頭の 0 が消える
Workbooks.Open は CSV も開けます。ただし、社員番号 00123 が入った CSV を実機で開くと、セルの値は数値の 123 になっていました。エクセルで CSV をダブルクリックしたときと同じことが起きます。先頭の 0 を残す方法は、次の記事を見てください。

ここに無いメッセージで 1004 が出たときは、原因が「開く」以外にあることが多いです。次の記事で切り分けてください。

コピペ用|確かめてから開いて、必ず閉じるテンプレート
ここまでの内容を1つにまとめた形です。上の IsBookOpen と同じモジュールに貼って使います。同じフォルダの「売上.xlsx」を読み取り専用で開き、B2 の値を自分のブックの A1 に写して閉じます。
Sub OpenSafely()
Dim p As String
Dim wb As Workbook
Dim msg As String
p = ThisWorkbook.Path & "\売上.xlsx"
If Dir(p) = "" Then
MsgBox "ファイルが見つかりません:" & p
Exit Sub
End If
If IsBookOpen(Dir(p)) Then
MsgBox "同じ名前のブックが開いています。閉じてから実行してください"
Exit Sub
End If
On Error GoTo ErrHandler
Application.ScreenUpdating = False
Set wb = Workbooks.Open(Filename:=p, ReadOnly:=True)
ThisWorkbook.Worksheets(1).Range("A1").Value = wb.Worksheets(1).Range("B2").Value
wb.Close SaveChanges:=False
Application.ScreenUpdating = True
MsgBox "取り込みが終わりました"
Exit Sub
ErrHandler:
msg = Err.Description
Application.ScreenUpdating = True
If Not wb Is Nothing Then wb.Close SaveChanges:=False
MsgBox "開けませんでした:" & msg
End Sub
実機では、通常は「取り込みが終わりました」と出て、自分のブックの A1 に 1234(売上.xlsx の B2 の値)が入りました。別のフォルダの「売上.xlsx」を先に開いておくと、「同じ名前のブックが開いています。閉じてから実行してください」と出て、何も開かずに終わりました。
エラーが起きたときの行(ErrHandler: の下)では、最初に Err.Description を変数に取っておくのがコツです。先にほかの命令を動かすと、メッセージの中身が消えることがあります。
エラーの文が読めないときは、AIにコードごと見てもらう
ここまでの手順で、たいていは自分で直せます。それでも止まった行の意味がわからないときは、チャット型のAIに読ませると早く済みます(2026年11月12日に確認した使い方です。現時点ではこの手順で使えますが、画面や名前は変わることがあります)。
- 止まったときの画面で[デバッグ]を押し、黄色くなった行を確かめます
- そのマクロ(
SubからEnd Subまで)をコピーします - ChatGPT や Claude のチャット画面を開き、次のように、コードとエラーの文と黄色い行を貼って送ります
Excel VBA で、ファイルを開くマクロが止まります。
エラー:実行時エラー '1004' 申し訳ございません。…が見つかりません。
黄色くなった行:Set wb = Workbooks.Open(p)
(ここにマクロを貼る)
原因として考えられることを多い順に3つと、
それぞれの確かめ方を教えてください。
返ってきた直し方は、必ずコピーしたブックで動かして確かめてください。AIの答えが正しいかどうかは、エクセルで動かした結果で決まります。また、フォルダの名前に取引先名や個人名が入っているときは、C:\data\ のような仮の名前に書き換えてから貼ると安心です。
会社の Excel に Copilot のボタンがあるかどうかは、契約や会社の設定しだいです。無料で使える範囲と職場向けの違いは、次の記事で整理しています。

よくある質問(FAQ)
Q. 開いたブックを、保存して閉じるにはどう書きますか?
wb.Close SaveChanges:=True と書きます。保存しないなら False です。公式リファレンスには、True を指定すると変更がブックに保存されると書かれています。人がいないあいだに回すマクロでは、省略せずに True か False をはっきり書いておくと、どちらになるかで迷いません。
Q. Workbooks.Open と GetOpenFilename は、どう違いますか?
Workbooks.Open は実際にファイルを開く命令、GetOpenFilename はファイルを選ぶ画面を出して、場所を文字で返すだけの命令です。選ばせてから開くときは、2つを続けて使います。
Q. マクロで開いたブックに入っているマクロは、動きますか?
公式リファレンスには、プログラムからブックを開くときは、既定ではマクロが有効になると書かれています。中身を確かめていないファイルを、マクロでまとめて開く使い方は避けてください。
Q. 複数のファイルを、まとめて選ばせることはできますか?
公式リファレンスによると、GetOpenFilename の MultiSelect を True にすると、複数選べるようになり、選んだファイルの名前が配列で返ります。本記事では、1つだけ選ぶ形を実機で確かめています。
まとめ
- 開く基本は
Set wb = Workbooks.Open(場所)。あとはwb.から書く - 場所は
ThisWorkbook.Pathで作ると、フォルダを動かしても直さずに済む - 開く前に
Dirで「ある?」、IsBookOpenで「もう開いていない?」を確かめる GetOpenFilenameはVariantで受ける。Stringだとキャンセルで「False.xlsx」を探しに行く- 見るだけなら
ReadOnly:=True、終わったらwb.Close SaveChanges:=False
まずは基本の形を、コピーしたブックで1回動かしてみてください。開いて、読んで、閉じる。この形が1つ動けば、毎月の「ファイルを開いて貼る」作業は、もうあなたの手を離れはじめています。
次に読む


出典(2026年11月12日 確認)
Workbooks.Open メソッド (Excel)|Microsoft Learn
https://learn.microsoft.com/ja-jp/office/vba/api/excel.workbooks.open
Application.GetOpenFilename メソッド (Excel)|Microsoft Learn
https://learn.microsoft.com/ja-jp/office/vba/api/excel.application.getopenfilename
Dir 関数|Microsoft Learn
https://learn.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/dir-function
Workbook.Close メソッド (Excel)|Microsoft Learn
https://learn.microsoft.com/ja-jp/office/vba/api/excel.workbook.close


コメント