Excelマクロ・VBA 指定フォルダ内のファイルを一括削除する方法

2020年5月5日

Excel特有の用事ではありませんが、

特定のフォルダ内のファイルを一括削除したい場合があります。

そのような時に便利なブックとマクロ・VBAを紹介します。

サンプルファイル

使用方法

「実行」シートで行いたい処理、「ゴミ箱へ移動」か「削除」を選択し

「実行」ボタンを押下すると選択ダイアログが表示されるので

ファイル削除を表示したいフォルダを選択します。

※「削除」を実行したファイルを復元できない点ご注意ください。

選択ダイアログで「OK」ボタンを押下すると「結果」シートに選択したフォルダと

削除したファイルの一覧、ファイル数が表示されます。

コードサンプルと説明

ファイル一括削除だけなら先述の手順だけでよいですが

カスタマイズしたい方やマクロの中身を知りたい方向けに

ソースコードの説明は下記のとおりです。

Option Explicit
' API用の引数構造体
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

' ゴミ箱に入れるAPI
Private Declare Function SHFileOperation Lib "shell32.dll" _
    (lpFileOp As SHFILEOPSTRUCT) As Long
    
Dim exeSheet As Worksheet
Dim resultSheet As Worksheet
Dim dirPath As String '検索対象フォルダを格納する変数

Sub ClickDeleteButton()
    Set exeSheet = Worksheets("実行")
    Set resultSheet = Worksheets("結果")
    
    ' 削除対象ファイルの一覧を表示
    Call DirSet
    
    ' 実行シートの選択値によって処理を変える
    If exeSheet.Range("C5").Value = 1 Then
        Call MoveTrash  ' ゴミ箱に移動
    ElseIf exeSheet.Range("C5").Value = 2 Then
        Call Delete ' 完全削除
    End If
    
    MsgBox "完了しました。"
End Sub

Sub Delete()
    If dirPath <> "" Then
        Dim fileName As String
        fileName = dir(dirPath & "*.*") ' 1ファイル目を取得
        
        ' 全ファイル名を繰り返す
        Do While fileName <> ""
            '指定ファイルを完全削除
            Kill dirPath & fileName
            fileName = dir() ' 次のファイル名を取得(無ければ空白)
        Loop
    End If
End Sub

Sub MoveTrash()
    Dim sh As SHFILEOPSTRUCT
    Dim result As Long
    If dirPath <> "" Then
    
        Dim fileName As String
        fileName = dir(dirPath & "*.*") ' 1ファイル目を取得
        
        ' 全ファイル名を繰り返す
        Do While fileName <> ""
            '指定ファイルをごみ箱移動
            With sh
                .hwnd = Application.hwnd
                .wFunc = &H3
                .pFrom = dirPath & fileName
                .fFlags = &H40
            End With
            result = SHFileOperation(sh)
            
            fileName = dir() ' 次のファイル名を取得(無ければ空白)
        Loop
    End If

End Sub

Sub DirSet()

    '初期化:既入力値を削除
    resultSheet.Range("A2").ClearContents
    resultSheet.Range("A4:A10004").ClearContents
 
    'フォルダ選択ダイアログを開く
    With Application.FileDialog(msoFileDialogFolderPicker)
        If .Show = 0 Then
            'キャンセルされたので終了
            Exit Sub
        Else
            ' 指定されたのでフォルダパスを取得
            dirPath = .SelectedItems(1) & "\"
            resultSheet.Range("A2").Value = dirPath ' フォルダパスを実行シートに記載
        End If
        
    End With
    
    Dim i As Integer
    i = 4 ' ファイル表示のループカウンタ(4行から開始)
    
    Dim fileName As String
    fileName = dir(dirPath & "*.*") ' 1ファイル目を取得
    
    ' 全ファイル名を繰り返す
    Do While fileName <> ""
        resultSheet.Cells(i, 1).Value = fileName ' ファイル名を実行シートに記載
        fileName = dir() ' 次のファイル名を取得(無ければ空白)
        i = i + 1
        
        '1万件を超えた場合、終了
        If i > 10004 Then
            Exit Do
        End If
    Loop
    
    ' 実行シートに移動
    resultSheet.Activate
    resultSheet.Cells(1, 1).Activate
End Sub

関連記事

マクロ・VBAの学習・活用方法の記事一覧

マクロ・VBA 指定フォルダのファイル一覧を取得する方法