和風スパゲティのレシピ

日本語でコーディングするExcelVBA

フォルダが空か判定する

フォルダが空かどうか判定する方法を解説します。
FileSystemObject(以下FSO)を使用します。

ソースコード

Sub フォルダが空なら削除する()
    
    Dim FSO As New FileSystemObject
    
    ' 判定したいフォルダをFolderオブジェクトに入れる
    Dim 指定フォルダ As Folder
    Set 指定フォルダ = FSO.GetFolder("C:\Users\wfsp\Desktop\テスト")
    
    ' フォルダか空か判定
    If 指定フォルダ.Files.Count = 0 And _
       指定フォルダ.SubFolders.Count = 0 Then
        
        ' 空だった場合の処理(例はフォルダの削除)
        指定フォルダ.Delete
    
    End If
    
End Sub

解説

フォルダが空かどうかを1発で判定するプロパティはないため、

  • フォルダの中にファイルがあるかどうか
  • フォルダの中にフォルダがあるかどうか

の2つを調べ、どちらもない場合に空フォルダと判定します。


このうち「フォルダ内にサブフォルダがない」判定はDir関数では難しいため、
FileSystemObjectのFolderオブジェクトを利用しています。


コード自体は非常にわかりやすいため説明は不要かもしれません。

指定フォルダ(オブジェクト)の「Files」と「SubFolders」の、
Countがともに0かどうかを判定すればOKです。


一度FolderオブジェクトにSetすれば、その後の処理でも、

指定フォルダ.Delete

と活用できるのがFSOのいいところですね。



なお、ファイル/フォルダがないときのFilesとSubFoldersの両プロパティは、
Countは0になりますがNothingにはなりません。
 

If 指定フォルダ.Files Is Nothing And _
   指定フォルダ.SubFolders Is Nothing Then

このコードは正しく動きませんのでご注意ください。

おまけ:フォルダを削除する場合は簡単な記述が可能

フォルダが空か判定したあとは、そのフォルダを削除することが多いかもしれません。


マクロでやりたいことが「フォルダが空なら削除する」であった場合は、
以下のように簡単に書くことも可能です。

Sub フォルダが空なら削除する()
    
    On Error Resume Next
    RmDir "C:\Users\○○\Desktop\テスト"
    On Error GoTo 0
    
End Sub

 
RmDirステートメントは「空のフォルダを削除する」ステートメントで、
フォルダが空でない場合はエラーが発生します。

これを逆手に取ったのが上記のコードです。


On Error Resume Nextでエラーを無視する状態では、
RmDirは「フォルダが空の時だけ実行される」ことになりますからね。

事実上、If文なしで分岐が表現できたことになります。


とはいえ、このコードをすべてのサブフォルダで判定しようとすると、
結局はFileSystemObjectが必要になります。
(Dir関数はフォルダをループするのが苦手なため)


「フォルダ内の空フォルダをすべて削除」するような場合は結局FSOに頼るため、
このコードは単独のフォルダ限定と思ってください。