和風スパゲティのレシピ

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

空のフォルダを削除する - RmDirステートメント

空のフォルダを削除する、RmDirステートメントの使い方を解説します。

基本形

RmDir 削除したいフォルダのパス

実行例

' パスで指定したフォルダを削除
RmDir "C:\Users\○○\Desktop\テスト"

' マクロ実行ブックの下層フォルダを削除
RmDir Thisworkbook.Path & "\テスト"

' カレントフォルダ内の「テスト」フォルダを削除
RmDir "テスト"

解説

RmDirステートメントは「空のフォルダを削除」します。


フォルダ内にファイルやサブフォルダが1つでもあると以下のエラーが発生します。

実行時エラー75「パス名が無効です。」


また、指定したパスにフォルダが存在しない場合は以下のエラーも、
同様に「パス名が無効です。」エラーとなります。


あとはあまり使わないと思いますが、親フォルダを省略した場合は、
「カレントフォルダ」内のフォルダを削除します。
(ドキュメントフォルダや最後に保存したフォルダのこと)

中身のファイル・フォルダごと削除したい場合

中身のファイル・フォルダも含めてフォルダを削除したい場合は、
ReDimステートメントは使用できません。

フォルダを空にする ⇒ フォルダを削除

とやりたいところなのですが、フォルダの中にフォルダがあった場合は、

フォルダを空にするためのサブフォルダを空にするためのサブサブ・・

というループに陥るため、いわゆる再帰関数が必要になります。


ということで、RmDirステートメントでやるのは現実的でないため、
この場合はFileSystemObjectのDeleteFolderメソッドを使用してください。

DeleteFolderメソッドであれば、中にファイルやフォルダがあっても、
それらひっくるめてフォルダごと削除することができます。


詳しくはこちらの記事を参考ください。

www.limecode.jp

フォルダが空ならそのフォルダを削除する

ReDimステートメントが「空のフォルダしか削除できない」ことを逆手にとって、
フォルダが空なら削除する」処理を以下のように簡単に書くことができます。

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

 
このようにOn Error Resume Nextによるエラー無視を活用すれば、
「フォルダが空なら削除する」という分岐処理をIf文なしで書くことができます。


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

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