先日、このような問い合わせをいただいた。
そこで、私の場合どのようにゴールするか、検討過程も含めて紹介しようと思う。
※現時点でこの課題は、未解決の状態です(超見切り発車)。
あるフォルダから、別のフォルダへファイルを移動したい。また、移動先の
フォルダ名は、もと居たフォルダ名をコピーして作りたい。
ということで、こんな感じで 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
実際に試してみると、指定日が当日までは移動不可で、翌日以降ならば
移動可となった。
夜も更けてきたので、今日はここまで。明日に続きます。
参考まで。