ごみ箱に削除する


番外編テクニック」の方に書くか迷ったのですが、こちらに書きます。

ファイルを削除するには、いくつかの方法があります。たとえばVBAの標準機能であるKillステートメントです。次のコードはC:\Sample.txtを削除します。

Sub Sample1()
    Kill "C:\Sample.txt"
End Sub

また、FileSystemObjectを使ってファイルを削除することもできます。次のコードも、C:\Sample.txtを削除します。なお、FileSystemObjectについては「FileSystemObjectの解説」をご覧ください。

Sub Sample2()
    With CreateObject("Scripting.FileSystemObject")
        .DeleteFile "C:\Sample.txt"
    End With
End Sub

どちらの方法も、削除したファイルはごみ箱には移動せず完全に削除されます。これはこれで便利なこともありますが、ときには、後で元に戻せるようにごみ箱へ移動したいケースもあるでしょう。ファイル(またはフォルダ)をごみ箱に移動するには、SHFileOperationというAPIを使います。SHFileOperationは、Windowsが標準で行うコピーや移動などのファイル操作を呼び出すAPIです。「ファイルを移動しています」などのメッセージと共に、ファイルが移動しているアニメーションを表示するにも、このSHFileOperationを使います。そうしたアニメーション付きのファイル操作を行う方法は「アニメ付きファイル操作」をご覧ください。

ファイルをごみ箱に削除するには、次のようにします。次のコードはダイアログボックスで選択したファイルをごみ箱に削除します。

''ごみ箱に送るためのAPI
Private Declare Function SHFileOperation Lib "shell32.dll" _
                            (lpFileOp As SHFILEOPSTRUCT) As Long
''SHFileOperation関数に渡すユーザー定義型
Private Type SHFILEOPSTRUCT
    hwnd As Long                      ''ウィンドウハンドル
    wFunc As Long                     ''実行する操作
    pFrom As String                   ''対象ファイル名
    pTo As String                     ''目的ファイル名
    fFlags As Integer                 ''フラグ
    fAnyOperationsAborted As Long     ''結果
    hNameMappings As Long             ''ファイル名マッピングオブジェクト
    lpszProgressTitle As String       ''ダイアログのタイトル
End Type
Private Const FO_DELETE = &H3         ''削除する
Private Const FOF_ALLOWUNDO = &H40    ''ごみ箱に送る

Sub DeleteFile()
    Dim SH As SHFILEOPSTRUCT, re As Long, Target As String
    Target = Application.GetOpenFilename(Title:="削除するファイルを選択してください")
    If Target = "False" Then Exit Sub
    With SH
        .hwnd = Application.hwnd
        .wFunc = FO_DELETE
        .pFrom = Target
        .fFlags = FOF_ALLOWUNDO
    End With
    re = SHFileOperation(SH)
    If re <> 0 Then MsgBox "削除に失敗しました", vbExclamation
End Sub