中のファイル・サブフォルダごとフォルダを削除する、
FileSystemObject.DeleteFolderメソッドの使い方を解説します。
基本形
FSO.DeleteFolder 削除したいフォルダのパス
実行例
Dim FSO As New FileSystemObject ' パスで指定したフォルダを削除 FSO.DeleteFolder "C:\Users\○○\Desktop\テスト" ' マクロ実行ブックの下層フォルダを削除 FSO.DeleteFolder Thisworkbook.Path & "\テスト" ' カレントフォルダ内の「テスト」フォルダを削除 FSO.DeleteFolder "テスト" ' 「テスト○○」に該当するフォルダを一括削除 FSO.DeleteFolder Thisworkbook.Path & "\テスト*" ' フォルダ内のすべてのサブフォルダを一括削除 FSO.DeleteFolder Thisworkbook.Path & "\*"
はじめに:RmDirステートメントは使えません
ファイル操作シリーズとしてDir、MkDir、FileCopy、Killなどがあり、
今回の「フォルダを削除する」担当はRmDirステートメントです。
が、RmDirステートメントは「フォルダが空でないとエラー」になるため、
今回の処理に使うことができません。
よって、今回の例ではFileSystemObject(以下FSO)を用い、
DeleteFolderメソッドを使用する必要があります。
MkDirとCreateFolderや、KillとDeteleFileなど、ほぼ同じ動きの組が多い中で、
Dir系列とFSOでまったく違う動きになってしまう組は珍しいですね。
解説
ファイル・サブフォルダなどの中身ごとフォルダを削除する場合は、
DeleteFolderメソッドを利用します。
ゴミ箱への移動ではなく、完全な削除が実行されます。
DeleteFolderメソッドに指定するパスには「ワイルドカード*」が使用でき、
条件に該当するフォルダを一括で削除することができます。
使用できるワイルドカードは以下の2つです。
* | 任意の文字列(0文字も含む) |
? | 任意の1文字 |
完全な削除を複数のフォルダに実行しますので、
十分注意して使用してください。
発生するエラー
DeleteFolderメソッドで発生する可能性のあるエラーは、
大きく以下の3パターンになります。
削除するフォルダが存在しない
渡したフォルダパスにフォルダが存在しなかった場合は、
実行時エラー76「パスが見つかりません。」 |
このエラーが発生します。
これはワイルドカードを利用した一括削除の場合も同様で、
「ひとつもフォルダがなかった場合はエラー」になります。
「フォルダがあればフォルダを削除」したい場合は、
以下のいずれかのコードを実行してください。
' 文字通り「フォルダがあればフォルダを削除」 If FSO.FolderExists(削除フォルダパス) Then FSO.DeleteFolder 削除フォルダパス End If ' エラーを無視して実行 On Error Resume Next FSO.DeleteFolder ThisWorkbook.Path & "\*" On Error GoTo 0
基本は1番目のコードの方が安全なのですが、
FolderExistsメソッドにはワイルドカードが使えません。
一括削除でのエラー対策には、2つ目のコードを利用してください。
ただし、エラーを無視する場合に裏で発生するエラーには、
当然残りの2パターンも含む点には注意してください。
削除するフォルダを開いている
指定したフォルダ内のいずれかのファイル・フォルダを開いていた場合は、
実行時エラー70「書き込みできません。」 |
エラーが発生します。
共有サーバー上のフォルダで誰かが開いていたり、
何らかのシステムがファイルを参照している場合など、
手作業のDeleteキーで消せない場合はこのエラーになります。
なお、このエラーはフォルダごとに判定されます。
ワイルドカードを使用した一括削除を行った場合は、
- フォルダを2つ削除 ⇒ 3つ目のフォルダでエラー
の様に部分的に削除されてからエラーで止まる点にご注意ください。
削除するフォルダが読み取り専用
指定したフォルダ内のいずれかのファイル・フォルダが「読み取り専用」の場合は、
実行時エラー75「パス名が無効です。」 |
このエラーが発生します。
ここでいう「読み取り専用」というのは、
Excelの読み取り専用ブックのことではなく、
Windowsにおけるフォルダ/フォルダの読み取り専用設定のことです。
つまり、↓このレ点チェックのことですね。
このWindows上の読取専用フォルダを削除する場合は、
DeleteFolderメソッドの第2引数(Force)にTrueを渡します。
FSO.DeleteFolder 削除したい読取専用フォルダのパス, True
が、このコードは危険すぎますので実行するのはやめておきましょう。
この読取専用フォルダというのは主にシステムフォルダなどであり、
捨てると何かが動かなくなるファイルも多数含まれます。
ExcelVBAでこれを削除することは滅多にないと思いますが、
もし削除したい場合でも、しっかりとファイルをターゲットに削除する
FSO.DeleteFile 削除したい読取専用ファイルのパス, True ' まずシステムファイルを消す FSO.DeleteFolder そのファイルの親フォルダのパス ' そのあとフォルダを消す
このコードで実行するべきです。
このコードであれば、万が一消したいものとは別の読取専用ファイルがあっても、
フォルダの削除はエラーで止まってくれるため安全です。
おまけ:FolderオブジェクトのDeleteメソッドを使用する
FolderSystemObject(以下FSO)を利用したフォルダの削除として、
FolderオブジェクトのDeleteメソッドを使用することもできます。
削除するフォルダをすでにオブジェクトとして持っている場合は、
以下のコードでもフォルダの削除を実行できます。
Sub フォルダになにか処理をしてから削除するコード() Dim FSO As New FolderSystemObject ' Folderオブジェクトを取得 Dim 処理フォルダ As Folder Set 処理フォルダ = FSO.GetFolder(ThisWorkbook.Path & "\テスト") ' フォルダへの処理 ここにフォルダ内のファイルを読み取ったり移動したりする処理 ' ファイルの削除はこれでも実行可 処理フォルダ.Delete End Sub
同じフォルダにいろいろな処理を行う場合は、
まずフォルダをオブジェクトにしておきましょう。
処理フォルダ.Filesでファイルを読み取ったり、
.Copyや.Moveもイメージ通りに動いてくれてとても便利です。
このようにFSOはフォルダ/フォルダをオブジェクトとして扱えるのが特長です。
「RmDirの代わり」のようにDir系列との比較でFSOを使っていると、
この「Folder.○○」や「File.○○」を忘れがちになります。
FolderSystemObjectを扱う際は、この方法も必ず意識しておきましょう。