PR
アフィリエイト広告を利用しています
アフィリエイト広告を利用しています

【コピペOK】VBAでファイル(ブック)を開く方法|Workbooks.Open・ダイアログで選ぶ・フォルダ内を全部開く書き方と「開けない」原因5つ(実機確認)

VBAでファイルを開く。Dim wb As Workbook、Set wb = Workbooks.Open、wb.Close SaveChanges:=False の3行。書き方7つと開けない原因5つ EXCEL VBA講座
スポンサーリンク

【この記事について】本記事は 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つを、実機で出たメッセージつきでまとめます。

VBAでファイルを開く3つの形の図。1は場所を書いて Workbooks.Open、2は ThisWorkbook.Path で同じフォルダ、3は GetOpenFilename で選ばせて Variant で受ける。開く前に Dir でファイルの有無、For Each で同じ名前のブックが開いていないかを確かめる。実機ではファイルが無いと1004、キャンセルを String で受けると False.xlsx が見つかりませんの1004が出た

スポンサーリンク

まずはこれだけ|やりたいこと別の早見表

やりたいこと 書き方
場所が決まっているファイルを開く 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

マクロそのものが動かない(ボタンを押しても何も起きない、黄色い帯が出る)ときは、先に次の記事を見てください。

【動かない人へ】エクセルのマクロが実行できない原因7つと直し方|有効化・ブロック解除・xlsm保存
エクセルのマクロが実行できない原因は、ほとんど3つ。黄色いバーの「コンテンツの有効化」、赤いバー「セキュリティ リスク」のブロック解除、.xlsmでの保存です。症状別の早見表から、開発タブ・ボタン無反応・トラストセンター設定まで、7つの原因を手順つきで直します。

基本|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)があいまいな人は、次の記事が先です。

VBA 変数の宣言の書き方|Dim と型の選び方、Option Explicit と3つの落とし穴
VBA の変数の宣言は「Dim 名前 As 型」の1行。整数は Long、先頭に Option Explicit。Dim a, b As Long で a に型が付かない落とし穴、Set 忘れのエラー91、型違いのエラー13 を、実際に動かした結果つきで説明します。

マクロのブックと同じフォルダのファイルを開く

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 など、ループの書き方そのものは次の記事でまとめています。

【コピペOK】VBAのループ4種類の使い分け|For Next・For Each・Do While/Until・抜け方と無限ループの止め方(全コード実機確認)
VBAのループは、回数が決まっているならFor Next、セル範囲やシートを全部処理するならFor Each、どこで終わるか分からないならDo While/Do Until。While...Wendは覚えなくて大丈夫です。前判定と後判定の違い、Exit For/Exit Doでの抜け方、無限ループをEscキーで止める方法と防ぎ方まで、実機のExcelで全コードを動かして確かめました。

“*.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 のほかの原因は、次の記事にまとめています。

【止まらない】VBA「実行時エラー91」の原因7つと直し方|オブジェクト変数またはWithブロック変数が設定されていません
VBAで『実行時エラー91:オブジェクト変数またはWithブロック変数が設定されていません』が出て止まる原因を7つに整理。Set忘れ・Find・Withブロックなど、コピペで直せる修正コードつきで解説します。

同じ名前のブックは、フォルダが違っても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 を残す方法は、次の記事を見てください。

エクセルで0が消える原因7つと直し方|先頭の0・CSVを開くと消える・0が空白になる【実機で確認】
エクセルで0が消えるのは、Excelが数字を「数値」として受け取り、先頭の0を落とすからです。0123を残すなら先頭に ' を付けて入力するのが最短。CSVを開くと消える、0000表示が数式で消える、0が空白に見える、小数の末尾の0が消えるまで、原因7つと直し方をMicrosoft 365のExcelで実際に試した結果つきで整理しました。

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

VBA「実行時エラー 1004」の原因7つと直し方|アプリケーション定義またはオブジェクト定義のエラー
VBAの「実行時エラー 1004(アプリケーション定義またはオブジェクト定義のエラー)」は、[デバッグ]で黄色く光る行を見れば原因が特定できます。シート名の指定ミス、閉じたブック、Range範囲、Select、保護、PasteSpecial、結合セルの7原因を、❌ダメな書き方→✅直した書き方のコピペ可VBAコード付きで解説します。

コピペ用|確かめてから開いて、必ず閉じるテンプレート

ここまでの内容を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日に確認した使い方です。現時点ではこの手順で使えますが、画面や名前は変わることがあります)。

  1. 止まったときの画面で[デバッグ]を押し、黄色くなった行を確かめます
  2. そのマクロ(Sub から End Sub まで)をコピーします
  3. ChatGPT や Claude のチャット画面を開き、次のように、コードとエラーの文と黄色い行を貼って送ります
Excel VBA で、ファイルを開くマクロが止まります。
エラー:実行時エラー '1004' 申し訳ございません。…が見つかりません。
黄色くなった行:Set wb = Workbooks.Open(p)
(ここにマクロを貼る)
原因として考えられることを多い順に3つと、
それぞれの確かめ方を教えてください。

返ってきた直し方は、必ずコピーしたブックで動かして確かめてください。AIの答えが正しいかどうかは、エクセルで動かした結果で決まります。また、フォルダの名前に取引先名や個人名が入っているときは、C:\data\ のような仮の名前に書き換えてから貼ると安心です。

会社の Excel に Copilot のボタンがあるかどうかは、契約や会社の設定しだいです。無料で使える範囲と職場向けの違いは、次の記事で整理しています。

Copilotは無料でどこまで使える?個人・職場の違いと有料プランとの差を公式情報で整理【2026年9月確認】
Copilotは無料でも使えますが、どこで何ができるかは立場で分かれます。個人の無料版、Personal・Family・Premiumの所有者、職場のCopilot Chat(追加料金なし)、有料のMicrosoft 365 Copilotの違いを、Microsoft公式ページの記載(2026年9月24日確認)をもとに整理します。

よくある質問(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つ動けば、毎月の「ファイルを開いて貼る」作業は、もうあなたの手を離れはじめています。

次に読む

【もう迷わない】VBAで最終行を取得する方法5つと使い分け|End(xlUp)が1を返す・途中の空白・UsedRangeのズレ
VBAで最終行を取るなら、まずは ws.Cells(ws.Rows.Count, 1).End(xlUp).Row の1行です。データ0件でも1が返る・シート指定の漏れ・基準列の空白・Integerのオーバーフローという4つのつまずきと、Find・UsedRange・CurrentRegionとの使い分けを、Microsoft公式ドキュメントをもとにまとめました。
VBAでシートをコピーする方法|Copy After・新しいブック・別ブックへの書き方と、非表示シートで名前を付け間違えない書き方【実機で確認】
VBAでシートをコピーするには Worksheets("ひな形").Copy After:=Worksheets(Worksheets.Count) の1行。前・新しいブック・別ブック・複数シートへのコピーと、実機で出たエラー6つの直し方を紹介。コピー元が非表示だと ActiveSheet.Name で別のシートの名前が変わる落とし穴と、それを防ぐ CopySheet 関数も実機で検証済み。

出典(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


当ブログは、Excel や VBA で手が止まった事務職のみなさんに、その場で直せる手順を届けたい思いで運営しています。
「記事が役に立った」「続きも読んでみたい」と感じていただけたら、下記リンクからのご利用・ご支援で応援してもらえると嬉しいです。

EXCEL VBA講座
スポンサーリンク
シェアする
メリ爺をフォローする

コメント

タイトルとURLをコピーしました