VBAでコードを書いていて、ファイルを削除するコードでかなり苦労しました。
ロジックは、ファイル名を変更して保存後、元のファイルを削除する考えなの。
元のファイルもタイムスタンプが付いていて、名称が日々変わるので厄介です。
先ず、元ファイルをダウンロードフォルダーから、ブックのフォルダへコピペ。
それから、色々な操作の後で、作業をした日付のタイムスタンプを加えて保存。
この仕事は日課なので、元のファイルはどうしても作業後に削除しておきたい。
それで、ファイルの削除関数と言えば”Kill”ですが、問題はファイルの指定方法。
フルパスでファイル名を、ダブルコーテーション引用符で括っておく必要です。
Kill "C:\Book1.xlsx"
Sub test()
Dim str As String
str = ""
str = str & "C:\作業フォルダ\"
str = str & "Book1.xlsx"
Kill str
End Sub
このような記述がネットでよく見られますが、この括りを変数で扱えないのか。
シンプルな構文ですと、文字列変数で実際に代入して実行しても動作はします。
ただ、複雑なコードの中で書くと、この変数の指定をしても実行ができません。
そんな事態が発生してしまい、理由が良く分かりませんが、解決策が必要です。
考えられるのは、実行プログラムで削除するブックを、かなり操作しています。
元ファイルを日付付きで別に保存した後で、元ファイルを削除する手法なんだ。
ただ、挙動を観察すると削除された形跡がないので、動いているのか不明なの。
なので、色々考えた挙句、Name関数で元のファイルを別フォルダに移します。
この削除フォルダでファイル一覧を掛けて、全ファイルを削除すると言う手法。
これならば、Kill関数を使わなくても大丈夫で、代わりにFileSystemObjectだ。
Sub FileMove()
Dim FSO As Object, Fle As Object, str As String, str2 As String
str = ""
str = str & ThisWorkbook.Path
str = str & "\"
str2 = ""
str2 = str2 & ThisWorkbook.Path
str2 = str2 & "\削除\"
str2 = str2 & ""
Set FSO = CreateObject("Scripting.FileSystemObject")
For Each Fle In FSO.GetFolder(str).Files
If InStr(Fle.Name, ThisWorkbook.Name) > 0 Then GoTo Skip
str = str & Fle.Name 'InStr関数で、開いているブックを回避
str = str & ""
str2 = str2 & Fle.Name
str2 = str2 & ""
Name str As str2 'Name関数で同じファイル名で別フォルダに移動
Skip:
Next Fle
Set FSO = Nothing
End Sub
Sub FileDelete()
Dim FSO As Object, Fle As Object, str As String
str = ""
str = str & ThisWorkbook.Path
str = str & "\削除\"
str = str & ""
Set FSO = CreateObject("Scripting.FileSystemObject")
For Each Fle In FSO.GetFolder(str).Files
Fle.Delete 'Kill関数を使わないで削除
Next Fle
Set FSO = Nothing
End Sub
この方法を実際に実行すると、フォルダ移動のファイルが削除されていました。
ただ、パスも含めたファイル名を、文字列変数で指定するので少しややこしい。
Kill関数に比べても複雑になりますが、ファイル指定が変数なので使いやすい。
というわけで、汎用性の高いコードは、なるべく変数を使って実行したいもの。
コードの記述が長くなりますが、一度サンプルを作っておけば、同じ事例が出ても使いまわせるわけで、コード記述のノウハウは、非常に重要なのだと分かったのでした。
0 件のコメント:
コメントを投稿