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

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

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

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


そこで、サブフォルダやファイルがある場合は、FileSystemObjectを使います。
・FileSystemObjectオブジェクトの使用方法 ・FileSystemObjectオブジェクトのプロパティとメソッド ・FileSystemObjectオブジェクトのメソッドの戻り値 ・FileSystemObjectオブジェクトの使用例 ・FileSystemObjectオブジェクトの関連記事と実践例

以下のサンプル使用時には、
「ツール」→「参照設定」で、「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 ・・・新着記事一覧を見る

VBA10大躓きポイント(初心者が躓きやすいポイント)|VBA技術解説(2024-03-05)
テンキーのスクリーンキーボード作成|ユーザーフォーム入門(2024-02-26)
無効な前方参照か、コンパイルされていない種類への参照です。|エクセル雑感(2024-02-17)
初級脱出10問パック|VBA練習問題(2024-01-24)
累計を求める数式あれこれ|エクセル関数応用(2024-01-22)
複数の文字列を検索して置換するSUBSTITUTE|エクセル入門(2024-01-03)
いくつかの数式の計算中にリソース不足になりました。|エクセル雑感(2023-12-28)
VBAでクリップボードへ文字列を送信・取得する3つの方法|VBA技術解説(2023-12-07)
難しい数式とは何か?|エクセル雑感(2023-12-07)
スピらない スピル数式 スピらせる|エクセル雑感(2023-12-06)


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

1.最終行の取得(End,Rows.Count)|VBA入門
2.RangeとCellsの使い方|VBA入門
3.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
4.繰り返し処理(For Next)|VBA入門
5.変数宣言のDimとデータ型|VBA入門
6.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
7.並べ替え(Sort)|VBA入門
8.条件分岐(IF)|VBA入門
9.セルのクリア(Clear,ClearContents)|VBA入門
10.マクロとは?VBAとは?VBAでできること|VBA入門




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


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



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