🚀The world's best VBA AI has evolved. ExcelMaster is now an autonomous Agent.Read more →
Back to Blog

VBA RmDir in Excel — フォルダーを削除する、ただし空のときだけ

|

VBA RmDir in Excel — フォルダーを削除する、ただし空のときだけ

TL;DRRmDir はフォルダーを空のときにだけ削除します。まだファイルやサブフォルダーを 抱えたフォルダーに向けると、error 75 を発生させます — 何も尋ねずにどんなファイルも削除する Kill とはちょうど正反対です。「このフォルダーを削除する」は、実際には 「まず空にしてから取り除く」ことなのです。

Sub RemoveTempFolder()
    RmDir "C:\Temp\Empty"    ' C:\Temp\Empty の中に何もないときだけ動く
    RmDir "C:\Temp\Reports"  ' Reports がまだファイルやサブフォルダーを含むと error 75
End Sub

RmDirKill の鏡像です。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 はファイルを削除し、フォルダーは決して削除しません — 各サブフォルダーは それ自体を空にして取り除く必要があります。したがってフォルダーツリーには再帰が要ります。いちばん 深い階層まで歩き、そのファイルを KillRmDir して、上へ戻っていくのです。*.* に対する 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 との違いに 注意しましょう。存在しないフォルダーへの RmDirerror 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