HOWTO · VBA
VBAでファイルを削除する方法
VBAで1つのファイル、拡張子を指定したファイル、または空のフォルダーを削除する方法を学びます。
このページの内容
VBA の Kill ステートメントを使用して、ファイルまたは一致するファイルを削除します。1 つのファイルについては、FileSystemObject が DeleteFile メソッドと、事前にパスを確認するための FileExists メソッドを提供します。空のフォルダーを削除するには RmDir を使用します。タスクに合ったセクションを選び、削除コードを実行する前にパスと対象ファイルを確認してください。これらの操作はファイルやフォルダーを削除します。
VBAでファイルを削除
適切な方法は、削除する必要があるものによって異なります。Kill はファイルパスまたはワイルドカードパターンを受け付ける VBA ステートメントです。FileSystemObject はファイルやフォルダーを操作するための別のオブジェクトモデルで、その DeleteFile メンバーと FileExists メンバーが削除とパス確認をサポートします。RmDir は空のフォルダーを削除します。これらは異なる選択肢であり、Kill は FileSystemObject の関数ではありません。
例を応用する前に、そのサンプルパスを使用する完全なパスに置き換えてください。フォルダーとファイル名を注意深く確認してください。ワイルドカードはそのフォルダー内の複数のファイルを対象にする可能性があるため、一括削除コードを実行する前に意図した一致を点検してください。以下の VBA スニペットは構文の例であり、Windows/VBA のランタイムテストではありません。提供された実行証拠は PowerShell によるファイルシステムの図解のみを対象とし、VBA ホストでの観察結果は含まれていません。
VBA で単一のファイルを削除する
Kill ステートメントは、既知のファイルに対する短い選択肢です。この完全なプロシージャは、VBA ホストで実行されると、指定されたパスにあるブックを削除します。
Sub DeleteFileWithKill(): Kill "D:\Test\testFile.xlsx": End Sub
サンプルパスを、削除する正確なファイルに置き換えてください。Kill は確認を求めないため、実行前にパスを確認してください。この例はファイルが存在することを前提としています。存在しない場合、Kill は VBA ランタイムエラーを発生させます。プロシージャがファイルの不在を正常な結果として扱う必要がある場合は、意図的なエラー処理を追加してください。
FileSystemObject を使って 1 つのファイルを削除することもできます。オブジェクトを作成し、パスを設定し、その DeleteFile メソッドを呼び出します。
Sub DeleteFileWithFSO(): Dim FileSysObj As Object: Dim FileToDel As String: Set FileSysObj = CreateObject("Scripting.FileSystemObject"): FileToDel = "D:\Test\testFile.xlsx": FileSysObj.DeleteFile FileToDel, True: End Sub
2 番目の引数 True は、読み取り専用ファイルの削除を許可します。読み取り専用ファイルを保持したい場合は False に変更してください。この遅延バインディングの例は CreateObject を使用するため、Scripting Runtime へのプロジェクト参照を追加する必要はありません。
ファイルが存在しない可能性がある場合は、DeleteFile を呼び出す前に FileExists で確認してください。次のプロシージャはどちらの結果でもメッセージを表示し、パスが見つからない場合は削除をスキップします。
Sub DeleteFileAfterChecking()
Dim FileSysObj As Object
Dim FileToDelete As String
Set FileSysObj = CreateObject("Scripting.FileSystemObject")
FileToDelete = "D:\Test\testFile.xlsx"
If FileSysObj.FileExists(FileToDelete) Then
FileSysObj.DeleteFile FileToDelete, True
MsgBox "File Deleted"
Else
MsgBox "There is no file with the name you provided!"
End If
End Sub
FileExists は、プロシージャが DeleteFile を呼び出す前にパスを確認しますが、別のプロセスがその間にファイルを変更することを防ぐものではありません。アクセスや削除の失敗を処理する必要がある場合は、確認が削除を保証すると想定せず、ブックに適したエラー処理を追加してください。
この単独の PowerShell フィクスチャは、一時ファイルの作成と削除を示します。これはファイルシステムの図解であり、VBA コードでも Office ホストでの動作の証拠でもありません。
$path = Join-Path ([System.IO.Path]::GetTempPath()) ("vba-delete-demo-" + [guid]::NewGuid().ToString() + ".txt")
Set-Content -LiteralPath $path -Value "sample"
Remove-Item -LiteralPath $path
VBA ですべてのテキスト ファイルを削除する
1 つのフォルダーからテキストファイルを削除するには、ワイルドカードパスを使用します。D:\Test\Dst\*.txt はそのフォルダー直下の .txt ファイルに一致し、サブフォルダーは検索しません。この完全なプロシージャは、そのパターンを Kill に渡します。
Sub DeleteTxtFile(): Kill "D:\Test\Dst\*.txt": End Sub
プロシージャを実行する前に、フォルダーとその一致するファイル名を確認してください。一致するすべてのテキストファイルが対象です。このパターンはサブフォルダーを検索しません。フォルダーに一致する .txt ファイルがない場合、Kill は VBA ランタイムエラーを発生させるため、その状態が起こり得る場合は一致の集合を確認するかエラー処理を追加してください。意図した集合を確認した後にのみディレクトリを絞るか拡張子を変更し、可能な場合は無関係なファイルを選んだフォルダーの外に置いてください。これらの結果は VBA の文書化された動作セマンティクスに従います。この例について Windows/VBA の実行結果は観察されていません。
VBA ですべての Excel ファイルを削除する
1 つのフォルダー内の .xlsx ブックを対象にするには、対応するワイルドカードパスを使用します。この完全なプロシージャは、そのフォルダー直下の一致するブックを対象とし、ディレクトリツリー内のすべてのブックを対象とするものではありません。
Sub DeleteXlFile(): Kill "D:\Test\Dst\*.xlsx": End Sub
この一括削除を実行する前に、フォルダーと一致するブック名を確認してください。.xlsx パターンには .xls や .xlsm など他の Excel 形式は含まれません。それらの形式も意図する場合は、別の意図的なパターンを使用してください。ワイルドカードが削除するファイルだけを選ぶよう、ディレクトリを狭く保ってください。テキストファイルのパターンと同様に、一致するブックがない場合、Kill は VBA ランタイムエラーを発生させます。この動作は VBA のセマンティクスから説明されており、提供されたランタイム証拠では実行されていません。
VBAでフォルダを削除する
空のフォルダーを削除するには RmDir を使用します。この完全なプロシージャはサンプルディレクトリを指定します。
Sub DeleteFolder(): RmDir "D:\Test\Dst": End Sub
RmDir は、空でないフォルダー内のファイルやサブフォルダーを再帰的に削除しません。空のフォルダーが必要です。ファイルやサブフォルダーが残っている状態で呼び出すと、VBA ランタイムエラーが発生します。内容を別途移動または削除してから、フォルダー自体に対して RmDir を呼び出してください。プロシージャを実行する前に、パスが意図したディレクトリを指定していることを確認してください。これは文書化された VBA の動作ですが、空のフォルダーまたは空でないフォルダーに対する呼び出しについて、Windows/VBA のランタイム結果は観察されていません。