#113 エクスプローラ風のファイル削除 VBA、API

AccessのVBAには、ファイルを削除する手段として「Killステートメント」が用意されています。しかし、WindowsAPIを使うと、エクスプローラと同じようにしてファイルの削除を行うことができます。

それには、エクスプローラ風のファイルのコピーや移動と同様に、"SHELL32.DLL"にあるWindowsAPIの「SHFileOperation」関数を使用します。

まず標準モジュールに次のコードを記述します。"Type"と"Declare"の部分はファイルのコピーや移動の場合と同じです。
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

Declare Function SHFileOperation Lib "SHELL32.DLL" Alias _
                      "SHFileOperationA" (lpFileOp As SHFILEOPSTRUCT) As Long

Const FO_DELETE = &H3
Const FOF_ALLOWUNDO = &H40

次の例では、ファイル"c:\My Documents\Test.mdb"を削除します。
Dim stShellOp As SHFILEOPSTRUCT
Const cstrSrcFile As String = "c:\My Documents\Test.mdb"

With stShellOp
  'Accessのハンドルをセット
  .hWnd = Application.hWndAccessApp
  '削除モードを指定
  .wFunc = FO_DELETE
  '削除ファイルのフルパスをセット
  .pFrom = cstrSrcFile
  '.fFlags = FOF_ALLOWUNDO
End With

'削除を実行
If SHFileOperation(stShellOp) = 0 Then
  Beep
  MsgBox "削除が完了またはキャンセルされました!"
Else
  Beep
  MsgBox "削除に失敗しました!"
End If

  • 上記のコードを実行したとき、削除ファイルに読み取り専用属性がついていると、エクスプローラと同様に読み取り専用の削除確認ダイアログが表示されます。
    読み取り専用の削除確認ダイアログ
  • 上記のコードは、エクスプローラでShiftキーを押しながらDeleteするのと同じで、ディスク上から完全に削除されます。一方、With stShellOp 〜 End With の間に次の1行を追加すると、「ごみ箱に移してもよろしいですか?」というメッセージが表示され、指定したファイルを「ごみ箱」に移動することができます。これによって、後で元に戻すことが可能となります。
        .fFlags = FOF_ALLOWUNDO
    ごみ箱へ移動の確認ダイアログ
※削除の場合、コピーや移動時以上に、よほど大きなファイルサイズでない限り、削除中のダイアログは表示されません。
| Index | Prev | Next |



T'sFactory
Accessで動く生産管理DB
Ureru Express
Webで使う販売顧客管理
Access開発&アドバイス
DB開発やテクニカルアドバイス
Copyright © T'sWare All rights reserved