この記事では、ExcelVBAでFileSystemObjectを利用してファイルを削除する方法について説明しています。
FileSystemObjectは、ファイル操作やフォルダ操作したい時に使える便利なライブラリです。
FileSystemObjectが持っている「DeleteFile関数」を使うと、指定したファイルを削除することができます。
「DeleteFile関数」に指定するファイルパスは、以下の2種類を指定可能です。
- ズバリのファイルパス
- あいまいなファイルパス
あいまいなファイルパスは、「ワイルドカード」を利用して指定します。
「ワイルドカード」とは、任意の文字に置き換えできる特殊な文字のことです。
具体的には、以下の2種類の「ワイルドカード」を利用できます。
「*」:任意の長さの文字(0文字以上の文字)
「?」:任意の1文字 または 0文字
それでは、ファイルを削除する方法について、説明していきます。
FileSystemObjectを利用してテキストファイルを読み込む方法については、以下を参照してください。
【VBA入門】FileSystemObjectを使ってテキストファイルを読み込む
FileSystemObjectを利用してテキストファイルへ書き込む方法については、以下を参照してください。
【VBA入門】FileSystemObjectを使ってテキストファイルへ書き込む
もくじ
削除したいファイルパスを指定するシートを準備する
削除したいファイルパスを指定するシートを用意します。
ファイルパスにはもちろんワイルドカードで指定することもできます。
- 「ファイル削除」という名前のシートを作成します。
- A1セルに「削除したいファイルパス」のタイトル行を作成します。
- A2セルに「削除したいファイルパス」の入力欄を作成します。
- A4からA6セルに「ワイルドカード」の説明を書いておきます。(使い方を忘れたときに、思い出すため)
ワイルドカードの使い方(*)
*を指定した場合、任意の長さの文字(0文字以上の文字)と置き換え可能となります。
以下のファイルが存在していたとします。
「202104」で始まるファイルのみ指定する場合は、「202104*」と指定します。
具体的には、202104.txt、202104.xlsx、202104.xlsが該当します。
次に、拡張子が「txt」のファイルのみ指定する場合は、「*.txt」と指定します。
具体的には、202104.txt、202105.txt、202106.txtが該当します。
ワイルドカードの使い方(?)
?を指定した場合、任意の1文字または0文字と置き換え可能となります。
以下のファイルが存在していたとします。
「202104.xlsxと202104.xls」のファイルを指定する場合は、「202104.xls?」と指定します。
具体的には、202104.xlsx、202104.xlsが該当します。
実は、「202104.xls*」でも同じ結果になります・・・。
それでは、テキストファイルへ書き込みする方法を1つずつ説明していきます。
「指定したファイルを削除する」機能の作り方
それでは、VBAプログラムでFileSystemObjectを利用して、指定したファイルを削除する機能を作っていきましょう。
今回利用する「DeleteFile関数」では、指定したファイルが存在しない場合、エラーが発生します。
ですから、エラーが発生した場合も、機能が途中で止まらないようにエラートラップを利用します。
開発タブの「Visual Basic」をクリックして、「Microsoft Visual Basic for Applications」を起動します。
「Microsoft Visual Basic for Applications」にVBAプログラムを入力します。
標準モジュールを追加して、以下のソースを書きます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
Public Sub FileDelete() Dim sht As Worksheet Dim fso As Object Dim filePath As String On Error GoTo ErrCatch '①利用するシートを変数に格納する Set sht = ThisWorkbook.Sheets("ファイル削除") '②FileSystemObjectを変数に格納する Set fso = CreateObject("Scripting.FileSystemObject") '③ファイルパスを変数に格納する filePath = sht.Cells(2, 1) '④ファイルを削除する fso.DeleteFile (filePath) MsgBox "削除しました。", vbInformation ExitSub: '⑤メモリを開放する Set fso = Nothing Exit Sub ErrCatch: MsgBox "削除できませんでした:" & Err.Description, vbExclamation Resume ExitSub End Sub |
最後にEXCELを「◯◯◯.xlsm」というような感じでマクロ有効ブック形式で保存します。
「指定したファイルを削除する」機能の使い方
それでは、指定したファイルを削除する機能の使い方を説明します。
A2セルに書き込むファイルパスを入力します。
まずは、ズバリのファイル名を指定して、ファイルを削除してみましょう。
次に、開発タブの「マクロ」をクリックします。
「FileDelete」を選択して、「実行」ボタンをクリックします。
少し待つと、削除が正常に完了した以下のメッセージが表示されます。
それでは、本当にファイルが削除されたか見てみましょう。
指定した「202104.txt」ファイルが無くなっています。
次に、存在しないファイルを指定した場合を見てみましょう。
マクロを実行すると、以下のように「削除できませんでした:ファイルが見つかりません。」とメッセージが表示されます。
次に、「ワイルドカード」を利用して、ファイルを指定してみましょう。
マクロを実行すると、削除が正常に完了した以下のメッセージが表示されます。
それでは、フォルダを見てみましょう。
「202105」で始まるファイルが3つ削除されました。
ワイルドカードは面白いので、いろいろ試してみてください。
「指定したファイルを削除する」機能のVBAプログラム(FileDelete)の説明
それでは、VBAプログラム(FileDelete)を説明します。
エラーが発生した場合に処理が飛んで欲しいラベルを指定する
1 |
On Error GoTo ErrCatch |
こうすることにより、エラーが発生した場合にマクロが異常終了することを防げます。
エラーが発生しても、上手く処理できるようになったら、一人前です。
「ErrCatch」ラベルについては、後ほど説明します。
①利用するシートを変数に格納する
1 2 |
'①利用するシートを変数に格納する Set sht = ThisWorkbook.Sheets("ファイル削除") |
そうすることにより、入力するプログラムを短くすることができるからです。
何度も「ThisWorkbook.Sheets(“ファイル削除”)」と入力するより、「sht」と入力するほうがコードが少なくてよいからです。
②FileSystemObjectを変数に格納する
1 2 |
'②FileSystemObjectを変数に格納する Set fso = CreateObject("Scripting.FileSystemObject") |
③ファイルパスを変数に格納する
1 2 |
'③ファイルパスを変数に格納する filePath = sht.Cells(2, 1) |
ズバリのファイルパスだろうと、ワイルドカードを利用したファイルパスだろうが同じで、変数に格納します。
④ファイルを削除する
1 2 |
'④ファイルを削除する fso.DeleteFile (filePath) |
指定されたファイルが存在する場合は、そのファイルが削除されます。
しかし、指定されたファイルが存在しない場合、ここでエラーが発生します。
先程説明した「ErrCatch」というラベルに処理が飛んでいきます。
スバリのファイルパスを指定した場合は、1つのファイルを削除します。
ワイルドカードでファイルパスを指定した場合、該当するファイル数すべて削除します。
⑤メモリを開放する
1 2 3 4 5 |
ExitSub: '⑤メモリを開放する Set fso = Nothing Exit Sub |
このあとで説明する「ErrCatch」ラベルにエラーが発生したために、処理が飛んだ場合にこちらの「ExitSub」ラベルに処理を戻すように書いています。
エラーが発生しなかった場合、上から処理が流れてきます。
その場合、メモリを開放して、「Exit Sub」でこの関数から処理を抜け出します。
つまり、処理を終わらせます。
エラーをトラップする
1 2 3 |
ErrCatch: MsgBox "削除できませんでした:" & Err.Description, vbExclamation Resume ExitSub |
VBAソースの冒頭で指定された「ErrCatch」ラベルです。
エラーが発生した場合、このラベルに処理が飛んできます。
「削除できませんでした:エラー内容」というメッセージボックスを表示させます。
次に、「Resume ExitSub」という命令で、エラーをクリアして「ExitSub」ラベルに処理を飛ばしています。
こうすることにより、VBAプログラムをエラーが発生した場合でも、途中で処理を止めずに最後まで実行することができるようになります。
FileSystemObjectを利用して、ファイルを削除する方法を説明しました。
ワイルドカードを利用し、指定したファイルを削除してみましょう。
以上です。
最後まで読んでいただきありがとうございました。
この記事をシェアしていただけると喜びます。