Excelマクロ実行時エラー76「パスが見つかりません」の根本原因と完璧な対処法

Excel VBAでファイルを特定のフォルダに保存したり、新しいフォルダを作成したり、ネットワーク上のフォルダからデータを読み込もうとした際、「実行時エラー ’76’: パスが見つかりません(Path not found)」というメッセージが表示されてマクロが止まってしまったことはないでしょうか。

このエラーは、「実行時エラー53(ファイルが見つかりません)」と非常に似ていますが、明確な違いがあります。エラー53が「指定した場所に目的のファイルがない」ことを示すのに対し、エラー76は「目的のファイルにたどり着くまでの『道筋(フォルダ・ディレクトリ)』自体が存在しない、またはアクセスできない」ことを意味します。

例えば、「C:\Sales\2024\Report.xlsx」というファイルを作ろうとした時、「C:\Sales\2024」というフォルダがそもそもパソコン内に存在していなければ、VBAはファイルを保存する場所を見つけられずにエラー76を返します。

本記事では、システム開発の実務で頻繁に発生する「実行時エラー76」のあらゆる原因を体系的に解説し、マクロを強制終了させないための「フォルダ存在チェック(Dir関数・FSO)」の正しい書き方、さらには「フォルダが存在しない場合は自動で作成する」実用的なVBAコードまでを、4000文字以上のボリュームで徹底的に解説します。この記事を読めば、VBAにおけるパス操作のトラブルを完全に克服できます。

目次

1. 実行時エラー76「パスが見つかりません」とは何か?

VBAの「実行時エラー ’76’: パスが見つかりません」は、プログラムが要求したドライブやディレクトリ(フォルダ)の階層構造がシステム上に見当たらない場合に発生するエラーです。

このエラーは、主に以下のようなVBAステートメントや関数を実行した瞬間に発生します。

  • MkDir ステートメント(新しいフォルダを作成する時)
  • ChDir / ChDrive ステートメント(カレントディレクトリやドライブを変更する時)
  • Open ステートメント(存在しないフォルダ内にファイルを作成・保存しようとした時)
  • FileCopy ステートメント(コピー先のフォルダが存在しない時)
  • FileSystemObject (FSO)CopyFileMoveFileGetFolder などの操作

システムは指定された文字列(パス)を先頭のドライブ文字(C:\など)から順番にたどって目的の場所にアクセスしようとしますが、その途中の階層が1つでも欠けていると、その先へ進めずにエラー76をスローします。

2. エラー76が発生する6つの主要な原因

フォルダが見つからない原因は、単なるスペルミスからWindowsのシステム仕様まで多岐にわたります。以下の6つの原因から該当するものがないか確認してください。

原因1:フォルダ名のスペルミス・存在しないフォルダを指定している

最も基本的な原因です。「C:\Data\Sales」を指定したつもりが、実際のフォルダ名が「Sale」だった場合など、1文字でも間違っているとパスが見つかりません。また、昨年まで動いていたマクロで「C:\Data\2023」がハードコーディング(直書き)されており、年が変わって「2024」フォルダがまだ作られていないのにアクセスしようとしたケースも頻発します。

原因2:MkDirで「複数階層のフォルダ」を一気に作成しようとしている

VBAの組み込みステートメントである MkDir(Make Directory)は、一度に1つの階層しかフォルダを作成できないという仕様があります。
例えば、「C:\Test」というフォルダが存在しない状態で、いきなり MkDir "C:\Test\SubFolder" を実行すると、親フォルダである「Test」がないためエラー76が発生します。深い階層を作る場合は、上の階層から順番に1つずつ作成する必要があります。

原因3:ネットワークドライブの切断・VPN未接続

社内のファイルサーバー(NASや共有サーバー)のパス(「\\Server\Shared」や「Z:\Data」など)を指定している場合、マクロ実行者のパソコンがそのネットワークに接続されていない、VPNが切れている、あるいはネットワークドライブの割り当てが解除されていると、パスにたどり着けずエラー76になります。

原因4:OneDrive/SharePointによるパスのURL化

最近のMicrosoft 365環境において激増している原因です。ThisWorkbook.Path で取得したパスがOneDrive等のクラウド上にあると、ローカルパス(C:\Users…)ではなくURL形式(https://d.docs.live.net/…)になります。VBAの旧来のステートメントは「https://」から始まるインターネットパスを解釈できないため、「そのようなドライブ(パス)は見つかりません」としてエラー76やエラー52を引き起こします。

原因5:パスの文字列が長すぎる(260文字制限)

Windowsの旧来のシステム仕様(MAX_PATH)により、ドライブ文字からファイル名・拡張子に至るまでの絶対パスの長さが半角259文字(一部環境では260文字)を超えると、システムがパスを正しく認識できなくなり、エラー76が発生することがあります。フォルダの階層が深すぎる、またはフォルダ名が長すぎる場合に起こります。

原因6:パスの末尾の「\(バックスラッシュ)」の付け忘れや重複

変数を使ってパスを文字列結合で組み立てる際、区切り文字である「\(円マーク / バックスラッシュ)」が抜けてしまい「C:\DataReport.xlsx」(Dataフォルダの中ではなくCドライブ直下を探している)になっていたり、逆に「C:\Data\\Report.xlsx」のように重複して不正なパスになっていたりするケースです。

3. エラーが発生した「真のパス」を特定するデバッグ手順

エラー76が出た場合、コードを眺めているだけでは原因に気づけないことが多々あります。VBAが「最終的に組み立てた文字列(パス)がどうなっているか」を確認することが解決の第一歩です。

  1. エラーダイアログが出たら「デバッグ」ボタンを押します。
  2. 黄色くハイライトされた行にある、パスが格納された「変数」をドラッグして選択します。
  3. キーボードの Ctrl + G を押して「イミディエイト ウィンドウ」を表示します。
  4. イミディエイトウィンドウに ? 変数名 と入力してEnterキーを押します。(例:? targetFolderPath
  5. 出力された文字列をコピーし、Windowsの「エクスプローラー」の上部にあるアドレスバーに貼り付けてEnterキーを押します。

エクスプローラーでも「見つかりません」というエラーが出た場合、その文字列(パス)は物理的に存在していません。出力された文字列を注意深く観察し、スペルミスや「\」の抜けがないか確認してください。

4. 【VBAコード】Dir関数を使ったフォルダ存在チェック

エラーでマクロが強制終了するのを防ぐためには、パスにアクセスする前に「そのフォルダが本当に存在するかどうか」をチェックする処理を挟む必要があります。

最も手軽な方法は、VBAの組み込み関数である Dir 関数を利用する方法です。Dir関数は通常ファイルの存在確認に使われますが、第二引数に vbDirectory を指定することで、フォルダの存在確認にも使えます。

Sub CheckFolderWithDir()
    Dim targetPath As String
    targetPath = "C:\Data\ReportFolder"

    ' Dir関数でフォルダの存在を確認する
    ' パスが存在し、かつそれがフォルダ(vbDirectory)であるかを判定
    If Dir(targetPath, vbDirectory) = "" Then
        ' 空文字が返ってきた場合は存在しない
        MsgBox "指定されたフォルダが見つかりません。" & vbCrLf & _
               targetPath, vbExclamation, "エラー"
        Exit Sub ' 処理を中断
    End If

    ' 存在する場合の処理
    MsgBox "フォルダは正常に存在しています。", vbInformation
End Sub

この方法は手軽ですが、対象がフォルダではなく「同名のファイル」であった場合でも存在すると判定してしまう(厳密性に欠ける)という弱点があります。

5. 【VBAコード】FileSystemObject(FSO)を使ったフォルダ存在チェック(推奨)

実務のシステム開発で最も推奨されるのが、外部ライブラリである FileSystemObject (FSO) を使用する方法です。FSOにはフォルダの存在をピンポイントで判定する FolderExists メソッドが用意されており、非常に確実かつ高速に動作します。

Sub CheckFolderWithFSO()
    Dim fso As Object
    Dim targetPath As String

    targetPath = "C:\Data\ReportFolder"

    ' FileSystemObjectのインスタンスを作成
    Set fso = CreateObject("Scripting.FileSystemObject")

    ' FolderExistsメソッドでフォルダの存在をチェック
    If fso.FolderExists(targetPath) = False Then
        MsgBox "指定されたフォルダが見つかりません。" & vbCrLf & _
               targetPath, vbCritical, "エラー"
        Set fso = Nothing
        Exit Sub ' 処理を中断
    End If

    ' 存在する場合の処理
    MsgBox "フォルダは正常に存在しています。", vbInformation

    ' メモリ解放
    Set fso = Nothing
End Sub

FSOを使うことで、直感的なコードになり、後続のファイルコピーやファイル一覧の取得処理にもそのままFSOのオブジェクトを使い回せるという大きなメリットがあります。

6. エラー76を防ぐ!フォルダがない場合は自動作成するテクニック

実務において「フォルダが存在しなければエラーで終了する」仕組みは、利用者にとって不便です。「年次・月次フォルダが存在しない場合は、VBAが気を利かせて自動で作成し、そこに保存する」という処理を組み込むのがプロの定石です。

単一階層のフォルダを自動作成するコード

FSOの CreateFolder メソッドを組み合わせた実用的なコードです。

Sub AutoCreateFolder()
    Dim fso As Object
    Dim targetPath As String

    ' 作成したいフォルダのパス(親の C:\Data は存在している前提)
    targetPath = "C:\Data\2024_Sales"

    Set fso = CreateObject("Scripting.FileSystemObject")

    ' フォルダが存在しない場合のみ作成処理を行う
    If Not fso.FolderExists(targetPath) Then
        fso.CreateFolder targetPath
        ' (テスト用)作成したことを通知
        ' MsgBox "フォルダを新規作成しました。", vbInformation
    End If

    ' この時点で必ずフォルダが存在する状態になるため、エラー76は発生しない
    ' (ここにファイルの保存処理などを記述する)

    Set fso = Nothing
End Sub

【上級編】複数階層の深いフォルダを一気に作成する関数

前述の通り、「C:\Data\2024\04\Sales」のように、途中の「2024」も「04」も存在しない状態で一気に深いフォルダを作ろうとするとエラー76になります。
これを解決するためには、パスを「\」で分割し、上の階層から順番に存在チェックと作成を繰り返す関数(サブプロシージャ)を用意します。

' 複数階層のフォルダを一括作成する汎用プロシージャ
Sub MakeDeepFolder(ByVal strPath As String)
    Dim fso As Object
    Dim pathArray() As String
    Dim buildPath As String
    Dim i As Integer

    Set fso = CreateObject("Scripting.FileSystemObject")

    ' パスを "\" で分割して配列に格納
    pathArray = Split(strPath, "\")

    ' ドライブ文字(C:など)を初期値としてセット
    buildPath = pathArray(0)

    ' 第2階層から順番に結合しながらフォルダを確認・作成する
    For i = 1 To UBound(pathArray)
        buildPath = buildPath & "\" & pathArray(i)

        ' フォルダが存在しなければ作成する
        If Not fso.FolderExists(buildPath) Then
            fso.CreateFolder buildPath
        End If
    Next i

    Set fso = Nothing
End Sub

' --- 呼び出し例 ---
Sub TestDeepFolder()
    ' 途中のフォルダが全くなくても、全て自動で作成されます
    Call MakeDeepFolder("C:\Data\2024\04\Sales\Reports")
    MsgBox "深い階層のフォルダ作成が完了しました。"
End Sub

この MakeDeepFolder プロシージャをモジュール内に置いておけば、どのような深いパスが来ても絶対にエラー76を発生させることなく、目的の保存場所を準備することができます。

7. OneDriveやSharePoint環境での「URL化」によるエラー76

エラー76が発生する現代ならではの原因が、OneDriveやSharePointによる「パスのURL化」です。

マクロが記述されているファイルがOneDriveに保存されている場合、ThisWorkbook.Path を実行すると、「C:\Users\ユーザー名\OneDrive…」ではなく、「https://d.docs.live.net/…」というURLが返ってきます。

VBAの MkDir や FSOの FolderExists などは、ローカルPCのファイルシステムを操作するためのコマンドであるため、「https://」から始まるパスを渡されると「そのようなパス(道筋)は見つかりません」と判断し、エラー76(操作によってはエラー52)を出力します。

【対処法】
この問題を回避するには、Windowsの環境変数である Environ("OneDrive")Environ("OneDriveCommercial") を利用して、URL形式のパスの先頭部分をローカル環境の絶対パス(C:\Users\〜)に置換(変換)する関数を作成し、VBAに渡す文字列を常にローカルパスにしておく必要があります。

※手っ取り早い回避策としては、Excelファイルを一時的にOneDriveの同期対象外のフォルダ(デスクトップではなくCドライブ直下など)に移動してからマクロを実行することで、パスのURL化を防ぎ、正常に動作させることができます。

8. よくある質問(FAQ)

Q1. ファイルが存在するかチェックしたいのですが、どうすればいいですか?

フォルダではなくファイルの存在を確認したい場合は、FSOの FileExists メソッドを使用します。
If fso.FileExists("C:\Data\Report.xlsx") = False Then のように記述することで、指定したファイルがそこにあるかどうかを正確に判定できます。

Q2. 変数を使ってパスを結合する際の良い書き方はありますか?

変数同士を結合してパスを作る際、「\」が重複したり抜けたりするミスを防ぐため、FSOの BuildPath メソッドを使うのが最も安全です。
targetPath = fso.BuildPath("C:\Data", "Report.xlsx") と書くと、自動的に「C:\Data\Report.xlsx」という正しい形式に整形してくれます。

Q3. ネットワークドライブでエラー76が出ます。どうすればいいですか?

「Z:\」などのネットワークドライブ文字は、Windowsを起動した直後やVPN接続直後は、一度エクスプローラーでそのドライブを開いてアクセスを確立(認証)しないと、VBAから認識されない(エラー76になる)ことがあります。ドライブ文字ではなく、「\\ServerName\SharedFolder」のようなUNCパス(絶対パス)で指定すると、より安定してアクセスできるようになります。

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

実行時エラー ’76’「パスが見つかりません」は、目的のファイルに到達するまでのフォルダ構造が存在しない、またはアクセスできない場合に発生するエラーです。

トラブルが発生した際は、以下のチェックリストに従って原因を特定・解消してください。

  • イミディエイトウィンドウを使って、変数が組み立てた「最終的なパス」を出力し、エクスプローラーで開けるか確認したか?
  • フォルダ名にスペルミスや全角・半角の違いはないか?
  • 文字列結合の際に、区切り文字の「\」が抜けていないか、重複していないか?
  • MkDir で、存在しない親フォルダの下にいきなり子フォルダを作ろうとしていないか?
  • ネットワークの接続やVPNは正常か?(UNCパスでの指定を検討)
  • OneDriveによってパスが「https://」から始まるURLになっていないか?

実務でマクロを運用する場合、環境の違いによって「フォルダが存在しない」ことは日常茶飯事です。本記事で紹介した「FSOを用いたFolderExistsによる存在チェック」「存在しない場合の自動作成処理」をコードに組み込むことで、エラーによる業務停止を防ぎ、堅牢で利用者に優しいマクロを構築することができます。