はじめに
VBAでファイルを削除する際、Kill
ステートメントや FileSystemObject
の .DeleteFile
メソッドを使うと、ファイルは完全に削除されてしまい、元に戻すことができません。もし操作を誤ると、重要なデータを失ってしまう危険性があります。
WindowsのUIと同じように、「削除したファイルをごみ箱に移動させたい」という、より安全な削除処理を実装するには、Windows APIの SHFileOperation
関数を利用します。
この記事では、SHFileOperation
APIを使って、指定したファイルやフォルダをごみ箱へ安全に移動させる方法を、必要な定義を含めて網羅的に解説します。
ファイルをごみ箱に移動するVBAサンプルコード
このマクロは、デスクトップ上にある TempFile.txt
というファイルをごみ箱に移動させます。
APIを利用するための Declare
ステートメント、Type
(構造体)、Const
(定数)は、モジュールの最上部(Sub
などのプロシージャよりも前)に記述する必要があります。
完成コード
'--- モジュールの最上部にAPI関数、構造体、定数を宣言 ---
' 64bit/32bit両対応
#If VBA7 Then
' ファイル操作を行うためのAPI関数
Private Declare PtrSafe Function SHFileOperation Lib "shell32.dll" Alias "SHFileOperationA" (lpFileOp As SHFILEOPSTRUCT) As Long
#Else
Private Declare Function SHFileOperation Lib "shell32.dll" Alias "SHFileOperationA" (lpFileOp As SHFILEOPSTRUCT) As Long
#End If
' SHFileOperation関数が使用する構造体
Private Type SHFILEOPSTRUCT
hwnd As LongPtr
wFunc As Long
pFrom As String
pTo As String
fFlags As Integer
fAnyOperationsAborted As Boolean
hNameMappings As LongPtr
lpszProgressTitle As String
End Type
' 実行する操作の種類を指定する定数
Private Const FO_DELETE As Long = &H3 ' 削除操作
' 操作のオプションを指定するフラグ定数
Private Const FOF_ALLOWUNDO As Integer = &H40 ' ごみ箱を使い、元に戻せるようにする
' デスクトップ上の "TempFile.txt" をごみ箱に移動する
Sub MoveFileToRecycleBin()
Dim fileOp As SHFILEOPSTRUCT ' ファイル操作のパラメータを格納する構造体変数
Dim targetFilePath As String
' デスクトップのパスを取得し、対象ファイルのフルパスを作成
targetFilePath = CreateObject("WScript.Shell").SpecialFolders("Desktop") & "\TempFile.txt"
' テスト用のダミーファイルを作成
Open targetFilePath For Output As #1: Print #1, "これはテストファイルです。": Close #1
'--- 構造体の各メンバーを設定 ---
With fileOp
.hwnd = Application.hwnd ' 親ウィンドウのハンドル
.wFunc = FO_DELETE ' 操作の種類: 削除
.pFrom = targetFilePath & vbNullChar ' 操作対象のファイルパス
.fFlags = FOF_ALLOWUNDO ' オプション: ごみ箱を使用
End With
'--- API関数を実行 ---
If SHFileOperation(fileOp) = 0 Then
MsgBox "ファイルをごみ箱に移動しました。", vbInformation
Else
MsgBox "ファイルの移動に失敗しました。", vbCritical
End If
End Sub
コードの解説
SHFILEOPSTRUCT
構造体
SHFileOperation
APIは、引数として一つの構造体(複数の変数をまとめたもの)を受け取ります。この構造体の各メンバーに、どのようなファイル操作を行いたいかの詳細を設定します。
.hwnd
: 親となるウィンドウのハンドルを指定します。通常はApplication.hwnd
でExcelのウィンドウハンドルを設定します。.wFunc
: 実行したい操作の種類を定数で指定します。FO_DELETE
は削除を意味します。他にもFO_COPY
(コピー)やFO_MOVE
(移動)などがあります。.pFrom
: 操作対象となるファイルやフォルダのパスを文字列で指定します。複数のファイルを対象にする場合は、vbNullChar
で区切って連結します。文字列の最後は、vbNullChar
二つで終端させる必要がありますが、単一ファイルの場合は一つで十分です。.fFlags
: 操作のオプションを定数で指定します。FOF_ALLOWUNDO
を指定することで、ファイルが完全に削除されるのではなく、ごみ箱に移動されるようになります。これがこのテクニックの最も重要なポイントです。
SHFileOperation(fileOp)
設定済みの構造体変数 fileOp
を引数として SHFileOperation
APIを呼び出します。この関数は、処理が成功した場合は 0
を、失敗した場合は 0
以外のエラーコードを返します。この戻り値をチェックすることで、処理が正常に完了したかを確認できます。
まとめ
今回は、Windows APIの SHFileOperation
を使って、VBAからファイルやフォルダをごみ箱に安全に移動させる方法を解説しました。
SHFileOperation
APIで、コピー、移動、削除などの高度なファイル操作ができる。- パラメータは
SHFILEOPSTRUCT
構造体にまとめて渡す。 .wFunc
で操作の種類(例:FO_DELETE
)を、.fFlags
でオプション(例:FOF_ALLOWUNDO
)を指定する。
Kill
ステートメントによる完全削除は、元に戻せないためリスクが伴います。ユーザーが誤って操作した場合の安全性を考慮するなら、この SHFileOperation
を使った「ごみ箱への移動」を実装するのが、より親切で堅牢なマクロ開発の作法と言えるでしょう。