top of page
検索

ExcelでVBA、ファイルを削除(Killステートメント、FileSystemObjectオブジェクト)

更新日:2021年2月4日

こんにちは。

「某フリマサイトのWebスクレイピング」にて、出品一覧を作成するスクリプトを組みました。それに合わせて出品物の写真もイメージファイルとしてダウンロードしているのですが、出品一覧を前回取得した際にダウンロードしたファイルを削除しないと、どんどんゴミが溜まっちゃうなーと思い、「ファイル削除」の処理を追加しましたー。


0. 動作環境

OS: Windows 8.1

Excel: 2013


1. Killステートメント

一番簡単な方法は、Killステートメントなのでしょうか!?

マイクロソフトさんのサイトを見るに構文は次のとおりです。


> Kill filespec


  • 引数「filespec」(必須)は、1つ以上の削除するファイル名を指定する文字列式

    • 「filespec」には、ディレクトリまたはフォルダー、およびドライブを含めることが可能

  • 複数ファイルを指定する際、複数の文字(*)や1文字 (?) のワイルドカードが使用可能

  • ごみ箱には入らず物理削除

  • ファイルが見つからない場合、削除不可 (「ファイルが見つかりません。」(エラー番号: 53)が発生…)

  • 「隠しファイル」指定されたファイルの場合、削除不可 (「ファイルが見つかりません。」(エラー番号: 53)が発生…)

  • 「読み取り専用」指定されたファイルの場合、削除不可 (「ファイルが見つかりません。」(エラー番号: 53)が発生…)

  • オープン中のファイルの場合、削除不可 (「書き込みできません。」(エラー番号: 70)が発生…)

ソースそのままお見せしても意味不明ですよね(笑)

出品一覧の取得時、ダウンロードしたイメージファイルの命名規則を「出品ID+"_"+シーケンス番号.(元々の拡張子)」にしたので、「出品ID+"_"」以下を*にすることで同一出品物のイメージファイルを全て掃除する仕組みにしてみました。


本来は、エラーが発生しないよう、事前にファイルの存在を確認すべきです。

VBAでは「Dir」関数で存在確認ができるのですが、そもそもファイルが存在しないならそれで問題ないので、私はOn Errorステートメントで雑な対応してます(笑)


本当ならこんな感じですかね?

また、タイミングあれば、Dir関数についても備忘録したいと思います。^^



2. FileSystemObjectクラスのDeleteFileメソッド

Killステートメントのデメリットをいくつか解決できるっぽいので、こちらもチェック。

(FileオブジェクトのDeleteメソッドでも同様の処理が可能)

マイクロソフトさんのサイトを見るに構文は次のとおりです。


> FileSystemObjectオブジェクト.DeleteFile filespec [, force]


  • 引数「filespec」(必須)は、1つ以上の削除するファイル名を指定する文字列式

  • 「filespec」には、ディレクトリまたはフォルダー、およびドライブを含めることが可能

  • 複数ファイルを指定する際、複数の文字(*)や1文字 (?) のワイルドカードが使用可能

  • 引数「force」(省略可能、既定値はFalse)は、Trueを指定することで、読み取り専用属性が設定されているファイルを強制的に削除可能

  • ごみ箱には入らず物理削除

  • ファイルが見つからない場合、削除不可 (「ファイルが見つかりません。」(エラー番号: 53)が発生…)

  • オープン中のファイルの場合、削除不可 (「書き込みできません。」(エラー番号: 70)が発生…)

読み取り専用属性、隠しファイル属性のファイルを削除できる…ということで、Killステートメントより強力です!


KillステートメントにおけるDir関数のように、事前に指定ファイルの存在確認をしたい場合は、FileSystemObjectクラスのFileExistsメソッドを使いましょう。



3. ごみ箱へ入れる

前述の方法では即刻物理削除でごみ箱には入りません。

あ、間違えて削除しちゃったーなんて時はごみ箱に助けてもらいたいので、ごみ箱へ入れる方法も確認してみました。


解決策は、Windows APIの「SHFileOperation」です。

昔のWindowsで、はじめてファイルコピー操作などでファイルが飛んでくアニメーションのダイアログが実装されたころ、挙ってこのAPI使った思い出があります。笑



4. 番外編: Excelの組み込みダイアログ

DialogクラスのShowメソッドを利用することで任意の組み込みダイアログを表示し、それに応じた組み込み処理を実現することができます。また、Dialogクラス(のオブジェクト)は、ApplicationクラスのDialogsコレクションに組み込みの定数を指定することで取得できます。


今回は、利用者に削除対象のファイルを指定させ、そのファイルを削除する仕組みを利用したいため定数「xlDialogFileDelete」を活用します。


こんな感じで使います。

するとお馴染みのファイル指定ダイアログが表示され、任意のファイルを指定すると、ファイルが実際に削除されます。


(隠しファイル属性のファイルは削除できましたが、読み取り専用属性のファイルは削除できないようです…)


実行するとこんな感じのダイアログが表示されます。


(ダイアログが表示されるとボタンのラベルは「削除」と表示されているのですが、その後削除ボタンを押すと上図のとおり「開く」となります。バグですかね?笑)



まとめ

いかがでしたでしょうか?

ExcelのVBAから任意のファイルを削除する方法をいくつか備忘録しました。

ファイル操作を覚えるとさまざまなツールに展開できそうですよね!


次回以降も、苦労した点を備忘録しようと思います。


閲覧数:5,619回0件のコメント

Comments


bottom of page