ごみ箱へ削除する
上級者向け・Windows API、実機検証が必要な例です。1ファイルをごみ箱へ移す指定で削除を依頼しますが、復元可能な削除を保証しません。
実行前に確認
- Windows APIを扱う発展的な例です。宣言、構造体、StrPtr、2つの終端文字を省略・変更しないでください。Mac版Excelでは動きません。
- ごみ箱の設定・容量・対象ファイルによって復元可能とは限りません。このコードはごみ箱への投入成功を断定しません。重要なファイルで使わず、完全削除の警告を承認しないでください。
- Shell.Application.Namespace(10).MoveHereを、ごみ箱へ移す確実な方法としては使いません。
1サンプルコード
Private Type SHFILEOPSTRUCT_SAFE
hwnd As LongPtr
wFunc As Long
#If Win64 Then
padding1 As Long
#End If
pFrom As LongPtr
pTo As LongPtr
fFlags As Integer
padding2 As Integer
fAnyOperationsAborted As Long
hNameMappings As LongPtr
lpszProgressTitle As LongPtr
End Type
Private Declare PtrSafe Function SHFileOperationW Lib "shell32.dll" _
(ByRef operation As SHFILEOPSTRUCT_SAFE) As Long
Sub ごみ箱へ移す()
Dim operation As SHFILEOPSTRUCT_SAFE
Dim filePath As String, paths As String
Dim result As Long, fso As Object, drive As Object
On Error GoTo Failed
filePath = "C:\Data\sample.txt"
Set fso = CreateObject("Scripting.FileSystemObject")
If Not fso.FileExists(filePath) Then Err.Raise 53, , "ファイルがありません"
filePath = fso.GetAbsolutePathName(filePath)
Set drive = fso.GetDrive(fso.GetDriveName(filePath))
If drive.DriveType <> 2 Then
MsgBox "この例はローカル固定ドライブの練習用ファイルだけを対象にします"
Exit Sub
End If
#If Win64 Then
If LenB(operation) <> 56 Then Err.Raise 5, , "API構造体のサイズが違います"
#Else
If LenB(operation) <> 32 Then Err.Raise 5, , "API構造体のサイズが違います"
#End If
If MsgBox(filePath & vbCrLf & "ごみ箱へ移しますか?完全削除の警告が出たらキャンセルしてください。", _
vbYesNo + vbExclamation + vbDefaultButton2) <> vbYes Then Exit Sub
paths = filePath & vbNullChar & vbNullChar
operation.hwnd = Application.hwnd
operation.wFunc = 3 'FO_DELETE
operation.pFrom = StrPtr(paths)
'FOF_ALLOWUNDO + FOF_WANTNUKEWARNING + FOF_NO_CONNECTED_ELEMENTS
operation.fFlags = &H40 Or &H4000 Or &H2000
result = SHFileOperationW(operation)
If result <> 0 Or operation.fAnyOperationsAborted <> 0 Then
MsgBox "中止または失敗しました。結果コード: " & result
Else
MsgBox "処理が終了しました。ごみ箱に対象ファイルがあることを確認してください"
End If
Exit Sub
Failed:
MsgBox "処理を中止しました: " & Err.Description
End Sub図で見るファイルの変化
イメージ図コードの動きを表した概念図です。実際のExcel画面ではありません。
手動:テストファイルを準備
C:\Data\sample.txt ローカル固定ドライブ上で、別の場所にバックアップする
マクロ:実行条件を確認
存在・ドライブ種別・API構造体サイズを確認する
手動:確認に答える
対象パスを読んで判断する 完全削除の警告が出たらキャンセル
マクロ:Windowsへ削除要求
ごみ箱利用を許可するフラグでSHFileOperationWを呼ぶ
手動:結果を確かめる
ごみ箱にsample.txtがあるか確認する 中止・失敗なら元の場所も確認する
[いいえ]や条件不一致なら処理しません。正常終了の表示だけではごみ箱への投入を断定できません。設定・容量次第で復元可能とは限らないため、完全削除を承認しないでください。
コードの処理を説明する模式図です。実際の画面や実行結果を撮影したものではありません。
使い方・実行手順を確認する4つの手順で、コードの使い方を確認できます
- 1
Windows版Excel 2010以降のVBA7が対象です。練習ブックを.xlsm形式で保存し、Alt+F11→[挿入]→[標準モジュール]を選びます。宣言・Type定義も含め、コード全体を空の標準モジュールの先頭へ貼り付けます。
- 2
ローカル固定ドライブ上に不要な小さなテストファイルを作り、別の場所にバックアップします。filePathをそのファイルの絶対パスへ変更します。ネットワーク・USBドライブは対象外です。
- 3
「ごみ箱へ移す」のSub内へカーソルを置き、F5キーを押します。確認画面のパスを読んでから判断します。その後Windowsが完全削除を警告した場合は、必ずキャンセルします。
- 4
正常終了のメッセージだけではごみ箱への投入を断定できません。対象がごみ箱にあることを確認します。中止・失敗なら元ファイルが残っているか確認し、理由を調べずに再実行しないでください。