フォルダコピーとファイルの移動 ~ ① 必要な条件を書き出してみる ~

先日、このような問い合わせをいただいた。

そこで、私の場合どのようにゴールするか、検討過程も含めて紹介しようと思う。
※現時点でこの課題は、未解決の状態です(超見切り発車)。

あるフォルダから、別のフォルダへファイルを移動したい。また、移動先の
フォルダ名は、もと居たフォルダ名をコピーして作りたい。

ということで、こんな感じで C:\ 直下にテスト環境を作成してみた。

Bを含め全て移動させたいということは、B直下に存在する「yyyymmdd」形式の
フォルダは一つしか存在してはならない。なぜなら複数存在した場合、条件に合致
しないフォルダまで一括で移動させてしまうことになるから。

そのうえで、例えば20220701フォルダが条件に合致するならば、「コピー先」に
Aを作成してから、Bごと「コピー元」から移動させる。

さて、ここからが試案のしどころ。まず「変わらないもの」は何かと考えると、
それは「コピー元」「コピー先」のパス情報だ。ならば、これは定数としよう。

FileSystemObjectを使用したいので、参照設定でMicrosoft Scripting Runtimeに
チェックを入れておく。

今回はナマクラして、モジュールレベル変数で宣言してしまおうか。

' コピー元の親フォルダ。
Const SrcParentFolderPath As String = "C:\Temp\コピー元"
' コピー先の親フォルダ。
Const DstParentFolderPath As String = "C:\Temp\コピー先"
' FileSystemObject
Dim FSO As New Scripting.FileSystemObject

次に、「yyyymmdd」までのパス情報が、移動対象か否かを判別する関数を
作ってみよう。

Function IsMovable(folder_path As String, specified_date As Date) As Boolean
    Dim TargetNumber As Variant
        TargetNumber = Right(folder_path, 8)
        
        ' フォルダ名が数字8桁でない場合、引数に誤りあり。
        If Not IsNumeric(TargetNumber) Then Exit Function
        
    Dim TargetDate As Date
        ' 8桁の数字を日付に変換。
        TargetDate = Format(Right(folder_path, 8), "0000/00/00")
        
        ' 指定日以前であればTrue。
        IsMovable = (TargetDate < specified_date)
End Function

実際に試してみると、指定日が当日までは移動不可で、翌日以降ならば
移動可となった。

夜も更けてきたので、今日はここまで。明日に続きます。

参考まで。