ファイルをごみ箱に移動して削除する

ファイル

はじめに

 VBAのKillステートメントや、FileSystemObjectのDeleteFileメソッドは、ファイルを完全に削除してしまうので、アンドゥが効きません。
 普段、ファイルの削除を行う場合は、ごみ箱に入れて削除していますが、このような処理を使う場合は、WindowsAPIを使う必要があります。
 ここでは、ファイルをごみ箱に移動して削除する方法を解説します。

 Killステートメントや、FileSystemObjectのDeleteFileメソッドを使ってファイルを削除する方法は以下のページを参照してください。
 ・ファイルを削除する(Kill, DeleteFile)

ごみ箱に移動して削除する方法

 ごみ箱に削除するには、WindowsAPISHFileOperation (SHFileOperationA) という関数を使います。
WindowsAPIの関数を使う場合は、あらかじめ関数の宣言が必要です。
更に、SHFileOperation 関数では、専用の構造体(SHFILEOPSTRUCT)の定義が必要になります。
また、値に関して定数を利用したい場合は、この定義も必要になります。

 まとめると、以下のような手順を踏むことになります。

・関数の定義 SHFileOperation
・関数で使用するユーザー定義型の定義 SHFILEOPSTRUCT
・定数の定義 FO_DELETE, FOF_ALLOWUNDO など

ごみ箱に削除するコード

 最も基本的な形を見ていきましょう。

Option Explicit

'SHFileOperation関数を使うための宣言
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 SampleTrash()
    Dim SH As SHFILEOPSTRUCT
    Dim res As Long
    Dim fname As String
    fname = Application.GetOpenFilename _
                        (Title:="削除するファイルを選択してください")
    If fname = "False" Then Exit Sub
    
    With SH
    .hwnd = Application.hwnd
    .wFunc = FO_DELETE
    .pFrom = fname
    .fFlags = FOF_ALLOWUNDO
    End With
    
    res = SHFileOperation(SH)
    If res <> 0 Then MsgBox "削除に失敗しました"
End Sub

コード解説

 まず最初に、SHFileOperation関数を使うための宣言を書きます。これはモジュールの冒頭に書く必要があります。
 Private属性が付いているの宣言は、他のモジュールではこの関数は使えないので注意してください。
 
 次に、SHFileOperation関数用のユーザー定義型を定義します。
 内容についてはコメントを参考にしてください。
 
 続いて定数を定義しています。こちらはWindowsAPIの定数を使えないのでVBAで定義しています。
 そのまま &H3 など代入しても構いませんが、意味がわかりずらいので普通は定数を使います。
 
 プロシージャですが、最初に変数の宣言をした後、 Application.GetOpenFilename で削除対象のファイル名を取得します。

 次にユーザー定義型の各変数に値を代入していきます。
 1番目のウインドウ・ハンドルは、Application.hwnd として自身のウインドウ・ハンドルを指定しています。
 ウインドウハンドルとは、現在表示されているウインドウに割り当てられた数値の事です。
 
 2番目の .wFunc = FO_DELETE は、操作に削除を指定しています。
 この関数は、削除以外にも、コピーや移動などの操作も指定できます。
 
 3番目の .pFrom = fname は、削除対象となるファイル名を指定します。
 
 4番目の fFlags (フラグ)は、操作に対するオプションを指定します。
 今回は、 FOF_ALLOWUNDO を指定してごみ箱への削除を行わせます。
 
 最後に、SHFileOperation の引数にユーザー定義型を指定してごみ箱への移動(削除)を実行します。
 成功すると戻り値は、0 を返します。

まとめ

 ごみ箱への移動(削除)は、WindowsAPIを使うので少々手続きが面倒ですが、いきなり削除してしまうよりも安心感があります。

 Killステートメントや、FileSystemObjectのDeleteFileメソッドを使ってファイルを削除する方法は以下のページを参照してください。
 ・ファイルを削除する(Kill, DeleteFile)

コメント

タイトルとURLをコピーしました