Excel VBAでファイルを開く、コピーする、削除するなどの操作を自動化するマクロを実行した際、突然「実行時エラー ’53’: ファイルが見つかりません」というメッセージが表示されて処理が止まってしまった経験はないでしょうか。

昨日までは正常に動いていたマクロで突然エラーが出たり、他の人から共有されたマクロを自分のパソコンで動かそうとした瞬間に発生したりと、このエラーは実務の現場で非常に頻繁に遭遇するトラブルの一つです。

エラーメッセージ自体は「指定された場所にファイルがない」という単純な事実を伝えていますが、「エクスプローラーで見ると確かにファイルはそこにあるのに、なぜVBAからは見つからないと判定されるのか?」と頭を悩ませるケースが後を絶ちません。

本記事では、Microsoft公式リファレンスおよびシステム開発の現場で蓄積された知見に基づき、実行時エラー53が発生する根本的な原因と、見落としがちなパス指定の罠、そしてエラーを未然に防ぐための堅牢なVBAコードの書き方を徹底解説します。この記事の確認手順に従えば、ファイルが見つからない原因を確実に特定し、修正することができます。

目次

1. 実行時エラー53「ファイルが見つかりません」とは?

実行時エラー53は、VBAのプログラム実行中に「指定されたファイル名やパス(保存場所)に、目的のファイルが存在しない」とVBAのシステムが判断したときに発生するコンパイル済みエラーです。

このエラーは、主に以下のようなファイル操作を行うステートメント(命令)や関数を実行した瞬間に発生します。

  • Open ステートメント(テキストファイルなどを読み書きのために開く)
  • FileCopy ステートメント(ファイルをコピーする)
  • Kill ステートメント(ファイルを削除する)
  • Name ステートメント(ファイル名を変更する、移動する)
  • GetAttr 関数(ファイルの属性を取得する)
  • FileSystemObject (FSO) のファイル操作メソッド群
  • Workbooks.Open (※Excelブックを開く場合はエラー1004になることが多いですが、関連処理で53が出る場合があります)

ファイルが実在しているように見えてもVBAから「見つからない」と言われる場合、私たちが目で見ているファイル名・パスと、VBAが認識しているファイル名・パスの間に何らかのズレ(認識の不一致)が生じていることがすべての原因です。

2. エラー53が発生する5つの主な原因

VBAがファイルを見つけられない理由は、大きく分けて以下の5つのパターンに分類されます。ご自身のコードがどれに該当するかを確認してください。

原因1:ファイル名やフォルダ名のスペルミス・拡張子抜け

最も単純かつ多い原因です。フォルダ名やファイル名に1文字でも誤りがあると、当然システムは別物と判断します。
特に多いのが「拡張子(.xlsx, .csv, .txtなど)の指定忘れ」です。Windowsの初期設定では拡張子が非表示になっているため、ファイル名が「売上データ」だと勘違いしてコードに "C:\Data\売上データ" と書いてしまうミスが頻発します。VBAでは拡張子まで正確に指定する必要があります。

原因2:カレントディレクトリのズレ(相対パスの罠)

VBAでは、ドライブ文字(C:\など)から始まる「絶対パス」の代わりに、ファイル名だけを指定する書き方ができます。この場合、VBAは「カレントディレクトリ(現在操作の起点となっているフォルダ)」の中を探しに行きます。
しかし、カレントディレクトリはExcelのショートカットの起動場所や、直前に「ファイルを開くダイアログ」でユーザーが開いたフォルダによって動的に変わってしまいます。自分が意図したフォルダの中を探してくれていないためにエラーになります。

原因3:ネットワークドライブの切断やアクセス権限がない

社内のファイルサーバー(NASなど)や「Zドライブ」などのネットワークドライブを指定している場合、マクロ実行時にそのドライブへの接続が切れている、あるいはVPN接続が確立されていないとファイルにアクセスできずエラー53となります。また、該当フォルダへの読み取り権限が付与されていない場合も同様です。

原因4:OneDriveやSharePointによる「パスのURL化」

最近のMicrosoft 365環境で急増している原因です。ThisWorkbook.Path を使ってパスを取得している場合、ファイルがOneDriveと同期されていると、取得されるパスが「C:\Users\…」というローカルパスではなく、「https://d.docs.live.net/…」というURL形式になってしまいます。VBAの OpenFileCopy はURL形式のパスを理解できないため、エラー53やエラー52を引き起こします。

原因5:変数の内容が空(Empty)になっている

ファイルパスを文字列型の変数に格納して処理している場合、処理の途中で変数が空("")になってしまっているケースです。空白のパスを探しに行くため「ファイルが見つかりません」となります。

3. エラー箇所とパス指定のズレを素早く特定する確認手順

エラーが発生した際は、VBAが「実際にどの文字列(パス)を探しに行っているのか」を可視化することが解決への最短ルートです。

ステップ1:デバッグモードに入る

エラーダイアログが表示されたら、必ず「デバッグ」ボタンをクリックしてください。VBE(Visual Basic Editor)が開き、エラーで停止した行が黄色くハイライトされます。

ステップ2:変数の中身をマウスホバーで確認する

黄色くハイライトされた行に記述されている「ファイルパスが格納された変数」の上にマウスカーソルを乗せて、2〜3秒待ちます。すると、ツールチップで現在変数に入っている実際のパス文字列(例:strPath = "C:\Data\Report.csv")が表示されます。この文字列にスペルミスがないか確認します。

ステップ3:イミディエイトウィンドウでパスを出力する

パスが長くて見づらい場合は、VBEの画面下部にある「イミディエイト ウィンドウ」(表示されていない場合は Ctrl + G で表示)を使います。
イミディエイトウィンドウに ? 変数名 (例:? strPath)と入力してEnterキーを押します。出力されたパス文字列をコピーし、Windowsの「エクスプローラー」のアドレスバーに貼り付けてEnterキーを押してみてください。

  • ファイルが開けば、VBAの書き方やOneDrive等のシステム側に問題があります。
  • 「見つかりません」と出れば、パスの文字列そのものが間違っています。

4. 【VBAコード付き】エラーを回避・解決する正しいパス指定と対処法

原因が特定できたら、コードを修正します。ここでは、エラー53を未然に防ぐための「堅牢なVBAプログラムの書き方」を解説します。

対処法1:相対パスをやめて「絶対パス」または「ThisWorkbook.Path」を使う

ファイル名だけの指定(相対パス)は非常に危険です。常に起点を明確にするため、マクロが記述されているファイルと同じフォルダにあるファイルを指定する場合は、ThisWorkbook.Path を使用して絶対パスを動的に組み立てるのがベストプラクティスです。

Sub ReadDataFile()
    Dim targetPath As String

    ' NG例(カレントディレクトリに依存するためエラーになりやすい)
    ' targetPath = "data.csv"

    ' OK例(マクロブックと同じフォルダ内のdata.csvを絶対パスで指定)
    targetPath = ThisWorkbook.Path & "\data.csv"

    ' この後、ファイルを開く処理などを行う
    Debug.Print targetPath
End Sub

対処法2:処理の前にDir関数で「ファイルの存在チェック」を行う

ファイル操作を行う前には、必ず Dir 関数を使用して「ファイルが本当に存在するかどうか」を確認するIF文を記述してください。これにより、エラー53でマクロが強制終了するのを防ぎ、ユーザーに分かりやすいメッセージを出すことができます。

Sub CopyTargetFile()
    Dim sourcePath As String
    Dim destPath As String

    sourcePath = "C:\Work\Report.xlsx"
    destPath = "C:\Backup\Report_Backup.xlsx"

    ' Dir関数でファイルの存在を確認(見つからない場合は空文字""が返る)
    If Dir(sourcePath) = "" Then
        MsgBox "コピー元のファイルが見つかりません。" & vbCrLf & _
               "パス:" & sourcePath, vbExclamation, "エラー"
        Exit Sub ' 処理を中断する
    End If

    ' ファイルが存在する場合のみコピー処理を実行
    FileCopy sourcePath, destPath
    MsgBox "バックアップが完了しました。", vbInformation
End Sub

対処法3:ファイル選択ダイアログを使ってユーザーに選ばせる

パスの打ち間違いを防ぐ究極の方法は、パスをコードに直接書く(ハードコーディングする)のをやめ、実行時にユーザーにファイルを選択させることです。Application.GetOpenFilename を使用します。

Sub SelectAndProcessFile()
    Dim selectedFile As Variant

    ' ファイル選択ダイアログを表示(CSVファイルのみに絞る例)
    selectedFile = Application.GetOpenFilename("CSVファイル (*.csv), *.csv", , "処理するファイルを選択してください")

    ' キャンセルボタンが押された場合の処理
    If selectedFile = False Then
        MsgBox "処理がキャンセルされました。", vbInformation
        Exit Sub
    End If

    ' 選択されたパス(selectedFile)を使用して処理を行う
    MsgBox "選択されたファイル:" & selectedFile
End Sub

5. OneDriveやSharePoint環境での「パスのURL化」問題

前述の ThisWorkbook.Path を使用した安全な記述であっても、現在のMicrosoft 365環境では罠に陥ることがあります。

ファイルがOneDriveフォルダ内に保存されている場合、ThisWorkbook.Pathhttps://d.docs.live.net/〜 というURLを返します。VBAの Dir 関数や Open ステートメントにこのURLを渡すと、「実行時エラー52」や「実行時エラー53」が発生してしまいます。

【解決策】
この問題を回避するには、環境変数 Environ("OneDrive") を利用して、URL形式のパスをWindowsのローカルパス(C:\Users\ユーザー名\OneDrive…)に変換する独自の関数を通す必要があります。(パス変換の詳細な関数コードについては、別途「OneDriveのURL化に対処するVBAコード」の記事をご参照ください。)

一時的な回避策としては、Excelの「ファイル」>「オプション」>「保存」から、「既定でコンピューターに保存する」にチェックを入れ、OneDriveの同期フォルダ外(Cドライブの直下やローカルのマイドキュメントなど)にファイルを移動してから実行することでエラーを解消できます。

6. 【高度な原因】Mac環境での実行や外部DLL呼び出し時のエラー53

通常のファイル操作以外で「実行時エラー53」が発生する特殊なケースとして、以下の2つがあります。心当たりがある場合は確認してください。

外部DLL呼び出し(Declareステートメント)のエラー

VBAではWindowsのシステム機能を利用するために Declare Function ... Lib "○○.dll" という記述で外部のDLLファイルを呼び出すことができます。この際、指定したDLLファイルがシステム内に存在しない、あるいは32bit版と64bit版のExcelのアーキテクチャの違いによりDLLが読み込めない場合に「実行時エラー ’53’: ファイルが見つかりません」が発生します。

【対処法】 PtrSafeキーワードを使った64bit対応のAPI宣言に書き換えるか、呼び出しているDLLが現在のOSに存在するか(System32フォルダ等)を確認してください。

Mac版Excelでの「MacScript」関数の廃止

古いVBAコードをMac版のExcelで実行しようとした際、AppleScriptを実行するための MacScript 関数が使われているとエラー53になります。Mac版のOffice 2016以降、セキュリティの強化(サンドボックス化)により MacScript 関数は非推奨となり、正しく動作しなくなりました。

【対処法】 Mac環境で外部スクリプトを実行する場合は、新しい AppleScriptTask コマンドにコードを書き換える必要があります。

7. よくある質問(FAQ)

Q1. エクスプローラーのアドレスバーからパスをコピーしたのにエラーになります。

エクスプローラーのアドレスバーからコピーできるのは「フォルダのパス」までです。VBAでファイルを操作するには、その末尾に「\(バックスラッシュ)」と「ファイル名」および「拡張子」を結合する必要があります。
例:コピーしたパスが C:\Data の場合、VBAには "C:\Data\Report.xlsx" と記述する必要があります。

Q2. WindowsとMacの両方で動くようにパスを書くにはどうすればいいですか?

Windowsのパス区切り文字は「\(バックスラッシュまたは円マーク)」ですが、Macのパス区切り文字は「:(コロン)」や「/(スラッシュ)」です。両方で動作させるには、Application.PathSeparator を使用して区切り文字を動的に取得して結合します。
例:targetPath = ThisWorkbook.Path & Application.PathSeparator & "data.csv"

Q3. FSO (FileSystemObject) のFileExistsを使うのとDir関数はどちらが良いですか?

どちらもファイルの存在確認に使えますが、FSOの方が高度な機能を持っています。単純な存在確認だけであれば、組み込み関数で動作が軽く、参照設定も不要な Dir 関数がお勧めです。フォルダ内の全ファイルを取得したり、ファイルの日付を取得したりするなど、複雑な操作を伴う場合はFSOの利用を推奨します。

8. まとめと解決チェックリスト

実行時エラー ’53’「ファイルが見つかりません」は、VBAが認識しているパスと、実際のファイルの場所にズレがあることを示すエラーです。解決のためには、エラーが出た行で止まった状態(デバッグモード)を利用し、変数の内容を正確に把握することが最も重要です。

トラブルが発生した際は、以下のチェックリストを順番に確認してください。

  • ファイル名のスペルは合っているか?
  • 拡張子(.xlsx, .csvなど)の書き忘れはないか?
  • 相対パス(ファイル名のみ)での指定をしていないか?(ThisWorkbook.Pathを使う)
  • 変数の文字列と実際のファイルパスをイミディエイトウィンドウで比較したか?
  • ネットワークドライブの接続は切れていないか?
  • OneDriveによるURL化(https://…)の影響を受けていないか?
  • 処理の前に Dir関数 でファイルの存在確認をするIF文を実装しているか?

これらのポイントを押さえてコードを修正することで、エラー53でマクロが予期せぬ停止をすることはなくなります。特に、Dir関数を用いた存在確認や、ファイル選択ダイアログの活用は、利用者に優しいマクロを作る上で必須のテクニックですので、ぜひご自身のプログラムに取り入れてみてください。