はじめに
VBAのKillステートメントや、FileSystemObjectのDeleteFileメソッドは、ファイルを完全に削除します。
ごみ箱に入れて削除したい場合は、WindowsAPIの関数を使う必要があります。
ごみ箱に移動して削除する方法は以下のページを参照してください。
・ごみ箱に移動して削除
KillステートメントとDeleteFileメソッドの違いは、読み取り専用属性、隠し属性のファイルを削除できるかの違いとなります。Killステートメントでは、これらの処理ができませんが、FileSystemObjectのDeleteFileメソッドでは、オプションを設定する事でさまざまな処理に対応できます。
両者の使い方を見ていきましょう。
Killステートメント
Sub testKill1()
Kill "C:\tools\test.txt"
End Sub
Killステートメントは、上記のように簡単に書く事ができます。ただ、指定したファイルが存在しない場合は、「実行時エラー ’53’: ファイルが見つかりません。 」というエラーが出ます。
そのため、削除する前にファイルが存在するかを確認してから実行すると良いでしょう。
Sub testKill2()
Dim result As Long
Dim fileName As String
fileName = "C:\tools\test.txt"
If Dir(fileName) <> "" Then
result = MsgBox(fileName & "を削除してよろしいですか?(元に戻せません。)", _
vbYesNo + vbQuestion + vbDefaultButton2, "確認")
If result = vbYes Then '「はい」の処理
Kill fileName
End If
Else
MsgBox "ファイルが存在しません;" & fileName
End If
End Sub
上記のプログラムでは、Dirを使ってファイルが存在するかを確認しています。存在する場合は、メッセージボックスを表示して削除してよいかを尋ねています。
もしファイルが存在している場合でも、Killステートメントでは読み込み専用属性、隠し属性のファイルを削除しようとするとエラーが発生します。
読み取り専用ファイルを削除しようとすると、「実行時エラー’75’:パス名が無効です。」
隠し属性ファイルを削除しようとすると、「実行時エラー ’53’: ファイルが見つかりません。 」
というエラーが発生します。
DeleteFileメソッド
FileSystemObjectのDeleteFileメソッドを使えば、読み取り専用や隠し属性のファイルも削除可能です。
Sub testFSO_Delete1()
Dim FSO As Object
Set FSO = CreateObject("Scripting.FileSystemObject")
FSO.DeleteFile "C:\tools\test1.txt" '読み取り専用なら削除しない
FSO.DeleteFile "C:\tools\test2.txt", True '読み取り専用でも削除
FSO.DeleteFile "C:\tools\test*.txt" 'ワイルドカードを使った削除
End Sub
DeleteFileメソッドでは第2引数を省略した場合、読み取り専用ファイルを削除しようとすると「実行時エラー’70’:書き込みできません。」というエラーが発生します。第2引数に True を指定すれば、読み取り専用属性のファイルも削除できるようになります。
更に、ファイル名にワイルドカードを指定する事も可能です。
また、ファイルが存在しない場合は、Killステートメントと同じで「実行時エラー ’53’: ファイルが見つかりません。 」というエラーが出ます。FileSystemObjectではファイルの存在を確認する FileExists というメソッドがあるので、こちらを使うのが一般的です。
Sub testFSO_Delete2()
Dim FSO As Object
Set FSO = CreateObject("Scripting.FileSystemObject")
Dim fName As String
fName = "C:\tools\test.txt"
If FSO.FileExists(fName) Then 'ファイルが存在するか?
FSO.DeleteFile fName
End If
End Sub
まとめ
VBAでファイルを削除する、Killステートメントと、FileSystemObjectのDeleteFileメソッドの使い方を紹介しました。DeleteFileメソッドの方が多機能で扱いやすいかもしれません。Killステートメントは簡単に書けますが、読み取り専用属性、隠し属性のファイルを扱えませんが簡単に書けます。
プログラムで一時的なファイルを作って最後に削除するなど、予めファイルの存在が明確な場合はKillステートメントを使った方が便利かもしれません。
ごみ箱に移動して削除する方法は以下のページを参照してください。
・ごみ箱に移動して削除
コメント