フォルダコピーとファイルの移動 ~ ② 移動先のフォルダ作成 ~
昨日は、いただいた問い合わせ内容を整理しながら、テスト環境を作成してみた。
infoment.hatenablog.com
今日も、昨日の続きから。
昨日の記事を書いた後、質問された方から幾つか条件の訂正連絡があった。
- フォルダの移動先に、フォルダAは最初からは存在していない。
- フォルダB1,B2・・・は、作成したフォルダAにコピーののち、元を削除したい。
- フォルダB1,B2・・・をループで処理したい。
ということで実際は、↓ 雲マークのフォルダAが存在しない場合は作る、という
修正のみでよさそうだ。
処理条件を眺めてみると、各Aの中の各Bをそれぞれ確認する必要があるので、
二重ループになりそうだ。
こんなとき、様々なアプローチがあると思うが、今回まず小さな範囲で処理を
作り、それをループさせる方式でやってみる。
ということで、「C:\Temp\コピー元\A\B1\20220701」を、コピー先に移動
させてみよう。
- フォルダパスから、「A」というフォルダ名を取得する。
- 取得した名称から、「C:\Temp\コピー元\A」というパスを作成する。
- 作成したフォルダパスが存在するか確認。存在しない場合は作成する。
- 作成した先に、「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
次回はこれを、ループに組み込みます。
参考まで。