【ExcelVBA】フォルダをゴミ箱に移動する方法について

この記事では、フォルダをゴミ箱に移動する方法についてご説明します。

注意
本記事のマクロを使う時は、最初に大事なフォルダを使わずに、まずは確認用に不要なフォルダで試してから使うようにしてくださいね。

【動画】フォルダをゴミ箱に移動する実際の動き

本題に入る前に、まずは次の動画をご覧ください。


API関数SHFileOperationを実行して、指定のフォルダをゴミ箱に移動しています。

マクロ作成の流れ

STEP.1
フォルダをゴミ箱に移動するための情報を設定する
フォルダをゴミ箱に移動するための情報を設定します。
設定後はオートフィルが使用可になります。
STEP.2
STEP.1で設定された情報をAPI関数SHFileOperationの引数に指定して実行する
STEP.1で設定された情報をAPI関数SHFileOperationの引数に指定して実行します。
API関数SHFileOperationの処理が完了すると、フォルダがゴミ箱に移動されます。

コードの例

Excelのマクロのコード(例)

Option Explicit

'フォルダをごみ箱に送るのに使うAPI関数SHFileOperationを宣言
Private Declare PtrSafe Function SHFileOperation Lib "SHELL32.DLL" _
(lpFileOp As SHFILEOPSTRUCT) As LongLong

'フォルダ操作に関する情報を定義する構造体(オプション)
Private Type SHFILEOPSTRUCT
    hwnd As LongPtr                         'ウィンドウハンドル
    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          'ゴミ箱に移動する
Private Const FOF_NOCONFIRMATION = &H10&    '確認なし
Private Const FOF_NOERRORUI = &H400&        'エラーのダイアログを非表示にする
Private Const FOF_MULTIDESTFILES = &H1&     '複数フォルダ指定

Private Sub btn_AFEnblCng_Click()
    
    Dim SH          As SHFILEOPSTRUCT           'フォルダ操作に関する情報を定義する構造体(オプション)
    Dim result      As LongPtr                  '処理結果
    Dim MyFlag      As Integer                  'オプション
    
    With SH
    
        .hwnd = Application.hwnd                'ウィンドウハンドル
        .wFunc = FO_DELETE                      '削除する
        .pFrom = Range("fileFPath").Value       '削除対象のフォルダ名を取得する
        
    'オプションの設定
        MyFlag = MyFlag + FOF_ALLOWUNDO         'ゴミ箱に移動する
        MyFlag = MyFlag + FOF_NOCONFIRMATION    '確認なし
        MyFlag = MyFlag + FOF_NOERRORUI         'エラーのダイアログを非表示にする
        MyFlag = MyFlag + FOF_MULTIDESTFILES    '複数フォルダ指定
        
        .fFlags = MyFlag                        'オプションを取得する
        
    End With
    
    'SHFileOperation関数を実行し、フォルダをゴミ箱に移動する
    result = SHFileOperation(SH)

End Sub

コードの解説

注目すべきコード①

最初に見て頂きたいのは4、5行目です。

'フォルダをごみ箱に送るのに使うAPI関数SHFileOperationを宣言
Private Declare PtrSafe Function SHFileOperation Lib "SHELL32.DLL" _
(lpFileOp As SHFILEOPSTRUCT) As LongLong

4、5行目で、フォルダをごみ箱に送るのに使うAPI関数SHFileOperationを宣言します。

API関数を使う場合は上記のコードのようにAPI関数の宣言をしないと使えないので、必ずAPI関数の宣言のコードを記述します。

上記のコードが記述されたことでAPI関数SHFileOperationが使えるようになります。

記述しないと下のようにエラーが発生するので忘れないようにしましょう。

注目すべきコード②

次に見て頂きたいのは8行目から23行目です。

'フォルダ操作に関する情報を定義する構造体(オプション)
Private Type SHFILEOPSTRUCT
    hwnd As LongPtr                         'ウィンドウハンドル
    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          'ゴミ箱に移動する
Private Const FOF_NOCONFIRMATION = &H10&    '確認なし
Private Const FOF_NOERRORUI = &H400&        'エラーのダイアログを非表示にする
Private Const FOF_MULTIDESTFILES = &H1&     '複数フォルダ指定

8行目から17行目まではフォルダ操作に関する情報を定義する構造体の記述で、ゴミ箱に移動するフォルダ名やオプションなどを格納する変数を、SHFILEOPSTRUCTの構造体の中に宣言しています。

19行目から23行目では、ゴミ箱に移動する、エラーのダイアログを非表示にするなどの操作に関する定数を宣言しています。

注目すべきコード③

次に見て頂きたいのは31行目から45行目です。

    With SH

        .hwnd = Application.hwnd                'ウィンドウハンドル
        .wFunc = FO_DELETE                      '削除する
        .pFrom = Range("fileFPath").Value       '削除対象のフォルダ名を取得する
        
    'オプションの設定
        MyFlag = MyFlag + FOF_ALLOWUNDO         'ゴミ箱に移動する
        MyFlag = MyFlag + FOF_NOCONFIRMATION    '確認なし
        MyFlag = MyFlag + FOF_NOERRORUI         'エラーのダイアログを非表示にする
        MyFlag = MyFlag + FOF_MULTIDESTFILES    '複数フォルダ指定
        
        .fFlags = MyFlag                        'オプションを取得する
        
    End With

33行目から35行目では、フォルダをゴミ箱に移動する、どのフォルダをゴミ箱に移動するなどの設定を、SH(SHFILEOPSTRUCT構造体)の変数(hwndやpFromなど)に設定しています。

38行目から41行目では、オプション(ゴミ箱に移動する、エラーのダイアログを非表示にするなど)を変数「MyFlag」に設定しています。

ゴミ箱に移動するのに必要な情報は以上で揃いました。

注目すべきコード④

次に見て頂きたいのは48行目です。

    'SHFileOperation関数を実行し、フォルダをゴミ箱に移動する
    result = SHFileOperation(SH)

上記のコードでは、SH(SHFILEOPSTRUCT構造体)をSHFileOperation関数の引数に指定し実行しています。

実行が完了すると、フォルダがゴミ箱に移動されます。

動作確認

①マクロ実行前:フォルダ名指定削除(完全一致)

パス「C:\work\10_勉強\10_VBA関連\0132\test」というフォルダにあるフォルダ「cs」をゴミ箱に移動するよう指定。

パス「C:\work\10_勉強\10_VBA関連\0132\test」にはフォルダ「cs」が存在している。

①マクロ実行後

マクロ実行後は、パス「C:\work\10_勉強\10_VBA関連\0132\test」からフォルダ「cs」がなくなっている。

ゴミ箱を見てみると、フォルダ「cs」が存在している。

以上で、正常にフォルダがゴミ箱に移動されたことが確認できました。

②マクロ実行前:フォルダ名を一部指定して削除(前方一致)

パス「C:\work\10_勉強\10_VBA関連\0132\test」というフォルダに、「af」で始まる名前のフォルダをゴミ箱に移動するよう指定。

パス「C:\work\10_勉強\10_VBA関連\0132\test」には「af」で始まる名前のフォルダが存在している。

②マクロ実行後

マクロ実行後は、パス「C:\work\10_勉強\10_VBA関連\0132\test」から「af」で始まる名前のフォルダがなくなっている。

ゴミ箱を見てみると、「af」で始まる名前のフォルダが存在している。

以上で、正常にフォルダがゴミ箱に移動されたことが確認できました。

③マクロ実行前:フォルダ名を一部指定して削除(後方一致)

パス「C:\work\10_勉強\10_VBA関連\0132\test」というフォルダに、最後尾に「fg」がつく名前のフォルダをゴミ箱に移動するよう指定。

パス「C:\work\10_勉強\10_VBA関連\0132\test」には、最後尾に「fg」がつく名前のフォルダが存在している。

③マクロ実行後

マクロ実行後は、パス「C:\work\10_勉強\10_VBA関連\0132\test」から、最後尾に「fg」がつく名前のフォルダがなくなっている。

ゴミ箱を見てみると、最後尾に「fg」がつく名前のフォルダが存在している。

以上で、正常にフォルダがゴミ箱に移動されたことが確認できました。

④マクロ実行前:フォルダ名を一部指定して削除(部分一致)

パス「C:\work\10_勉強\10_VBA関連\0132\test」というフォルダに、フォルダ名の中に「-」が含まれる名前のフォルダをゴミ箱に移動するよう指定。

パス「C:\work\10_勉強\10_VBA関連\0132\test」には、フォルダ名の中に「-」が含まれる名前のフォルダが存在している。

④マクロ実行後

マクロ実行後は、パス「C:\work\10_勉強\10_VBA関連\0132\test」から、フォルダ名の中に「-」が含まれる名前のフォルダがなくなっている。

ゴミ箱を見てみると、フォルダ名の中に「-」が含まれる名前のフォルダが存在している。

以上で、正常にフォルダがゴミ箱に移動されたことが確認できました。

⑤マクロ実行前:フォルダを全て削除

パス「C:\work\10_勉強\10_VBA関連\0132\test」というフォルダ内にあるファイルを全てゴミ箱に移動するよう指定。

パス「C:\work\10_勉強\10_VBA関連\0132\test」には下の通りフォルダが存在している。

⑤マクロ実行後

マクロ実行後は、パス「C:\work\10_勉強\10_VBA関連\0132\test」からファイル全てがなくなっている。

ゴミ箱を見てみると、パス「C:\work\10_勉強\10_VBA関連\0132\test」にあったファイル全てが存在している。

以上で、正常にファイルがゴミ箱に移動されたことが確認できました。

最後に

本記事では、フォルダをゴミ箱に移動する方法についてご説明しました。

マクロでフォルダをゴミ箱に移動したい場合は是非参考にしてみてくださいね。

プログラミングのスキルを習得するなら

プログラミングのスキルを習得したい、今のスキルをもっと高めたい、そう考えているなら「プログラミングスクール」がおすすめです。

プログラミングのスキルの基礎を身につけるなら「TechAcademy」で1週間の無料体験があるので、これで「プログラミングの基礎」を学ぶのにおすすめですよ。

→ TechAcademyの「1週間 無料体験」はこちら