2024年5月15日水曜日

実用になさないような関数の使い道を探そうてとして、諦めて代替策で乗り切ると言う現実 ー Kill関数(VBAマクロ)

          
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 件のコメント:

コメントを投稿