フォルダの内容を別フォルダにコピーして、そのコピー後のフォルダとそのサブフォルダから不要なファイルを削除する作業を自動化するプログラムを考えてみました。
実際の仕事で顧問先の会計ソフトへの入力作業を行うために月次のフォルダを作成し、その下に作業項目別のサブフォルダを作成して順番に作業を行っています。
入力作業を行う前に必ず前月用のフォルダを当月用にコピーして名前を変更し、不要なファイルを手作業で削除していましたのでこの手作業を無くしたいと思いました。
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で処理を行った場合には削除したファイルの一覧をワークシートに書き込むようにしています。