フォルダコピーとファイルの移動 ~ ② 移動先のフォルダ作成 ~

昨日は、いただいた問い合わせ内容を整理しながら、テスト環境を作成してみた。
infoment.hatenablog.com
今日も、昨日の続きから。

昨日の記事を書いた後、質問された方から幾つか条件の訂正連絡があった。

  1. フォルダの移動先に、フォルダAは最初からは存在していない。
  2. フォルダB1,B2・・・は、作成したフォルダAにコピーののち、元を削除したい。
  3. フォルダB1,B2・・・をループで処理したい。

ということで実際は、↓ 雲マークのフォルダAが存在しない場合は作る、という
修正のみでよさそうだ。

処理条件を眺めてみると、各Aの中の各Bをそれぞれ確認する必要があるので、
二重ループになりそうだ。

こんなとき、様々なアプローチがあると思うが、今回まず小さな範囲で処理を
作り、それをループさせる方式でやってみる。

ということで、「C:\Temp\コピー元\A\B1\20220701」を、コピー先に移動
させてみよう。

  1. フォルダパスから、「A」というフォルダ名を取得する。
  2. 取得した名称から、「C:\Temp\コピー元\A」というパスを作成する。
  3. 作成したフォルダパスが存在するか確認。存在しない場合は作成する。
  4. 作成した先に、「B1」を移動させる。
Sub Test()
    ' 階層Aのフォルダ名。
    Dim FolderA As String
        FolderA = "A"

    ' 階層Bのフォルダ名。
    Dim FolderB As String
        FolderB = "B1"
        
    ' 移動する部分のフォルダパス。
    Dim MovePartName As String
        MovePartName = "A\B1"

    ' 移動元のパス。
    Dim SrcFolderPath As String
        SrcFolderPath = FSO.BuildPath(SrcParentFolderPath, MovePartName)
    
    ' 移動先のパス。
    Dim DstFolderPath As String
        DstFolderPath = FSO.BuildPath(DstParentFolderPath, MovePartName)
    
    ' 階層Aの移動先フォルダパス。
    Dim DstFolderAPath As String
        DstFolderAPath = FSO.BuildPath(DstParentFolderPath, FolderA)
    
    ' 移動先のフォルダ有無確認。なければ作成する。
        If Not FSO.FolderExists(DstFolderAPath) Then
            MkDir DstFolderAPath
        End If
    
    ' フォルダ移動。
        FSO.MoveFolder SrcFolderPath, DstFolderPath
End Sub

実行してみると、コピー先にフォルダAが作成され、その下にB1以降の
フォルダおよびファイルが全て移動していることが分かる。

実際はループでの処理となるので、FolderAおよびBは引数として与えた
方がよさそうだ。

Sub MoveTargetFolder(folder_a As String, folder_b As String)
    ' 移動する部分のフォルダパス。
    Dim MovePartName As String
        MovePartName = folder_a & "\" & folder_b

    ' 移動元のパス。
    Dim SrcFolderPath As String
        SrcFolderPath = FSO.BuildPath(SrcParentFolderPath, MovePartName)
    
    ' 移動先のパス。
    Dim DstFolderPath As String
        DstFolderPath = FSO.BuildPath(DstParentFolderPath, MovePartName)
    
    ' 階層Aの移動先フォルダパス。
    Dim DstFolderAPath As String
        DstFolderAPath = FSO.BuildPath(DstParentFolderPath, folder_a)
    
    ' 移動先のフォルダ有無確認。なければ作成する。
        If Not FSO.FolderExists(DstFolderAPath) Then
            MkDir DstFolderAPath
        End If
    
    ' フォルダ移動。
        FSO.MoveFolder SrcFolderPath, DstFolderPath
End Sub

↓ こちらでテストしたところ、先程と同じ結果を得ることができた。

Sub test()
    MoveTargetFolder "A", "B1"
End Sub

次回はこれを、ループに組み込みます。

参考まで。