VBAでの一般的な削除処理はゴミ箱に移動せず完全削除される

VBAにはファイル削除の方法としていくつかあります。

  1. VBA標準のKillステートメント(一番簡単
  2. FileSystemObjectのDeleteFileメソッド
  3. FileオブジェクトのDeleteメソッド
  4. Shell32ライブラリのShellオブジェクトのMoveHereメソッド
  5. Win32APIのDeleteFile関数

これらの方法で実行すると、いずれの場合もファイルが完全に削除されます。ゴミ箱には行きませんマウス操作でファイルを削除した場合の「完全に削除しますか」→「はい」の状態です。

VBAで処理をする場合、いらないファイルを消すというのは本当に要らないから消すことが一般的なため、ゴミ箱に一時的に残しておく必要はまずないですが、人が操作したときと同じようにゴミ箱に残しておきたい場合には上記の方法では困ります。

そこで、以下ではマウス操作の削除のようにゴミ箱に移動させる方法を紹介します。

VBAでゴミ箱に移動させる方法

VBAでゴミ箱に移動させるにはWin32APIのSHFileOperation関数を利用します。Win32APIについては「VBAでWin32APIを使う方法と定義一式」をご参照ください。

後述のサンプルコードに全部書いていますのでダウンロードは不要ですが、当ページで利用しているWin32APIの定数、構造体、関数の定義が書かれているWin32API_PrtSafe.TXTもダウンロードできるようにしています。

Declare PtrSafe Function SHFileOperation Lib “shell32.dll” Alias “SHFileOperationA” (lpFileOp As SHFILEOPSTRUCT) As Long

引数にはSHFILEOPSTRUCT構造体を指定します。

SHFileOperation関数は、Windowsでのマウスやキーボードを使ったファイル操作を行った場合と同様の動作を行うことが出来ます。

上で挙げたファイル削除方法は、ファイルが完全に削除されますが、SHFileOperation関数ではゴミ箱に移動させる削除が可能になります。

ただし以下の制約があります。

ネットワークドライブのファイル削除はゴミ箱に行かず完全削除される

ここではSHFileOperation関数でのごみ箱への移動方法を主に書いていますが、コピーや移動などの操作の場合も、Windowsの制約がSHFileOperation関数の挙動に引き継がれます

例えば、Windowsでのファイルの削除は、Cドライブなどのローカルディスクにある場合とネットワークドライブにある場合とでは挙動が異なり、ローカルディスクの場合はゴミ箱への移動が可能ですが、ネットワークドライブの場合はゴミ箱を経由できずに完全削除しかできません。これはSHFileOperation関数を使った場合も同様です。

エクスプローラーを使って、ネットワークドライブ上のファイルを削除しようとすると、右クリックで削除した場合は「完全に削除しますか?」と聞かれ、「はい」を押すとゴミ箱に行かず削除されます。また、エクスプローラの削除メニューの「ゴミ箱に移動」はグレーアウトしており利用できません。これが、ローカルディスクであればゴミ箱への移動が可能になります。

一応、ネットワーク上のファイルをゴミ箱での削除を行うようにすることは可能ですが、ネットーワークドライブ側の共有設定だったり特殊なアプリを使う必要があったりと、設定のここをいじればOK、みたいな話ではありません。

そのため、以下のコードではローカルディスク上のファイルを削除した場合にゴミ箱に行きますが、ネットワークドライブ上のファイルを削除した場合はゴミ箱に行かず完全削除になります。

コード

SHFileOperation関数を利用するにはSHFileOperation関数自体のDeclare宣言と、SHFILEOPSTRUCT構造体の定義が必要です。

サンプルコードのSHFileOperation関数自体のDeclare宣言と、SHFILEOPSTRUCT構造体の定義はWin32API_PrtSafe.TXTの内容をそのまま引用しています。

SHFILEOPSTRUCT構造体には8つの変数がありますが、ゴミ箱への削除の場合はコードの通り4つを設定すればOKです。

定数もWin32API_PrtSafe.TXTの内容をそのまま引用していますが、使わない定数は無くても構いません。具体的には、FO_DELETE、FOF_ALLOWUNDO、FOF_NOCONFIRMATIONの3つのConstが書いてあればOKです。

利用している定数の説明ですが、定数FO_DELETEはファイルやフォルダの削除を行う際に指定します。注意点としてPで始まるPO_DELETEがありますが、こちらを使うとエラーになります。実行してもファイルが削除されずエラー87が発生する場合は、FO_DELETEではなく間違ってPO_DELETEを指定していないか確認してください。

FOF_ALLOWUNDOは取消情報の保持を許可します。ファイル削除の場合は、ゴミ箱への移動を行い、ゴミ箱から元に戻すことを意味します。

FOF_NOCONFIRMATIONはダイアログのボタンを「はい」を押した状態として扱います。ファイル削除の場合にFOF_NOCONFIRMATIONが無く、FOF_ALLOWUNDOしか指定されていない場合は、ファイルを削除することを確認するダイアログが表示されます。