和風スパゲティのレシピ

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

KillとFSO.DeleteFileの違い

ファイルを削除する際に使用する、
killステートメントと、FileSystemObject.DeleteFileメソッドの違いを解説します。

※ FileSystemObjectは以下FSOと略記します。

同じところ

どちらも「削除したいファイルのパス」を受け取り、
そのファイルを削除します。


細かい挙動もほぼ一致しており、

  • 通常使用する引数は「削除したいファイルのパス」1つだけ
  • ワイルドカードを使用した一括削除が可能
  • 存在しないファイルを指定するとエラー
  • ワイルドカード使用時に該当ファイルが1つもないとエラー
  • 開いているファイルを指定するとエラー
  • 1つ開いて一括削除した場合はそのファイルまで削除してからエラー
  • フォルダパスを省略した場合はカレントフォルダのファイルを削除

これらの仕様は全く同じになっています。


また、1000ファイル削除しても両者とも1~2秒で完了しますので、
速度面でも気にするような差はありません。

違うところ

FileSystemObjectとDir系列ステートメント全般に言える違いですが、
フォルダ名にUnicode文字が混じった場合にDir系列はエラーになります。

例えばKillステートメントでは、

  • ①~⑳のファイルはKillステートメントでも削除できる
  • ㉑~㊿のファイルはDeleteFolderメソッドでなければ削除できない

という違いがあります。


その他はかなり細かい違いしかありません。

  1. FileSystemObjectは255文字以上のパスを扱える
  2. DeleteFolderは第2引数をTrueにすると「読取専用ファイル」を削除できる

という違いがありますが、

  1. そもそもWindows自体がパス255文字制限である
  2. ExcelVBAで読取専用ファイル(多くはシステムファイル)を削除することは滅多にない

という点で、通常使う上ではほとんど意識しなくてよい差です。



なお、FileSystemObjectを使用する以上当然のことなのですが、
FileSystemObjectには以下のバインディングが必要です。

Public FSO As New FileSystemObject
' または
Set FSO = CreateObject("Scripting.FileSystemObject")

 

このコードを書く必要があるため、
Killステートメントの方が書くのが楽(なことが多い)
というのも大事な違いですね。

使い分け

ファイル名にUnicode文字が使用されている可能性がある場合は、
FileSystemObjectのDeleteFileメソッド
を使用する必要があります。


そうでない場合はほとんど同じものですので、好きな方を使ってください。


単体で使うならKillステートメントの方が書くのが楽そうですが、
前後でファイル/フォルダ操作をしていて既にFSOオブジェクトがあるなら、
FSO.から選択入力できるDeleteFileの方が、書くのが楽で統一感も出そうです。


自分の好みでない方のコードを非難するようなことをしない限り、
どちらを使ってもOKです。

Dir系列とFileSystemObjectの違い

KillとFSO.DeleteFileの違いについては以上ですが、
Dir系列とFSOの違いを考える場合はもう一つ重要な要素があります。


それがファイル削除第3の方法、FileオブジェクトのDeleteメソッドです。

' 以下の3つはすべて同じ処理のコード

' Killステートメント
Kill 削除したいファイルパス

' DeleteFileメソッド
FSO.DeleteFile 削除したいファイルパス

' Fileオブジェクト.Deleteメソッド
Dim 削除ファイル As File
Set 削除ファイル = FSO.GetFile(削除したいファイルパス)
削除ファイル.Delete

このように、FileSystemObjectを使用している場合は、
FileオブジェクトのDeleteメソッドでもファイル削除が可能です。


上記の様にわざわざGetFileでFileオブジェクトを取得するメリットはないですが、
例えば↓の「フォルダ内のFilesをForEachで回しているとき」など、
既にFileオブジェクトがある状況ではDeleteメソッドが一番簡単な方法になります。

Dim ファイル As File
For Each ファイル In 対象フォルダ.Files
    
    If ファイルを処理する条件 Then
        ファイルに対する処理
        ファイル.Delete ' ←ここにファイル削除を書くならKillやDeleteFileよりこれが楽
    End If
    
Next

 
逆に言えば、

FSO.DeleteFile(ファイル.Path)

これは流石に間違ったコードと言って差し支えないでしょう。



このようにFSOは「フォルダ/ファイルをオブジェクトとして扱える」のが特長です。

  • フォルダパスで動かす分にはDir系列とFSOはあまり変わらない
  • Folder/Fileオブジェクトを扱えることがFSOのメリット

というのが、Dir系列とFileSystemObjectの違いになります。


この違いの詳しい解説はこちらの記事をどうぞ。
www.limecode.jp