FileSystemObjectにてファイルを削除する、
DeleteFileメソッドの使い方を解説します。
基本形
FSO.DeleteFile 削除したいファイルのパス ' ※ 読取専用ファイルを削除する場合 FSO.DeleteFile 削除したいファイルのパス, True
実行例
Dim FSO As New FileSystemObject ' Excelファイルを削除 FSO.DeleteFile "C:\Users\○○\Desktop\Book1.xlsx" ' PDFファイルを削除 FSO.DeleteFile "C:\Users\○○\Desktop\テスト.pdf" ' マクロを実行したブックと同フォルダの「Book1」を削除 FSO.DeleteFile Thisworkbook.Path & "\Book1.xlsx" ' カレントフォルダの「Book1」を削除 FSO.DeleteFile "Book1.xlsx" ' Book○○.xlsx に合致するファイルを一括削除 FSO.DeleteFile ThisWorkbook.Path & "\Book*.xlsx" ' フォルダ内のすべてのファイルを一括削除 FSO.DeleteFile 対象フォルダのパス & "\*"
解説
FileSystemObjectにてファイルを削除する場合はDeleteFileメソッドを利用します。
Excelに限らず全種のファイルを削除することができ、
ゴミ箱への移動ではなく完全な削除が実行されます。
実行例の通り、以下のワイルドカードを使って、
合致するファイルの一括削除を実行することができます。
* | 任意の文字列(0文字も含む) |
? | 任意の1文字 |
後述の第2引数(読取専用ファイルの削除)は滅多に使用しませんので、
Killステートメントと同じものと思って構いません。
使えるワイルドカードや、発生エラーの条件も全く同じです。
発生するエラー
DeleteFileメソッドで発生する可能性のあるエラーは、
大きく以下の3パターンになります。
削除するファイルが存在しない
渡したパスにファイルが存在しなかった場合は、
実行時エラー53「ファイルが存在しません」 |
このエラーが発生します。
これはワイルドカードを利用した一括削除の場合も同様で、
「合致するファイルがひとつもなかった場合はエラー」になります。
「ファイルがあればファイルを削除」したい場合は、
以下のいずれかのコードを実行してください。
' 文字通り「ファイルがあればファイルを削除」する If FSO.FileExists(削除ファイルパス) Then FSO.DeleteFile 削除ファイルパス End If ' エラーを無視して実行する On Error Resume Next FSO.DeleteFile ThisWorkbook.Path & "\Book1.xlsx" On Error GoTo 0
基本は1番目のコードの方が安全なのですが、
FileExistsメソッドにはワイルドカードが使えません。
「ひとつでも該当ファイルがあれば、該当ファイル群を一括削除」
を行いたい場合は、2番目のエラーを無視するコードで実行するか、
以下の通りDir関数でファイル存在判定を行ってください。
Dim 削除ファイル条件 As String 削除ファイル条件 = ThisWorkbook.Path & "\Book*.xlsx" If Dir(削除ファイル条件) <> "" Then FSO.DeleteFile 削除ファイル条件 End If
削除するファイルを開いている
指定したファイルを開いていた場合は、
実行時エラー70「書き込みできません。」
エラーが発生します。
他にも共有サーバー上のファイルで誰かが開いていたり、
ユーザーではなく何らかのシステムが参照している場合など、
手作業のDeleteキーで消せない場合はこのエラーになります。
削除するファイルが読み取り専用
削除するファイルが読み取り専用だった場合は、
実行時エラー75「パス名が無効です。」 |
エラーが発生します。
ここでいう「読み取り専用」というのは、
Excelの読み取り専用ブックのことではなく、
Windowsにおけるファイル/フォルダの読み取り専用設定のことです。
つまり、↓このレ点チェックのことですね。
ここでようやく第2引数が登場しますが、
この読取専用ファイルを削除する場合は第2引数(Force)にTrueを渡します。
FSO.DeleteFile 削除したい読取専用ファイルのパス, True
ただ、この読取専用ファイルというのは主にシステムファイルなどであり、
それをExcelVBAから削除するというのは滅多にないと思います。
おまけ:FileオブジェクトのDeleteメソッドを使う方法
FileSystemObject(以下FSO)を利用したファイルの削除として、
FileオブジェクトのDeleteメソッドを使用することもできます。
例えば、「Book○○.xlsx」を削除する際に、
「○○部分が1桁の数値の場合のみ削除する」コードがこちらです。
Sub Book1からBook9を削除する() Dim FSO As New FileSystemObject Dim 対象フォルダ As Folder Set 対象フォルダ = FSO.GetFolder(ThisWorkbook.Path) Dim 削除候補ファイル As File For Each 削除候補ファイル In 対象フォルダ.Files If 削除候補ファイル.Name Like "Book#.xlsx" Then 削除候補ファイル.Delete End If Next End Sub
ここで使っている「1桁の数値」を表すワイルドカード「#」は、
Like演算子でしか使うことができません。
これを使用するために、全ファイルをForEachでループするコードです。
このように全ファイルをループしているときなど、
対象ファイルの「Fileオブジェクト」がすでにある場合は、
ファイル.Delete が最も簡単にファイルを削除する方法になります。
特にこの部分↓はとてもストレートで読みやすいですよね。
If ファイル.Name Like 条件 Then ファイル.Delete End If
このように、FSOはファイル/フォルダをオブジェクトとして扱えるのが特長です。
Dir系列との対比でFSOをとらえていると見落としやすいのですが、
File.○○ という記述でも様々な処理が実行できます。
FileSystemObjectを扱う際は、この方法も必ず意識しておきましょう。