【VBA】ファイルを削除する方法
更新日:2024/01/18
VBAで既存ファイルを削除する方法をお伝えします。
ファイルを削除する関数とメソッド
VBAでファイルを削除する方法は3つあります。
基本的には、1のKillステートメントを使用します。
2のDeleteFileメソッドは、読み取り専用ファイルを削除することができます。
Kill関数とDeleteFileメソッドはワイルドカードでの削除ができます。
3のDeleteメソッドは、Fileオブジェクト内に含まれる更新日付やサイズ等のファイル情報を使用できます。
コピー前にこれらの情報を確認する必要があるときは、Deleteメソッドを使用します。
そのため3を使用する必要が無いケースがあります。
ファイル情報取得については、次のページをご覧ください。
■【VBA】ファイル情報(作成日・サイズ・属性等)を取得する方法
Killステートメント
Killステートメントは、VBAのファイル操作に関する関数ステートメント(戻り値の無い関数)の一つです。
ファイルを削除します。
構文
Kill Pathname
- Pathname: 削除するファイルパス
Pathnameのファイルが存在しないまたは開いているは、エラーが発生します。
Pathnameのファイル名部分にワイルドカードを使用できます。
ワイルドカードを使用することで、複数のファイルを一括で削除できます。
この場合1ファイルずつ削除され、読み込み専用などで削除できないファイルを処理する時点でエラーになります。
従って、エラー時でも一部のファイルが削除されている可能性があります。
使用例
Killステートメントの使用例です。
ファイルが存在しない時などで発生したエラーをエラー処理ルーチンで補足しています。
Sub KillSample()
Const fileName As String = "C:\Users\xxx\Documents\0201.png"
On Error GoTo ErrorHandler
Kill fileName ' 1ファイル削除
MsgBox "削除しました"
FinalHandler:
On Error GoTo 0
Exit Sub
ErrorHandler:
MsgBox Err.Description & "(" & Err.Number & ")", vbCritical & vbOKOnly, "エラー"
Resume FinalHandler
End Sub
エラー処理ルーチンは様々な理由で実行されるので、エラーの特定が煩雑になります。
ファイルが存在しない可能性があるときは、Killステートメントの実行前にDir関数でファイルの存在を確認します。
必要なら削除確認をします。
If Dir(fileName, vbNormal) = "" Then
MsgBox "ファイルが存在しません"
Else
If MsgBox("ファイルが存在します。削除しますか?", vbYesNo) = vbYes Then
Kill fileName
MsgBox "削除しました"
End If
End If
DeleteFileメソッド
DeleteFileメソッドは外部ライブラリのWindows Script Runtimeに含まれているFileSystemObjectオブジェクトのメンバーです。
FileSystemObjectオブジェクトの取得方法は二つあります。
一つは、文字列"Scripting.FileSystemObject"をCreateObject関数に渡す方法です。
Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")
もう一つはVBエディタのメニュー:ツールから参照設定画面を開いて『Microsoft Scriptiong Runtime』を参照設定してから次のコードを実行する方法です。
Dim fso As New Scripting.FileSystemObject
参照設定をおこなうと、コード入力時にメソッド名候補が表示されます。
入力ミスを防げるので便利です。
構文
FileSystemObjectオブジェクト.DeleteFile FileSpec, Force
- FileSpec: 削除するファイルパス
- Force: 省略可能。読み込み専用ファイルを削除するかどうか
Forceの規定値はFalseです。
FileSpecのファイル名にワイルドカードが含まれる場合は、一致するファイルを一括で削除します。
ワイルドカード指定された場合は、1ファイルずつ処理されます。
そして削除できないファイルが存在した時点でエラーになります。
従って失敗時でも、一部のファイルが削除されている可能性があります。
使用例
DeleteFileメソッドの使用例です。
次のコードはimageフォルダ内のPNG画像ファイルを削除しています。
Sub deleteFileSample()
Const sourceFIle As String = "C:\Users\xxx\Documents\image\*.png"
Dim fso As New Scripting.FileSystemObject
On Error GoTo ErrorHandler
fso.DeleteFile sourceFIle
MsgBox "削除しました"
FinalHandler:
On Error GoTo 0
Exit Sub
ErrorHandler:
MsgBox Err.Description & "(" & Err.Number & ")", vbCritical & vbOKOnly, "エラー"
Resume FinalHandler
End Sub
FileSystemObjectを取得している状態でファイルまたはフォルダの存在を確認するときは、FileSystemObjectのFileExistsメソッドまたはFolderExistsメソッドを使用します。
FileSystemObjectオブジェクト.FileExists( FileSpec ) FileSystemObjectオブジェクト.FolderExists( FolderSpec )
いずれのメソッドも対象が存在するときはTrueを、存在しない時は False を返します。
Deleteメソッド
DeleteメソッドはFileオブジェクトのメンバーです。
Fileオブジェクトは、FileSystemObjectオブジェクトのGetFileメソッドで取得します。
■Fileオブジェクトのプロパティ|【VBA】ファイル情報(作成日・サイズ・属性)を取得する方法
構文
set Fileオブジェクト = FileSystemObjectオブジェクト.GetFile( FilePath ) Fileオブジェクト.Delete Force
- Force: 省略可能。読み込み専用ファイルを削除するかどうか
Forceの規定値はFalseです。
使用例
Delete メソッドの使用例です。
次のコードはファイルの作成日時が2019/4/1以前のとき、削除しています。
Sub deleteSample()
Const sourceFIle As String = "C:\Users\xxx\Documents\image\image.png"
Dim fso As New Scripting.FileSystemObject
Dim fo As file
On Error GoTo ErrorHandler
Set fo = fso.GetFile(sourceFIle)
If fo.DateCreated < #4/1/2019# Then
fo.Delete true
End If
FinalHandler:
On Error GoTo 0
Exit Sub
ErrorHandler:
MsgBox Err.Description & "(" & Err.Number & ")", vbCritical & vbOKOnly, "エラー"
Resume FinalHandler
End Sub
Deleteメソッド実行は、ファイルが存在しません。
従って、Fileオブジェクトでの操作(Delete、Move,Copy等)は使用できません。
更新日:2024/01/18
関連記事
スポンサーリンク
記事の内容について
こんにちはけーちゃんです。
説明するのって難しいですね。
「なんか言ってることおかしくない?」
たぶん、こんなご意見あると思います。
裏付けを取りながら記事を作成していますが、僕の勘違いだったり、そもそも情報源の内容が間違えていたりで、正確でないことが多いと思います。
そんなときは、ご意見もらえたら嬉しいです。
掲載コードについては事前に動作確認をしていますが、貼り付け後に体裁を整えるなどをした結果動作しないものになっていることがあります。
生暖かい視線でスルーするか、ご指摘ください。
ご意見、ご指摘はこちら。
https://note.affi-sapo-sv.com/info.php
このサイトは、リンクフリーです。大歓迎です。