【VBA】ファイルやフォルダを完全に削除せず、ごみ箱に移動する方法 (API)

目次

はじめに

VBAでファイルを削除する際、Kill ステートメントや FileSystemObject.DeleteFile メソッドを使うと、ファイルは完全に削除されてしまい、元に戻すことができません。もし操作を誤ると、重要なデータを失ってしまう危険性があります。

WindowsのUIと同じように、「削除したファイルをごみ箱に移動させたい」という、より安全な削除処理を実装するには、Windows APIの SHFileOperation 関数を利用します。

この記事では、SHFileOperation APIを使って、指定したファイルやフォルダをごみ箱へ安全に移動させる方法を、必要な定義を含めて網羅的に解説します。


ファイルをごみ箱に移動するVBAサンプルコード

このマクロは、デスクトップ上にある TempFile.txt というファイルをごみ箱に移動させます。

APIを利用するための Declareステートメント、Type(構造体)、Const(定数)は、モジュールの最上部Sub などのプロシージャよりも前)に記述する必要があります。

完成コード

'--- モジュールの最上部にAPI関数、構造体、定数を宣言 ---

' 64bit/32bit両対応
#If VBA7 Then
    ' ファイル操作を行うためのAPI関数
    Private Declare PtrSafe Function SHFileOperation Lib "shell32.dll" Alias "SHFileOperationA" (lpFileOp As SHFILEOPSTRUCT) As Long
#Else
    Private Declare Function SHFileOperation Lib "shell32.dll" Alias "SHFileOperationA" (lpFileOp As SHFILEOPSTRUCT) As Long
#End If

' SHFileOperation関数が使用する構造体
Private Type SHFILEOPSTRUCT
    hwnd As LongPtr
    wFunc As Long
    pFrom As String
    pTo As String
    fFlags As Integer
    fAnyOperationsAborted As Boolean
    hNameMappings As LongPtr
    lpszProgressTitle As String
End Type

' 実行する操作の種類を指定する定数
Private Const FO_DELETE As Long = &H3 ' 削除操作

' 操作のオプションを指定するフラグ定数
Private Const FOF_ALLOWUNDO As Integer = &H40 ' ごみ箱を使い、元に戻せるようにする


' デスクトップ上の "TempFile.txt" をごみ箱に移動する
Sub MoveFileToRecycleBin()
    Dim fileOp As SHFILEOPSTRUCT ' ファイル操作のパラメータを格納する構造体変数
    Dim targetFilePath As String
    
    ' デスクトップのパスを取得し、対象ファイルのフルパスを作成
    targetFilePath = CreateObject("WScript.Shell").SpecialFolders("Desktop") & "\TempFile.txt"
    
    ' テスト用のダミーファイルを作成
    Open targetFilePath For Output As #1: Print #1, "これはテストファイルです。": Close #1

    '--- 構造体の各メンバーを設定 ---
    With fileOp
        .hwnd = Application.hwnd ' 親ウィンドウのハンドル
        .wFunc = FO_DELETE       ' 操作の種類: 削除
        .pFrom = targetFilePath & vbNullChar ' 操作対象のファイルパス
        .fFlags = FOF_ALLOWUNDO  ' オプション: ごみ箱を使用
    End With
    
    '--- API関数を実行 ---
    If SHFileOperation(fileOp) = 0 Then
        MsgBox "ファイルをごみ箱に移動しました。", vbInformation
    Else
        MsgBox "ファイルの移動に失敗しました。", vbCritical
    End If
End Sub

コードの解説

SHFILEOPSTRUCT 構造体

SHFileOperation APIは、引数として一つの構造体(複数の変数をまとめたもの)を受け取ります。この構造体の各メンバーに、どのようなファイル操作を行いたいかの詳細を設定します。

  • .hwnd: 親となるウィンドウのハンドルを指定します。通常は Application.hwnd でExcelのウィンドウハンドルを設定します。
  • .wFunc: 実行したい操作の種類を定数で指定します。FO_DELETE は削除を意味します。他にも FO_COPY(コピー)や FO_MOVE(移動)などがあります。
  • .pFrom: 操作対象となるファイルやフォルダのパスを文字列で指定します。複数のファイルを対象にする場合は、vbNullChar で区切って連結します。文字列の最後は、vbNullChar 二つで終端させる必要がありますが、単一ファイルの場合は一つで十分です。
  • .fFlags: 操作のオプションを定数で指定します。FOF_ALLOWUNDO を指定することで、ファイルが完全に削除されるのではなく、ごみ箱に移動されるようになります。これがこのテクニックの最も重要なポイントです。

SHFileOperation(fileOp)

設定済みの構造体変数 fileOp を引数として SHFileOperation APIを呼び出します。この関数は、処理が成功した場合は 0 を、失敗した場合は 0 以外のエラーコードを返します。この戻り値をチェックすることで、処理が正常に完了したかを確認できます。


まとめ

今回は、Windows APIの SHFileOperation を使って、VBAからファイルやフォルダをごみ箱に安全に移動させる方法を解説しました。

  • SHFileOperation APIで、コピー、移動、削除などの高度なファイル操作ができる。
  • パラメータは SHFILEOPSTRUCT 構造体にまとめて渡す。
  • .wFunc で操作の種類(例: FO_DELETE)を、.fFlags でオプション(例: FOF_ALLOWUNDO)を指定する。

Kill ステートメントによる完全削除は、元に戻せないためリスクが伴います。ユーザーが誤って操作した場合の安全性を考慮するなら、この SHFileOperation を使った「ごみ箱への移動」を実装するのが、より親切で堅牢なマクロ開発の作法と言えるでしょう。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次