和風スパゲティのレシピ

日本語でコーディングするExcelVBA

ファイルを削除する - Killステートメント

ファイルを削除する際に使用する、
Killステートメントの使い方を解説します。

基本形

Kill 削除したいファイルのパス

実行例

' Excelファイルを削除
Kill "C:\Users\○○\Desktop\Book1.xlsx"

' PDFファイルを削除
Kill "C:\Users\○○\Desktop\テスト.pdf"

' マクロを実行したブックと同フォルダの「Book1」を削除
Kill Thisworkbook.Path & "\Book1.xlsx"

' カレントフォルダの「Book1」を削除
Kill "Book1.xlsx"

解説

ファイルを削除する場合はKillステートメントを使用します。

基本形、実行例の通り、とても単純なステートメントで、
消したいファイルのパスを渡すと、そのファイルを削除してくれます。


削除できるファイルはExcelに限りません。
すべての種類のファイルを削除することができます。

削除したファイルはゴミ箱ではなく完全に削除されますので注意してください。


ファイルのパスはすべて手打ちでももちろん動きますが、
WorkbookのPathプロパティをフォルダ部分に使えるのは覚えておきましょう。

「あるブックと同じフォルダにあるファイル」を簡単に指定することができます。



また、ファイル名だけを指定すると「カレントフォルダ」のファイルを削除します。

ドキュメントフォルダや、最後に保存したフォルダのことですね。


このフォルダをマクロで活用することは少ないと思いますので、
どちらかというと注意点かもしれません。

フォルダパスの渡し忘れに注意してください。

発生するエラー

Killステートメントで発生する可能性のあるエラーは、
大きく以下の3パターンになります。

削除するファイルが存在しない

渡したパスのファイルが存在しなかった場合は、

実行時エラー53「ファイルが存在しません」

このエラーが発生します。


ファイルがあればファイルを削除」をしたい場合は、
以下のいずれかのコードを実行してください。


◇ ファイルがあるかどうかをDir関数で判定してからKillを実行する

Dim 削除ファイルパス As String
削除ファイルパス = ThisWorkbook.Path & "\Book1.xlsx"

If Dir(削除ファイルパス) <> "" Then
    Kill 削除ファイルパス
End If


◇ On Error Resume Next下でKillを実行する

On Error Resume Next
Kill ThisWorkbook.Path & "\Book1.xlsx"
On Error GoTo 0


ただし、後者の「On Error Resume Next」を使用する場合は、
3パターンのどのエラーが起きたかわからない点にご注意ください。

削除するファイルを開いている

指定したファイルを開いていた場合は、

実行時エラー70「書き込みできません。」

このエラーが発生します。


他にも共有サーバー上のファイルで誰かが開いていたり、
ユーザーではなく何らかのシステムが参照している場合など、
手作業のDeleteキーで消せない場合はこのエラーになります。

削除するファイルが読み取り専用

指定ファイルが読み取り専用だった場合は、

実行時エラー75「パス名が無効です。」

このエラーが発生します。


ここでいう「読み取り専用」というのは、
Excelの読み取り専用ブックのことではなく、
Windowsにおけるファイル/フォルダの設定のことです。

つまり、↓このレ点チェックのことですね。

Windowsの読み取り専用設定


ここにチェックが入るファイルの多くはシステムファイルなどですので、
ExcelVBAからこれを削除することはめったにないと思います。

ファイル名を部分一致判定して一括削除する

Killステートメントには「ワイルドカード*」が使用でき、
合致するすべてのファイルを一括で削除することができます。

' Book○○.xlsx をすべて削除
Kill ThisWorkbook.Path & "\Book*.xlsx"


「*」は「任意の文字列」という意味になり、
これに当てはまるファイルを一括で削除してくれます。


使用できるワイルドカードは「*」「?」の2つです。

* 任意の文字列(0文字も含む)
? 任意の1文字

 

一括削除する場合に発生するエラーですが、
まず「対象ファイルが1つもない」場合はエラーになります。

最低1つはファイルを消さないとエラーということですね。


この対策で「最低1つはファイルがあれば該当ファイルを一括削除」したい場合は、
ファイル存在を判定するDir関数も同じワイルドカードが使えますので、

Dim 削除ファイル条件 As String
削除ファイル条件 =  ThisWorkbook.Path & "\Book*.xlsx"

If Dir(削除ファイル条件) <> "" Then
    Kill 削除ファイル条件
End If

このようにDirとKillに同じ条件文字列を使用すればOKです。


続いて「開いているファイル」「読み取り専用ファイル」が混じる場合は、
そのファイルに差し掛かったところで該当のエラーが出ます。


つまり、Book1~Book9があるフォルダでBook5を開いていた場合は、
Book1~Book4が削除された後でエラーとなります。
(厳密には1~9の順番になるとは限らないですが)


Deleteキーでの削除と同じ動きになることことですね。


ワイルドカードを利用した一括削除を行う場合は、
これらのエラーに注意して実行してください。

フォルダ内のすべてのファイルを削除する

ワイルドカード「*」のみをファイル名に指定すれば、
フォルダ内のすべてのファイルを一括で削除することができます。

Kill ファイルをすべて削除したいフォルダのパス & "\*"

非常に簡単なコードで実行ができますので覚えておきましょう。



以上でKillステートメントの解説を終了します。

一括削除もできとても便利なステートメントですが、
ゴミ箱行きではなく完全な削除が実行されます。


使用する場合は、細心の注意を払って実行してください。