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

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 指定フォルダのファイル一覧を取得する方法

フォローする