wanna.jp VBAリファレンス
Top > VBA関数リファレンス > VBA RmDirの使い方

VBA RmDirで空フォルダのお掃除!プロジェクト後のディレクトリ整理を自動化

プロジェクトが終わり、PCのデスクトップやドキュメントフォルダには、いつの間にか大量の作業用ディレクトリが散乱していませんか?手作業での削除は面倒なだけでなく、誤って重要なファイルを消してしまうリスクも伴います。今回は、そんなメンテナンスの悩みをVBAでスマートに解決する「RmDir関数」に焦点を当て、その基本的な使い方から「空フォルダしか削除できない」という落とし穴、そしてその回避策までをVBAエキスパートの視点から徹底解説します。

コピペで即動く!RmDirを使った空フォルダ削除の実務コード

まずは、VBAのRmDir関数を使った最も基本的なフォルダ削除コードから見ていきましょう。このコードをそのままVBAエディタに貼り付けて実行してみてください。

Sub DeleteSingleEmptyFolder_RmDir()
    Dim targetFolder As String
    targetFolder = "C:\Temp\Old" ' ★ここを削除したいフォルダのパスに設定してください★

    ' --- 重要な事前チェック:フォルダが存在するか確認 ---
    If Dir(targetFolder, vbDirectory) = "" Then
        MsgBox "指定されたフォルダ '" & targetFolder & "' は存在しません。", vbExclamation
        Exit Sub
    End If

    ' --- ここが「RmDirの落とし穴」のポイントです! ---
    ' このRmDir関数は、指定したフォルダが「完全に空」の場合にのみ成功します。
    ' 一つでもファイルやサブフォルダが残っていると、実行時にエラーで停止します。
    RmDir targetFolder ' 指定された空フォルダを削除

    MsgBox "'" & targetFolder & "' を正常に削除しました。", vbInformation
End Sub
    

このコードを実行すると、targetFolderで指定したパスのフォルダが削除されます。しかし、上記のコードにはRmDir関数の最大の「落とし穴」が隠されています。

【VBA RmDirの落とし穴】空でないフォルダは削除できない!?エラー回避のテクニック

では、この「空でないと削除できない」というRmDirの制約をどのように乗り越えれば良いのでしょうか?現実世界では、空でないフォルダを削除したいケースの方が圧倒的に多いはずです。

最も簡単な回避策は、削除したいフォルダ内のファイルを先に削除し、その後にフォルダ自体を削除することです。サブフォルダがある場合は、さらに再帰的に処理する必要がありますが、ここでは基本的な考え方を示します。

RmDirの前にファイルを一掃する(初級編)

フォルダ内のファイルを一括削除するには、Kill関数とループ処理を組み合わせます。

Sub DeleteFolderAndContents_Basic()
    Dim targetFolder As String
    Dim fileName As String

    targetFolder = "C:\Temp\Old" ' ★削除したいフォルダのパス★

    ' フォルダが存在するか確認
    If Dir(targetFolder, vbDirectory) = "" Then
        MsgBox "指定されたフォルダ '" & targetFolder & "' は存在しません。", vbExclamation
        Exit Sub
    End If

    ' --- フォルダ内のファイルを削除 ---
    ' On Error Resume Next でファイルが存在しない場合のエラーを無視
    On Error Resume Next
    fileName = Dir(targetFolder & "\*.*") ' フォルダ内の最初のファイルを取得

    Do While fileName <> ""
        ' サブフォルダはスキップ(ここではファイルのみ対象)
        If (GetAttr(targetFolder & "\" & fileName) And vbDirectory) = 0 Then
            Kill targetFolder & "\" & fileName ' ファイルを削除
        End If
        fileName = Dir() ' 次のファイルを取得
    Loop
    On Error GoTo 0 ' エラーハンドリングを元に戻す

    ' --- 空になったフォルダを削除 ---
    ' RmDirは空フォルダしか削除できないため、この段階で安全に実行できるはず
    On Error GoTo ErrorHandler_RmDir
    RmDir targetFolder
    MsgBox "'" & targetFolder & "' とその中身を正常に削除しました。", vbInformation
    Exit Sub

ErrorHandler_RmDir:
    MsgBox "フォルダ '" & targetFolder & "' の削除中にエラーが発生しました。" & vbCrLf & _
           "エラー番号: " & Err.Number & vbCrLf & "説明: " & Err.Description, vbCritical
    Err.Clear
End Sub

' 補足: GetAttr関数はファイルの属性を返します。
' vbDirectory との論理積で、それがディレクトリ(サブフォルダ)かどうかを判定します。
' 0 の場合はファイル、非0の場合はディレクトリです。
    

このコードでは、まずKill関数を使ってターゲットフォルダ内の全てのファイルを削除します。その後、フォルダが空になった状態でRmDirを実行するため、エラーを回避しやすくなります。ただし、この方法は**サブフォルダが残っている場合には対応できません**。より堅牢で実用的なフォルダ削除には、FileSystemObject (FSO)を使用することが一般的です。FSOのDeleteFolderメソッドは、サブフォルダやファイルを含めて一括で削除できる非常に強力な機能です。

まとめ:VBA RmDirで賢くフォルダ管理

今回は、VBAのRmDir関数を使って空フォルダを削除する方法と、その「空でないと削除できない」という最大の落とし穴について解説しました。

  • RmDirは、完全に空のフォルダを削除するのに適しています。
  • フォルダ内にファイルやサブフォルダがあると、エラーが発生します。
  • エラーを回避し、より柔軟にフォルダを削除するには、Kill関数でファイルを先に削除したり、さらに強力なFileSystemObjectDeleteFolderメソッドを利用することが推奨されます。

プロジェクト終了後の環境整理や、一時ファイルのクリーンアップなど、VBAのフォルダ操作機能をマスターすることで、日々の業務効率を格段に向上させることができます。ぜひ、この記事を参考に、あなたのVBAスキルをもう一歩先に進めてみてください。

VBAでの業務効率化、悩み解決します

「このマクロ、もっと速くならないかな?」「エラーが消えない…」
Access/VBA専門のwanna.jpにご相談ください。

無料相談はこちら