ファイル操作

【VBA】フォルダを削除する方法

更新日:2024/01/18

VBAで既存フォルダを削除する方法をお伝えします。

 

フォルダを削除する関数とメソッド

VBAでフォルダを削除する方法は3つあります。

1のRmDirステートメントは、フォルダ内にファイルやサブフォルダが存在しない時に、フォルダを削除することができます。
2と3は、フォルダ内が空でなくても削除できます。

2のDeleteFolderメソッドは、ワイルドカードで複数のフォルダを削除できます。

3のDeleteメソッドは、Folderオブジェクト内に含まれる更新日付やサイズ等のファイル情報を使用できます。
また、フォルダ内が空かどうかを確認しやすいというメリットがあります。

属性と更新日は、VBA関数で取得できます。
そのため3のMoveメソッドを使用する必要が無いケースがあります。
VBA関数でのフォルダ情報取得については、次のページをご覧ください。
【VBA】フォルダの情報をサクッと取得する方法

 

RmDirステートメント

RmDirステートメントは、VBAのファイル操作に関する関数ステートメント(戻り値の無い関数)の一つです。
フォルダを削除します。

構文

RmDir Path
  1. Path: 削除するフォルダパス

Path内が空でないとき、エラーが発生します。

使用例

RmDirステートメントの使用例です。
フォルダが存在しない時などで発生したエラーをエラー処理ルーチンで補足しています。

Sub KillSample()
    Const folderName As String = "C:\Users\xxx\Documents\folder1"

    On Error GoTo ErrorHandler
    RmDir fileName

    MsgBox "削除しました"

FinalHandler:
    On Error GoTo 0

    Exit Sub

ErrorHandler:
    MsgBox Err.Description & "(" & Err.Number & ")", vbCritical & vbOKOnly, "エラー"
    Resume FinalHandler
End Sub

フォルダ内が空でないときは、ファイルやサブフォルダを再帰的に削除して空にしてから、削除します。
少し複雑な処理になるうえ、苦労して実装するメリットがあまりありません。
DeleteFolderメソッドまたはDeleteメソッドを、おすすめします。

 

DeleteFolderメソッド

DeleteFolderメソッドは外部ライブラリのWindows Script Runtimeに含まれているFileSystemObjectオブジェクトのメンバーです。

DeleteFolderメソッドを使用するには、まずはFileSystemObjectオブジェクトを取得する必要があります。

FileSystemObjectオブジェクトの取得方法は二つあります。
一つは、文字列"Scripting.FileSystemObject"をCreateObject関数に渡す方法です。

Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")

もう一つはVBエディタのメニュー:ツールから参照設定画面を開いて『Microsoft Scriptiong Runtime』を参照設定してから次のコードを実行する方法です。

Dim fso As New Scripting.FileSystemObject

参照設定をおこなうと、コード入力時にメソッド名候補が表示されます。
入力ミスを防げるので便利です。

構文

FileSystemObjectオブジェクト.DeleteFolder FolderSpec, Force   
  1. FolderSpec: 削除するフォルダパス
  2. Force: 省略可能。読み込み専用ファイルとフォルダーを削除するかどうか

Forceの規定値はFalseです。

FolderSpecの最後のフォルダ名にワイルドカードが含まれる場合は、一致するフォルダを一括で削除します。

DeleteFolderメソッドは、フォルダ内(サブフォルダ含む)のファイルを削除し、最後にフォルダを削除します。
このとき、読み込み専用だったり、ファイルを開いているなどの理由で削除できない時点でエラーになります。
従って失敗時でも、一部のファイルやフォルダが削除されている可能性があります。

使用例

DeleteFolderメソッドの使用例です。
次のコードはfolderで始まるフォルダを削除しています。

Sub deleteFolderSample()
    Const folderName As String = "C:\Users\xxx\Documents\folder*"
    
    Dim fso As New Scripting.FileSystemObject

    On Error GoTo ErrorHandler
    
    fso.DeleteFolder folderName, True
    MsgBox "削除しました"

FinalHandler:
    On Error GoTo 0

    Exit Sub

ErrorHandler:
    MsgBox Err.Description & "(" & Err.Number & ")", vbCritical & vbOKOnly, "エラー"
    Resume FinalHandler
End Sub

 

Deleteメソッド

DeleteメソッドはFolderオブジェクトのメンバーです。
Folderオブジェクトは、FileSystemObjectオブジェクトのGetFolderメソッドで取得します。

Folderオブジェクトのプロパティについては、次のリンク先を確認してください。
Folderオブジェクトのプロパティ|【VBA】フォルダの情報をサクッと取得する方法

構文

set Folderオブジェクト = FileSystemObjectオブジェクト.GetFolder( FolderPath )
Folderオブジェクト.Delete Force
  1. FolderPath: フォルダのパス
  2. Force: 省略可能。読み込み専用フォルダ・ファイルを削除するかどうか

Forceの規定値はFalseです。

使用例

Delete メソッドの使用例です。
次のコードはフォルダ内が空かどうか確認して、空の時に削除しています。

Sub deleteSample()
    Const folderName As String = "C:\Users\xxx\Documents\folder1"
    
    Dim fso As New Scripting.FileSystemObject
    Dim fo As folder
    
    On Error GoTo ErrorHandler

    Set fo = fso.GetFolder(folderName)
    With fo
        If .Files.count + .SubFolders.count > 0 Then
            MsgBox "フォルダが空ではありません"
            GoTo FinalHandler
        End If
        
        .Delete True
        MsgBox "削除しました"
    End With
    
FinalHandler:
    On Error GoTo 0

    Exit Sub

ErrorHandler:
    MsgBox Err.Description & "(" & Err.Number & ")", vbCritical & vbOKOnly, "エラー"
    Resume FinalHandler
End Sub

Deleteメソッド実行は、Folderオブジェクトは存在しないフォルダの情報を持っていることになります。
従って、Folderオブジェクトでの操作(Delete、Move,Copy等)は使用できません。

更新日:2024/01/18

書いた人(管理人):けーちゃん

スポンサーリンク

記事の内容について

null

こんにちはけーちゃんです。
説明するのって難しいですね。

「なんか言ってることおかしくない?」
たぶん、こんなご意見あると思います。

裏付けを取りながら記事を作成していますが、僕の勘違いだったり、そもそも情報源の内容が間違えていたりで、正確でないことが多いと思います。
そんなときは、ご意見もらえたら嬉しいです。

掲載コードについては事前に動作確認をしていますが、貼り付け後に体裁を整えるなどをした結果動作しないものになっていることがあります。
生暖かい視線でスルーするか、ご指摘ください。

ご意見、ご指摘はこちら。
https://note.affi-sapo-sv.com/info.php

 

このサイトは、リンクフリーです。大歓迎です。