和風スパゲティのレシピ

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

FileSystemObject.DeleteFileメソッド

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におけるファイル/フォルダの読み取り専用設定のことです。

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

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を扱う際は、この方法も必ず意識しておきましょう。