エラーの発生シナリオ
数ヶ月間完璧に動作していたマクロを想像してみてください。新しい四半期の初日に、突然「パスが見つかりません」というメッセージとともにクラッシュしました。これは通常、マクロがまだ作成されていないフォルダーにPDFを保存したりCSVをエクスポートしようとしたときに発生します。
Run-time error '76': Path not found
「デバッグ」ボタンを押すと、通常Excelは Open、SaveAs、FileCopy、または ChDir を含む行をハイライトします。コードが必ずしも壊れているわけではありません。単にドライブ上に存在しないディレクトリを探しているだけです。
なぜこのエラーが発生するのか
VBAは非常に忠実です。C:\Company\Invoices\2024\January\Inv_001.xlsx にファイルを保存するように指示した場合、そのチェーン内のすべてのフォルダーが事前に存在している必要があります。VBAはディレクトリツリーを自動的に構築してはくれません。サブフォルダーが1つでも欠けていると、処理は停止します。一般的な原因は以下の通りです:
- ハードコードされたユーザー名:
C:\Users\Sarah\Documentsのようなパスを使用していると、別のユーザーが自分のノートPCで同じマクロを実行しようとした瞬間に失敗します。 - 日付ベースのフォルダー: 月ごとに新しいフォルダーを作成するマクロ(例:「\2024\February\」)は、そのフォルダーを手動で作成していない場合、月の初日にクラッシュします。
- ネットワークの切断: 再起動後に再接続されていないネットワークドライブ(
Z:\など)が原因です。
クイック修正:手動での確認
コードを修正する前に、パスが実際にシステム上に存在するか確認してください。数秒で実行できます:
- VBAエディタでパス変数にマウスを合わせ、現在の値を確認します。
- フルパスをコピーします。ただし、末尾のファイル名は除外してください。
Win + Rを押し、ボックスにパスを貼り付けてEnterキーを押します。- Windowsがエラーを返した場合、ディレクトリ名が間違っているか、存在しないことが確認できます。
恒久的な対策1:保存前にフォルダーを確認する
保存を試みる前にフォルダーが存在するかチェックすることで、クラッシュを防ぎます。Dir 関数を使用するのが最も速い方法です。Dir が空の文字列を返す場合、そのパスは無効です。
Sub SaveReport()
Dim folderPath As String
folderPath = "C:\MonthlyExports\Reports\"
' 続行する前にフォルダーが存在するか確認する
If Dir(folderPath, vbDirectory) = "" Then
MsgBox "停止!フォルダーが見つかりません: " & folderPath, vbCritical
Exit Sub
End If
ActiveWorkbook.SaveAs folderPath & "Final_Report.xlsx"
End Sub
恒久的な対策2:不足しているフォルダーを自動的に作成する
賢いマクロは、フォルダーがないことに文句を言うだけでなく、それを作成します。MkDir コマンドを使用してディレクトリを構築できます。ただし、MkDir は一度に1つの階層しか作成できないため、親フォルダーが既に存在している必要があることに注意してください。
Sub SmartSave()
Dim targetPath As String
targetPath = "C:\Reports\" & Year(Date)
' フォルダーが存在しない場合は、年名のフォルダーを作成する
If Dir(targetPath, vbDirectory) = "" Then
MkDir targetPath
End If
ActiveWorkbook.ExportAsFixedFormat Type:=xlTypePDF, Filename:=targetPath & "\Export.pdf"
End Sub
恒久的な対策3:深い階層のフォルダーを構築する
C:\Archive\2024\Marketing\Project_A のような複雑なパスを作成する必要がある場合は、FileSystemObject (FSO) を使用します。これは標準のVBAコマンドよりもはるかに汎用性があります。まず、VBAエディタの ツール > 参照設定 で Microsoft Scripting Runtime にチェックを入れてください。
Sub CreateDeepPath()
Dim folderPath As String
folderPath = "C:\Database\Backups\Archive\" & Year(Date)
' ヘルパールーチンを使用してツリー全体を構築する
EnsurePathExists folderPath
ActiveWorkbook.SaveAs folderPath & "\Backup.xlsx"
End Sub
Sub EnsurePathExists(ByVal fullPath As String)
Dim fso As New FileSystemObject
Dim parts() As String
Dim currentPath As String
Dim i As Integer
parts = Split(fullPath, "\")
currentPath = parts(0)
For i = 1 To UBound(parts)
currentPath = currentPath & "\" & parts(i)
If Not fso.FolderExists(currentPath) Then
fso.CreateFolder currentPath
End If
Next i
End Sub
解決策のテスト
修正が完璧であることを確認するために、次のテストを試してください:ドライブから保存先フォルダーを削除してからマクロを実行します。修正が成功していれば、エラー 76 のポップアップが表示されることなく、フォルダーが自動的に再作成され、ファイルが保存されます。2回目に実行して、フォルダーが既に存在することをコードが正しく識別できるか確認してください。

