VBAサンプル集
フォルダ(サブフォルダも全て)削除する、Optionでファイルのみ削除

ExcelマクロVBAの実用サンプル、エクセルVBA集と解説
最終更新日:2020-07-31

フォルダ(サブフォルダも全て)削除する、Optionでファイルのみ削除

VBAでフォルダを削除するにはRmDirステートメントを使いますが、
サブフォルダやファイルが入っている場合は、RmDirはエラーとなります。


そこで、サブフォルダやファイルがある場合は、FileSystemObjectを使います。
FileSystemObjectオブジェクトでは、コンピュータのファイルシステムへのアクセスが提供されています。VBAに用意されているファイル操作関連のステートメントや関数より、より強力で、より多くの機能が搭載されています。ただし機能が大変多いため、これらを全て覚えるという事は困難です。

以下のサンプル使用時には、
「ツール」→「参照設定」で、「Microsoft Scripting Runtime」にチェックを付けてください。
参照設定しない場合は、
Dim objFSO As Object
Set objFSO = CreateObject("Scripting.FileSystemObject")
このように書き直してください。

FileSystemObject.DeleteFolder



Sub sample2()
  Dim objFSO As New FileSystemObject
  objFSO.DeleteFolder "フォルダのフルパス", True
  Set objFSO = Nothing
End Sub

これで、サブフォルダもファイルも、一括で全て削除できます。
この場合の問題点としては、

・一つでも削除できないファイルがあるとエラーとなる
・サブフォルダのどれかがエクスプローラー等で開かれているとエラーとなる

等々、結構削除できない場合が発生します。
また、フォルダは消さずにサブフォルダ内も含めて全てのファイルを削除するといった事が出来ません。

そこでも独自にフォルダ削除を作成し、もう少し融通の利くフォルダ削除を作成してみました。
最下層からファィルを削除してからフォルダ削除を順次行うVBAになります。

フォルダ(サブフォルダも全て)削除するVBA

'**********************************************************************
' sDir : 対象フォルダ
' sMsg : エラー発生時のメッセージ保存
' isOnlyFile : ファイルのみ削除する場合にTrue
'**********************************************************************
Function DelDir(ByVal sDir As String, _
        ByRef sMsg As String, _
        Optional ByVal isOnlyFile As Boolean = False) _
        As Boolean
  Dim objFSO As New FileSystemObject
  Dim objFolder As Folder
  sMsg = ""
  If Not objFSO.FolderExists(sDir) Then
    sMsg = "指定のフォルダは存在しません。"
    DelDir = False
    Exit Function
  End If
  Set objFolder = objFSO.GetFolder(sDir)
  Call DelDirectorys(objFolder, isOnlyFile, sMsg)
  If sMsg = "" Then
    DelDir = True
  Else
    DelDir = False
  End If
End Function

Sub DelDirectorys(ByVal objFolder As Folder, _
          ByVal isOnlyFile As Boolean, _
          ByRef sMsg As String)
  Dim objFolderSub As Folder
  Dim objFile As File
  On Error Resume Next
  For Each objFolderSub In objFolder.SubFolders
    Call DelDirectorys(objFolderSub, isOnlyFile, sMsg)
  Next
  For Each objFile In objFolder.Files
    objFile.Delete
    If Err.Number <> 0 Then
      sMsg = sMsg & "ファイル「" & objFile.Path & "」が削除できませんでした" & vbLf
      Err.Clear
    End If
  Next
  If Not isOnlyFile Then
    objFolder.Delete
    If Err.Number <> 0 Then
      sMsg = sMsg & "フォルダ「" & objFolder.Path & "」が削除できませんでした" & vbLf
      Err.Clear
    End If
  End If
  Set objFolderSub = Nothing
  Set objFile = Nothing
  On Error GoTo 0
End Sub

削除できないものがあっても、それは無視して次の削除を行うために、
エラー処理として、
On Error Resume Next
を組み込んでいます。
削除できなかったフォルダおよびファイルがあった場合は、
変数sMsgにその旨のメッセージを入れています。

使い方としては、以下のようになります。



Sub sample()
  Dim sMsg As String
  If DelDir(ThisWorkbook.Path & "\test", sMsg) Then
    MsgBox "削除終了"
  Else
    MsgBox sMsg
  End If
End Sub

ファイルのみ削除する場合は、
DelDir(ThisWorkbook.Path & "\test", sMsg, True)
として下さい。

使用するプロシージャーで、既にFileSystemObjectを生成していている場合は、
DelDirectorys
こちらを直接使ってもいでしょう。

このようなVBAコードが実際に必要になることは、そう多くは無いと思います。
いざという時の雛形として、またVBAの勉強用のサンプルとしてお使いください。



同じテーマ「マクロVBAサンプル集」の記事

ハイパーリンクからファイルのフルパスを取得する
ボタンのテキスト名のシートへ移動(Application.Caller)
Excelの表をPowerPointへ図として貼り付け
VBAで表やグラフをPowerPointへ貼り付ける
フォルダ(サブフォルダも全て)削除する、Optionでファイルのみ削除
Shift_JISのテキストファイルをUTF-8に一括変換
VBAコードの全プロシージャー・プロパティ一覧を取得
数式バーの高さを数式の行数で自動設定
図形オートシェイプ(Shape)の複数選択
GoogleスプレッドシートをExcelにインポートする
多階層フォルダ(ディレクトリ)の作成


新着記事NEW ・・・新着記事一覧を見る

タプル(tuple型、イミュータブル)|Python入門(9月15日)
リスト(list型、配列)|Python入門(9月14日)
文字列操作(str型)|Python入門(9月13日)
greeenはgreenに、greeeeeNをGReeeeNに変換|エクセル雑感(9月13日)
while文とデバッグ(ステップイン)|Python入門(9月12日)
入力規則で○△を入れる数を制限する方法|エクセル雑感(9月12日)
コレクションの要素を削除する場合|エクセル雑感(9月11日)
for文とイテラブルオブジェクト|Python入門(9月10日)
if文とインデントによるブロック|Python入門(9月9日)
ショートカット(Ctrl+Shift+n)抜け番ばどれだ|エクセル雑感(9月8日)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.RangeとCellsの使い方|VBA入門
3.変数宣言のDimとデータ型|VBA入門
4.マクロって何?VBAって何?|VBA入門
5.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
6.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
7.繰り返し処理(For Next)|VBA入門
8.セルに文字を入れるとは(Range,Value)|VBA入門
9.とにかく書いてみよう(Sub,End Sub)|VBA入門
10.マクロはどこに書くの(VBEの起動)|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。



このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ