【VBA】フォルダを削除する方法
更新日:2024/01/18
VBAで既存フォルダを削除する方法をお伝えします。
フォルダを削除する関数とメソッド
VBAでフォルダを削除する方法は3つあります。
1のRmDirステートメントは、フォルダ内にファイルやサブフォルダが存在しない時に、フォルダを削除することができます。
2と3は、フォルダ内が空でなくても削除できます。
2のDeleteFolderメソッドは、ワイルドカードで複数のフォルダを削除できます。
3のDeleteメソッドは、Folderオブジェクト内に含まれる更新日付やサイズ等のファイル情報を使用できます。
また、フォルダ内が空かどうかを確認しやすいというメリットがあります。
そのため3のMoveメソッドを使用する必要が無いケースがあります。
VBA関数でのフォルダ情報取得については、次のページをご覧ください。
■【VBA】フォルダの情報をサクッと取得する方法
RmDirステートメント
RmDirステートメントは、VBAのファイル操作に関する関数ステートメント(戻り値の無い関数)の一つです。
フォルダを削除します。
構文
RmDir Path
- Path: 削除するフォルダパス
Path内が空でないとき、エラーが発生します。
使用例
RmDirステートメントの使用例です。
フォルダが存在しない時などで発生したエラーをエラー処理ルーチンで補足しています。
Sub KillSample()
Const folderName As String = "C:\Users\xxx\Documents\folder1"
On Error GoTo ErrorHandler
RmDir fileName
MsgBox "削除しました"
FinalHandler:
On Error GoTo 0
Exit Sub
ErrorHandler:
MsgBox Err.Description & "(" & Err.Number & ")", vbCritical & vbOKOnly, "エラー"
Resume FinalHandler
End Sub
フォルダ内が空でないときは、ファイルやサブフォルダを再帰的に削除して空にしてから、削除します。
少し複雑な処理になるうえ、苦労して実装するメリットがあまりありません。
DeleteFolderメソッドまたはDeleteメソッドを、おすすめします。
DeleteFolderメソッド
DeleteFolderメソッドは外部ライブラリのWindows Script Runtimeに含まれているFileSystemObjectオブジェクトのメンバーです。
FileSystemObjectオブジェクトの取得方法は二つあります。
一つは、文字列"Scripting.FileSystemObject"をCreateObject関数に渡す方法です。
Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")
もう一つはVBエディタのメニュー:ツールから参照設定画面を開いて『Microsoft Scriptiong Runtime』を参照設定してから次のコードを実行する方法です。
Dim fso As New Scripting.FileSystemObject
参照設定をおこなうと、コード入力時にメソッド名候補が表示されます。
入力ミスを防げるので便利です。
構文
FileSystemObjectオブジェクト.DeleteFolder FolderSpec, Force
- FolderSpec: 削除するフォルダパス
- Force: 省略可能。読み込み専用ファイルとフォルダーを削除するかどうか
Forceの規定値はFalseです。
FolderSpecの最後のフォルダ名にワイルドカードが含まれる場合は、一致するフォルダを一括で削除します。
DeleteFolderメソッドは、フォルダ内(サブフォルダ含む)のファイルを削除し、最後にフォルダを削除します。
このとき、読み込み専用だったり、ファイルを開いているなどの理由で削除できない時点でエラーになります。
従って失敗時でも、一部のファイルやフォルダが削除されている可能性があります。
使用例
DeleteFolderメソッドの使用例です。
次のコードはfolderで始まるフォルダを削除しています。
Sub deleteFolderSample()
Const folderName As String = "C:\Users\xxx\Documents\folder*"
Dim fso As New Scripting.FileSystemObject
On Error GoTo ErrorHandler
fso.DeleteFolder folderName, True
MsgBox "削除しました"
FinalHandler:
On Error GoTo 0
Exit Sub
ErrorHandler:
MsgBox Err.Description & "(" & Err.Number & ")", vbCritical & vbOKOnly, "エラー"
Resume FinalHandler
End Sub
Deleteメソッド
DeleteメソッドはFolderオブジェクトのメンバーです。
Folderオブジェクトは、FileSystemObjectオブジェクトのGetFolderメソッドで取得します。
■Folderオブジェクトのプロパティ|【VBA】フォルダの情報をサクッと取得する方法
構文
set Folderオブジェクト = FileSystemObjectオブジェクト.GetFolder( FolderPath ) Folderオブジェクト.Delete Force
- FolderPath: フォルダのパス
- Force: 省略可能。読み込み専用フォルダ・ファイルを削除するかどうか
Forceの規定値はFalseです。
使用例
Delete メソッドの使用例です。
次のコードはフォルダ内が空かどうか確認して、空の時に削除しています。
Sub deleteSample()
Const folderName As String = "C:\Users\xxx\Documents\folder1"
Dim fso As New Scripting.FileSystemObject
Dim fo As folder
On Error GoTo ErrorHandler
Set fo = fso.GetFolder(folderName)
With fo
If .Files.count + .SubFolders.count > 0 Then
MsgBox "フォルダが空ではありません"
GoTo FinalHandler
End If
.Delete True
MsgBox "削除しました"
End With
FinalHandler:
On Error GoTo 0
Exit Sub
ErrorHandler:
MsgBox Err.Description & "(" & Err.Number & ")", vbCritical & vbOKOnly, "エラー"
Resume FinalHandler
End Sub
Deleteメソッド実行は、Folderオブジェクトは存在しないフォルダの情報を持っていることになります。
従って、Folderオブジェクトでの操作(Delete、Move,Copy等)は使用できません。
更新日:2024/01/18
関連記事
スポンサーリンク
記事の内容について
こんにちはけーちゃんです。
説明するのって難しいですね。
「なんか言ってることおかしくない?」
たぶん、こんなご意見あると思います。
裏付けを取りながら記事を作成していますが、僕の勘違いだったり、そもそも情報源の内容が間違えていたりで、正確でないことが多いと思います。
そんなときは、ご意見もらえたら嬉しいです。
掲載コードについては事前に動作確認をしていますが、貼り付け後に体裁を整えるなどをした結果動作しないものになっていることがあります。
生暖かい視線でスルーするか、ご指摘ください。
ご意見、ご指摘はこちら。
https://note.affi-sapo-sv.com/info.php
このサイトは、リンクフリーです。大歓迎です。