フォルダの内容を別フォルダにコピー コピー後のフォルダ(サブフォルダ含む)から不要なファイルを削除する

フォルダの内容を別フォルダにコピーして、そのコピー後のフォルダとそのサブフォルダから不要なファイルを削除する作業を自動化するプログラムを考えてみました。

実際の仕事で顧問先の会計ソフトへの入力作業を行うために月次のフォルダを作成し、その下に作業項目別のサブフォルダを作成して順番に作業を行っています。

入力作業を行う前に必ず前月用のフォルダを当月用にコピーして名前を変更し、不要なファイルを手作業で削除していましたのでこの手作業を無くしたいと思いました。

Windowsのバッチファイル

バッチファイルを使用すると次のような記述でプログラムを作成することができます。

メモ帳ソフトでfolder_copy.batなどの名前でファイルを作成します。

@echo off

cd コピーするフォルダの親フォルダ名

set src=コピー元のフォルダ名
set dst=コピー先のフォルダ名

xcopy /e /y %src% %dst%

cd %dst%

for /r %%n in (2021*.pdf) do (
  del /q "%%n"
)

for /r %%n in (combine.pdf) do (
  del /q "%%n"
)

for /r %%n in (*.jpg) do (
  del /q "%%n"
)

for /r %%n in (*.kb*) do (
  del /q "%%n"
)

cd ..

pause

この例では、

  • 名前が「2021」で始まるファイル(スキャナーで作成したファイル)
  • combine.pdfという名前のファイル(pdfファイルを統合したファイル)
  • 拡張子が「jpg」であるファイル
  • 拡張子が「kb」で始まっているファイル(弥生会計のバックアップファイル)

を削除しています。

削除したいファイルの名前や拡張子に合わせて設定を変更することができます。

バッチファイルを使用する場合の注意点は、

  • 「set src=コピー元のフォルダ名」を記述する際に「=」の前後にスペースを入れないこと
  • フォルダ名(又はファイル名)に日本語が含まれている場合には、バッチファイルをメモ帳で保存する際に文字コードを「ANSI」に指定すること(デフォルトではUTF-8になっていると思います)

です。

VBA

同じプログラムを当初はVBAで作成していました。

Option Explicit

Dim cnt As Long
Const src As String = コピー元のフォルダ名
Const dst As String = コピー先のフォルダ名
Const type1 As String = "¥2021*.pdf"
Const type2 As String = "¥combine.pdf"
Const type3 As String = "¥*.kb*"
Const type4 As String = "¥*.jpg"


Sub main()

    Cells.Clear
    cnt = 0
    Call folder_copy
    Call file_delete(dst, type1)
    Call file_delete(dst, type2)
    Call file_delete(dst, type3)
    Call file_delete(dst, type4)

End Sub

Sub folder_copy()

    Dim fso As FileSystemObject
    Set fso = New FileSystemObject
    
    Call fso.CopyFolder(src, dst, True)      ' フォルダ名を指定してコピー
    
    Set fso = Nothing

End Sub

Sub file_delete(File_Path As String, File_Type As String)
    
    Dim buf As String
    Dim f As Object
    Dim fso As FileSystemObject
    Set fso = New FileSystemObject
    
    buf = Dir(File_Path & File_Type)
    
    Do While buf <> ""
        cnt = cnt + 1
        Cells(cnt, 1) = buf
        Kill (File_Path & "¥" & buf)
        buf = Dir()
    Loop
    
    For Each f In fso.GetFolder(File_Path).SubFolders
        Call file_delete(f.Path, File_Type)
    Next f
    
    Set fso = Nothing

End Sub

記述が長くなっていますが、

  • FileSystemObject
  • プロシージャfile_delete()の再帰呼び出し

を使用しているためです。

また、VBAで処理を行った場合には削除したファイルの一覧をワークシートに書き込むようにしています。

タイトルとURLをコピーしました