こんにちは。
「某フリマサイトの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から任意のファイルを削除する方法をいくつか備忘録しました。
ファイル操作を覚えるとさまざまなツールに展開できそうですよね!
次回以降も、苦労した点を備忘録しようと思います。
Comments