フォルダが空かどうか判定する方法を解説します。
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に頼るため、
このコードは単独のフォルダ限定と思ってください。