TL;DR —
RmDirはフォルダーを空のときにだけ削除します。まだファイルやサブフォルダーを 抱えたフォルダーに向けると、error 75を発生させます — 何も尋ねずにどんなファイルも削除するKillとはちょうど正反対です。「このフォルダーを削除する」は、実際には 「まず空にしてから取り除く」ことなのです。
Sub RemoveTempFolder()
RmDir "C:\Temp\Empty" ' C:\Temp\Empty の中に何もないときだけ動く
RmDir "C:\Temp\Reports" ' Reports がまだファイルやサブフォルダーを含むと error 75
End Sub
RmDir は Kill の鏡像です。Kill が確認も取り消しもなくファイルを切り刻むのに対して、RmDir は
反対の方向にうるさい — まだ何かを含むフォルダーには手を触れることを拒みます。その拒否は安全
機能です — いっぱいのフォルダーをうっかり消し去ることはできません — が、それは同時に、「このフォルダーと
中身をすべて削除する」という日常の要望が、ひとつのステートメントではないことを意味します。それは
小さなルーチンであり、その理由を知ることこそが、この記事の主題のすべてです。
この記事で学べること
- 考え方の軸 —
RmDirは空のフォルダーだけを取り除く。Killの正反対 - 空でないフォルダーが
error 75を発生させる理由、そしてそれが安全機能である理由 RmDirがフォルダーを削除してファイルは決して削除しない理由 — そしてKillはフォルダーの 正反対RmDirの前にフォルダーを空にする方法(ファイルをKill)、そしてサブフォルダーが再帰を 強いる仕組みFileSystemObject.DeleteFolderに手を伸ばすタイミング — 1 回の呼び出し、ツリー全体、取り消し 不可- 無人マクロを止めない、ガード付きの削除パターン
考え方の軸:RmDir は空のフォルダーだけを取り除く
鍵となる洞察は、RmDir が中身ではなくフォルダーのエントリを削除する、ということです。ディレクトリ
を取り除くのは、その中に何も残っていないとき — ファイルもサブフォルダーもないとき — だけです。これを
Kill と並べると、2 つはきれいな対をなします。
Killはファイルを削除する — どんなファイルも、即座に、ごみ箱 なしで。RmDirはフォルダーを削除するが、空のものだけで、中身のあるものはすべて拒む。
つまり VBA の 2 つの削除ステートメントは、意図的に狭く作られています。一方はファイルだけ、もう一方は 空のフォルダーだけ。どちらも、人々が実際に検索ボックスに打ち込むこと — 「フォルダーと中身をすべて 削除する」 — はしません。それが危険な操作だからで、組み込みはそれを自分で組み立てさせるのです。
error 75:RmDir は空でないフォルダーを拒む
まだファイルやサブフォルダーを含むフォルダーに RmDir を向けると、止まります。
RmDir "C:\Temp\Reports" ' error 75 — Reports が空でなければ「パス/ファイル アクセス エラー」
これが決定的な振る舞いであり、意図的なものです。RmDir は、1 行が仕事でいっぱいのフォルダーを無言で
破壊することを許しません。その非対称さを感じるために、対になる相手と比べてみましょう。
Kill "C:\Temp\*.xlsx" は一致するすべてのファイルを警告なしで消し去るのに対し、同じフォルダーへの
RmDir "C:\Temp" はきっぱりと拒みます。一方のステートメントはすべてが危険、もう一方はすべてが用心
です。中身のあるフォルダーを取り除くには、まず空にしなければなりません。
まず空にする:ファイルを Kill してから RmDir
2 段階のパターンは、Kill でフォルダーのファイルを削除し、それから空に
なったフォルダーを RmDir で取り除くことです。
Kill "C:\Temp\Reports\*.*" ' フォルダー内のすべてのファイルを削除(永久 — 取り消し不可)
RmDir "C:\Temp\Reports" ' これでフォルダーは空なので、成功する
これはフォルダーがファイルだけを抱えているときに動きます。もしサブフォルダーも含むなら、Kill
は役に立ちません — Kill はファイルを削除し、フォルダーは決して削除しません — 各サブフォルダーは
それ自体を空にして取り除く必要があります。したがってフォルダーツリーには再帰が要ります。いちばん
深い階層まで歩き、そのファイルを Kill、RmDir して、上へ戻っていくのです。*.* に対する Kill は
永久なので、中身が捨ててよいと確信できるときにだけ行い、削除する前に、
これから削除するものをログに残しましょう。
FileSystemObject.DeleteFolder:1 回の呼び出し、ツリー全体、取り消し不可
本当に「フォルダーと中身をすべて消す」がほしいとき、FileSystemObject には、RmDir がなろうと
しない単一の呼び出しがあります。
Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject") ' 遅延バインディング — どのマシンでも動く
fso.DeleteFolder "C:\Temp\Reports" ' フォルダーとすべての中身を削除する
DeleteFolder は、フォルダー、そのファイル、そしてすべてのサブフォルダーを一撃で取り除きます —
手作業の空化も、書くべき再帰もありません。その力はまた危険でもあります。Kill
と同じく、ごみ箱を迂回し、取り消しはありません。パスの最後の要素にワイルドカードを受け付け、
第 2 引数 True は読み取り専用ファイルの削除を強制します。fso.DeleteFolder は実弾として扱いましょう
— Kill をガードするのとまったく同じ厳しさでガードし、ユーザー入力のパスにはチェックなしで決して
向けないことです。
もうひとつのエラー:存在しないフォルダーへの RmDir
2 つ目の実行時エラーは、フォルダーが存在しないケースで、Kill の番号とは一致しません。
RmDir "C:\Temp\Gone" ' error 76 — フォルダーが存在しなければ「パスが見つかりません」
error 76— フォルダーがそこにない。取り除く前にIf Dir(path, vbDirectory) <> "" Thenで ガードすれば、すでになくなっているフォルダーはクラッシュではなく成功として扱われる。error 75— フォルダーが空でない(あるいは使用中/読み取り専用)。まず空にするか、fso.DeleteFolderを使う。
存在しないファイルに対して error 53 を発生させる Kill との違いに
注意しましょう。存在しないフォルダーへの RmDir は error 76 を発生させます。同じ考え、違う
番号 — 一方はファイルに、もう一方はフォルダーに働くからです。存在チェックは、
フォルダーには vbDirectory フラグを使います。
無人マクロのための安全な削除パターン
ガードをまとめると、スケジュールされた実行を止めないフォルダー削除はこうなります。
Sub SafeRemoveFolder(ByVal folder As String)
If Dir(folder, vbDirectory) = "" Then Exit Sub ' すでにない — することがない
Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")
fso.DeleteFolder folder ' フォルダー + すべての中身を、1 回の呼び出しで
End Sub
Dir(folder, vbDirectory) ガードが、よくある「そこにない」ケースを吸収するので error 76 は決して
起きず、fso.DeleteFolder が手書きの再帰なしに中身のあるフォルダーをさばきます。もし特に安全な
振る舞い — 空でないものは何も削除しない — がほしいなら、RmDir を残し、error 75 をシートベルトに
しましょう。中身をどれだけ守りたいかで道具を選ぶのです。
正直な結論:空なら RmDir、ツリーなら DeleteFolder
RmDir は、空だとわかっているフォルダーを取り除くための正しい道具です。それ以外はすべて、どれだけの
安全がほしいかという決断です。4 つのルール。
- 空のフォルダー →
RmDir path— 1 つのステートメント。空だという読みが外れていれば拒む (error 75)。 - ファイルの入ったフォルダー → まずファイルを
Killしてから、空に なった殻をRmDir。 - フォルダーツリー、中身は捨ててよい →
fso.DeleteFolder— 1 回の呼び出し。ただしKillと同じに 扱う。ごみ箱なし、取り消しなし。 - 存在をガードする →
If Dir(path, vbDirectory) <> "" Thenとして、存在しないフォルダーがerror 76ではなく no-op になるようにする。
RmDir を「とにかく動かす」ために On Error Resume Next に手を伸ばしていると気づいた瞬間、やめま
しょう — そのエラーは、フォルダーが空でないと告げているのであり、直し方は、その中身を残すべきかどうかを
意図して決めることです。
ExcelMaster の活用
フォルダーを安全に削除するとは、RmDir が空のフォルダーだけを取り除くこと(さもなければ
error 75)、フォルダーは削除してもファイルは決して削除しないこと、存在しないフォルダーは 53 では
なく error 76 であること、そして fso.DeleteFolder がツリー全体を消し去る唯一の呼び出しであること
— 取り消しなしで — を知っていることです。
ExcelMaster は、あなたの意図に合う
削除を書きます。ジョブを説明すれば — 「各実行のあとに一時フォルダーを取り除いて」、あるいは「先月の
エクスポートツリーを片づけて」 — 正しいコードを生成します。空のフォルダーには存在ガード付きの
RmDir、ファイルを抱えているときは Kill してから RmDir するパス、
ツリー全体を消すべきときはガード付きの fso.DeleteFolder。あなたは何を残すべきかを説明するだけ。
それを残す道具を選ぶのは、それがやります。
よくある質問
VBA でフォルダーを削除するには?
RmDir ステートメントを使います:RmDir "C:\Temp\Old"。フォルダーを取り除きますが、フォルダーが
空のときだけです — まだファイルやサブフォルダーを含むフォルダーは error 75 を発生させます。まず
存在チェックでガードしましょう — If Dir("C:\Temp\Old", vbDirectory) <> "" Then RmDir "C:\Temp\Old" —
すでになくなっているフォルダーが error 76 を発生させないように。
VBA の RmDir が error 75 になるのはなぜですか?
フォルダーが空でないからです。RmDir は空のフォルダーだけを削除します。まだファイルやサブ
フォルダーを含むなら、error 75「パス/ファイル アクセス エラー」で止まります。これは、1 行がいっぱいの
フォルダーを消し去るのを防ぐ安全機能です。中身のあるフォルダーを取り除くには、まず Kill でその
ファイルを削除してから、空のフォルダーを RmDir します — あるいは、フォルダーとそのすべての中身を
1 回の呼び出しで取り除く FileSystemObject.DeleteFolder を使いましょう。
VBA で空でないフォルダーを削除するには?
RmDir にはできません — 空でないフォルダーを拒みます。まず空にするか(Kill "C:\Temp\Old\*.*" で
ファイルを削除してから RmDir "C:\Temp\Old"、サブフォルダーは再帰的にさばく)、FileSystemObject を
使いましょう:fso.DeleteFolder "C:\Temp\Old" は、フォルダーと中のすべてを 1 回の呼び出しで削除します。
DeleteFolder はごみ箱を迂回し、取り消せないので、Kill と同じくらい注意してガードしましょう。
VBA の RmDir と Kill の違いは何ですか?
正反対です。Kill はファイルを削除し — どんなファイルも、即座に、ごみ箱なしで — 存在しない
ファイルには error 53 を発生させます。RmDir はフォルダーを削除しますが、空のものだけで、
空でないフォルダーには error 75 を、存在しないフォルダーには error 76 を発生させます。Kill は
フォルダーを決して削除せず、RmDir はファイルを決して削除しないので、ファイルでいっぱいのフォルダーを
取り除くには両方が要ります。中身を Kill してから、殻を RmDir するのです。
RmDir はフォルダーをごみ箱へ移動しますか?
いいえ。RmDir はフォルダーのエントリを直接削除します — ファイルに対する Kill とまったく同じで、
ごみ箱も取り消しもありません。FileSystemObject.DeleteFolder も同じです。どれも取り消せないので、
削除する前にフォルダーが捨ててよいことを確認し、無人マクロが間違ったディレクトリを取り除かないよう
パスをガードしましょう。
検証環境
検証環境: Excel 365 (Windows 11), VBA 7.1 — 最終確認 2026-08-23。
関連ガイド: VBA MkDir · VBA CurDir · VBA Delete File · VBA Check If File Exists · VBA FileSystemObject
