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

Excel VBA でファイルを削除する — Kill、FileSystemObject.DeleteFile、そして取り消しができない理由

|

Excel VBA でファイルを削除する — Kill、FileSystemObject.DeleteFile、そして取り消しができない理由

TL;DRKill path はファイルを完全に削除します。ごみ箱なし、確認なし、取り消しなしKill は、ファイルをごみ箱へドラッグするというより、シュレッダーにかけるのに近いものです。しかも ファイルが存在しないときや開いているときは、何もしないのではなくエラーになるので、安全な パターンはつねに先にチェックします。

Sub DeleteTempFile()
    Dim path As String
    path = "C:\Reports\~temp.xlsx"
    If Dir(path) <> "" Then Kill path      ' 実際に存在するものだけを Kill する — そして永久に消える
End Sub

マクロがファイルをコピーしたり処理したりしたあと、最後のステップはたいてい後片付けです — 一時 ファイルを削除する、昨日のエクスポートを一掃する。Kill はそれをこなす組み込みで、FileCopy には ない意味で本当に危険です。ファイルは二度と戻ってきません。Kill について知る価値のあることは すべて、その一方通行の扉の正しい側にとどまるためのルールです。

この記事で学べること

  • 考え方の軸 — Kill は「ごみ箱へ移動」ではなく完全な削除
  • ファイルが存在しない、または開いているとき、Kill が無言で何もしないのではなくエラーになる理由
  • ワイルドカードが多数のファイルを一度に削除する仕組み — 強力で、そしてタイプミスに容赦がない
  • Killフォルダーを削除できない理由と、RmDirDeleteFolder がその仕事をどう分けるか
  • 読み取り専用ファイルに対して、Force フラグ付きの FileSystemObject.DeleteFileKill に勝つとき
  • 安全な削除パターン — チェックしてから削除、そして迷ったらまずアーカイブ

考え方の軸:Kill は永久であり、ごみ箱ではない

Kill について最も重要なただ一つのことは、それがしないことです。ファイルをごみ箱へ移動 しません。File Explorer でファイルを削除すると、Windows は復元できるコピーをそっと保持します。 Kill はそのすべてを迂回します。ファイルは即座にディスクからリンクを外され、VBA からそれを 取り戻すサポートされた方法はありません。

Kill は、Unix の管理者が rm を扱うように扱いましょう — 慎重に狙いを定め、意図して撃つ、 取り返しのつかない操作として。その捉え方が、以下のあらゆるルールを導きます。ファイルがまだ 必要かもしれないなら、正しい一手はより賢い Kill ではありません。元を削除する前にアーカイブにコピーすることです。

Kill は存在しない、または開いているファイルでエラーになる — 何もしないのではない

驚くほど多くの人が、存在しないファイルへの Kill はただ何もしないと思い込んでいます。そうでは ありません — 実行時エラーを発生させます

Kill "C:\Reports\does-not-exist.xlsx"   ' error 53 — "File not found"
Kill "C:\Reports\open-book.xlsx"        ' error 70 — "Permission denied"(ファイルが開いている/ロック中)
  • error 53 — ファイルがそこにない。Kill を呼ぶ前に、存在テストでガードする。
  • error 70 — ファイルが開いている、読み取り専用、または別のプロセスにロックされている。 Excel で開いているブックは Kill できません。まず Close しましょう。

だから定石の削除は 2 部構成のガードになります。まず一般的な「そこにない」ケースのために Dir(path) <> "" でファイルが存在することをテストし、より まれなロックのケースのために呼び出しを On Error で包む — ファイルは存在テストを通っても、その 1 ミリ秒後にはロックされているかもしれないからです。

If Dir(path) <> "" Then
    On Error Resume Next          ' ロックされたファイルの場合を明示的に処理する
    Kill path
    If Err.Number <> 0 Then MsgBox "Could not delete: " & path & " (" & Err.Description & ")"
    On Error GoTo 0
End If

コピーとの違いに注目してください。ここでの On Error は、既知でまれな失敗に対する意図的な ハンドラーであり、なんでも握りつぶす抑制装置ではありません。すべての KillErr チェック なしに On Error Resume Next で無造作に包むことこそ、後片付けが無言で行われなくなる原因です。

ワイルドカードは多数のファイルを一度に削除する — 確認なしで

KillDir と同じ *? のワイルドカードを受け付け、それらを 1 つの ステートメントですべての一致に適用します。

Kill "C:\Reports\Temp\*.tmp"     ' そのフォルダーの .tmp をすべて削除 — 確認なし、取り消しなし

これは後片付けに絶大な威力を発揮しますが、本当に危険でもあります。確認がないので、パターンの タイプミス — *.tmp のつもりの *.xls*、あるいは間違ったフォルダー — が、意図したよりはるかに 多くを、瞬時に、そして永久に消し去ります。安全のための習慣が 2 つ。

  • 削除する前に読む。 パターンが少しでも動的なら、まず Dir でループして、削除される名前を 一つひとつ Debug.Print するかログに残し、それから 2 回目のパスで削除する。
  • チェックしていない入力からパスを組み立てない。 空の変数は Kill folder & "\*.*"Kill "\*.*" に変えてしまう — まったく違う場所に狙いを定めて。

ワイルドカードとループの微妙な点をひとつ。Dir の列挙と Kill の一致を同じループの中で安全に 走らせることはできません。ファイルを削除すると、Dir のカーソルが歩いているフォルダーが変化する からです。まず名前を配列に集め、それから削除しましょう — Dir ガイドの 2 パス パターンです。

Kill はファイルを削除する、フォルダーではない — RmDir と DeleteFolder

Killファイルを削除します。フォルダーに向けると error 5(プロシージャの呼び出しが不正)に なります。フォルダーは別の道具のセットで、そのフォルダーが空かどうかで分かれます。

  • RmDir path空のフォルダーだけを削除します。中にまだ何かあれば error 75。だから フォルダーを削除する組み込みの手順は、中身(または一致するファイル)を Kill してから、 フォルダーを RmDir する、です。
  • fso.DeleteFolder pathFileSystemObject 版で、フォルダー とその中のすべてを、再帰的に、1 回の呼び出しで削除します。ツリー全体を消し去る必要が あるときの道具です — そして Kill と同じく、ごみ箱を使いません。

これらを取り違えるのはよくあることです。フォルダーを削除しようと Kill "C:\OldExports" を試して、 エラーに驚くのです。ファイルは Kill、空のフォルダーは RmDir、中身のあるツリーは fso.DeleteFolder

FileSystemObject.DeleteFile:読み取り専用ファイルのための Force フラグ

Kill読み取り専用ファイルの削除を拒みます — 開いているファイルと同じ権限エラー、error 70 を発生させます。FileSystemObject は、明示的なオーバーライドを備えた よりきれいな道具を与えてくれます。

Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")   ' 遅延バインディング — どのマシンでも動く
If fso.FileExists(path) Then fso.DeleteFile path, True  ' Force:=True は読み取り専用ファイルも削除する

DeleteFile はまた、Dir ループを決して乱さない状態を持たない存在チェックのために fso.FileExists と組になり、Kill と同じくワイルドカードを受け付けます。仕事のほかの部分ですでに FileSystemObject を使っているとき、あるいは特に読み取り専用ファイルが絡むときに手を伸ばしましょう — ただし Force:=TrueKill より危険であって、その逆ではないことをわきまえてください。誰かが 意図的に保護したファイルを削除するのですから。

正直な結論:チェックしてから削除 — そして迷ったらアーカイブ

Kill は後片付けのための正しい道具であり、取り消せないというまさにその理由から、ほかのどの ファイルステートメントよりも敬意を求めます。4 つのルール。

  • 存在をガードするIf Dir(path) <> "" Then Kill path。そうすれば、ないファイルは error 53 ではなく何もしないことになる。
  • ロックのケースを処理する — 開いている、または読み取り専用のファイルのために、Err チェック付きの本物の On Error ハンドラーで Kill を包む。なんでも握りつぶさない。
  • ワイルドカードは実弾として扱う — 動的な Kill *.* の前に一致を読む(またはログに残す)、 そして Dir ループの中で削除するのではなく、集めてから削除する。
  • 戻したくなるかもしれないものを削除する前にアーカイブする — アーカイブフォルダーへの FileCopy は安い。Kill したファイルの復元は不可能。

ファイルが処分してよいと確信が持てないなら、削除しないこと — まず脇へコピーしましょう。Kill に 取り消しはありません。だからあなたが取り消しなのです。

ExcelMaster の活用

ファイルを安全に削除するとは、存在をガードし、本当のエラーを黙らせずにロックされたファイルの ケースを処理し、多数のファイルを一度に消すワイルドカードを尊重し、そしてフォルダーには Kill では なく RmDirDeleteFolder が要ると知っていること — 取り返しのつかない 1 つのステートメントを 包むには、ずいぶんな用心です。

ExcelMaster は、安全な版を 書きます。後片付けを説明すれば — 「エクスポートのあと、このフォルダーの全一時ファイルを削除して」、 あるいは「先月のアーカイブフォルダーを削除して」 — 存在チェックとエラーハンドラー付きの ガードされた Kill、ファイルを列挙するときの集めてから削除するループ、フォルダーのための RmDir/DeleteFolder の使い分け、そしてファイルがまだ必要かもしれないときはまず アーカイブへのコピーを生成します。あなたは結果を説明するだけ。一方通行の 扉にとらえられないようにするのは、それがやります。

よくある質問

VBA でファイルを削除するには?

組み込みの Kill path を使います — たとえば Kill "C:\Reports\temp.xlsx"。まず存在テストで ガードしましょう、If Dir(path) <> "" Then Kill path。というのも Kill は、存在しないファイルに 対して何もしないのではなく error 53 を発生させるからです。Kill完全に削除することを 忘れずに — ごみ箱も取り消しもありません — なので、必要かもしれないものは削除する前に アーカイブへコピーしましょう。

VBA の Kill はファイルをごみ箱に移動しますか?

いいえ。Kill はファイルを即座に、そして永久に削除します。ごみ箱には行かず、VBA からそれを 復元するサポートされた方法はありません。これは、復元できるコピーを保持する File Explorer での 削除とは異なります。ごみ箱の挙動が必要なら、Windows Shell API を呼ばなければなりません — そう でなければ、すべての Kill を最終的なものとして扱い、迷ったらまずアーカイブしましょう。

VBA の Kill が error 70 や error 53 になるのはなぜですか?

error 53(File not found)はファイルが存在しないという意味です — Kill する前に If Dir(path) <> "" Then でガードしましょう。error 70(Permission denied)はファイルが開いている、 読み取り専用、または別のプロセスにロックされているという意味です — 開いているブックはまず 閉じ、読み取り専用ファイルには Force フラグ付きの fso.DeleteFile path, True を使いましょう。 Kill はこうした場合、無言で何もしないのではなくエラーになります。

VBA でワイルドカードを使って複数のファイルを削除するには?

Kill はワイルドカードを受け付けるので、Kill "C:\Temp\*.tmp" はそのフォルダーの全 .tmp ファイルを 1 つのステートメントで削除します — 確認なし、取り消しなしで。確認がないので、 パターンが動的なら、まず Dir ループで一致をログに残し、Dir ループの中では決して削除しない ように(名前を配列に集めてから削除する)。削除はカーソルが歩いているフォルダーを変化させる からです。

VBA でフォルダーを削除するには?

Kill はフォルダーではなくファイルを削除します。空のフォルダーを削除するには RmDir path を使います。中身がまだあれば、それらを先に Kill してから RmDir します。フォルダーとその中の すべてを 1 回の呼び出しで削除するには、FileSystemObject を使います:fso.DeleteFolder path は ツリー全体を再帰的に削除します。Kill と同じく、どちらもごみ箱を使いません。

検証環境

検証環境: Excel 365 (Windows 11), VBA 7.1 — 最終確認 2026-08-22。

関連ガイド: VBA Copy File · VBA Rename File · VBA Check If File Exists · VBA Dir · VBA FileSystemObject