← コード一覧へ戻る
実務ファイル

ごみ箱へ削除する

上級者向け・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画面ではありません。

  1. 手動:テストファイルを準備

    C:\Data\sample.txt ローカル固定ドライブ上で、別の場所にバックアップする

  2. マクロ:実行条件を確認

    存在・ドライブ種別・API構造体サイズを確認する

  3. 手動:確認に答える

    対象パスを読んで判断する 完全削除の警告が出たらキャンセル

  4. マクロ:Windowsへ削除要求

    ごみ箱利用を許可するフラグでSHFileOperationWを呼ぶ

  5. 手動:結果を確かめる

    ごみ箱にsample.txtがあるか確認する 中止・失敗なら元の場所も確認する

[いいえ]や条件不一致なら処理しません。正常終了の表示だけではごみ箱への投入を断定できません。設定・容量次第で復元可能とは限らないため、完全削除を承認しないでください。

コードの処理を説明する模式図です。実際の画面や実行結果を撮影したものではありません。

使い方・実行手順を確認する4つの手順で、コードの使い方を確認できます
  1. 1

    Windows版Excel 2010以降のVBA7が対象です。練習ブックを.xlsm形式で保存し、Alt+F11→[挿入]→[標準モジュール]を選びます。宣言・Type定義も含め、コード全体を空の標準モジュールの先頭へ貼り付けます。

  2. 2

    ローカル固定ドライブ上に不要な小さなテストファイルを作り、別の場所にバックアップします。filePathをそのファイルの絶対パスへ変更します。ネットワーク・USBドライブは対象外です。

  3. 3

    「ごみ箱へ移す」のSub内へカーソルを置き、F5キーを押します。確認画面のパスを読んでから判断します。その後Windowsが完全削除を警告した場合は、必ずキャンセルします。

  4. 4

    正常終了のメッセージだけではごみ箱への投入を断定できません。対象がごみ箱にあることを確認します。中止・失敗なら元ファイルが残っているか確認し、理由を調べずに再実行しないでください。

使っている機能の公式ドキュメント(Microsoft Learn)