- ベストアンサー
複数フォルダ・複数ファイルの一括移動
- 質問者は、複数のフォルダとファイルを一括で移動したいという問題を抱えています。具体的には、支店社員と支店顧客のエクセルファイルとワードファイルが特定のフォルダ内に存在し、それらを別々のフォルダに移動したいとのことです。手動での移動ではなく、自動化した方法が求められています。
- 質問者は、移動先のフォルダ構造を示した図を提供しています。移動後のフォルダ構造は、年度ごとに月ごとのフォルダがあり、そこに社員データフォルダと顧客データフォルダが存在します。具体的なファイルの配置例も提供されています。
- 質問者は、コマンドプロンプト、パワーシェル、VBA、VBS、WSFなどの環境が使用可能であると述べています。これらの環境を使用して、自動で一括移動を行う方法を提案してもらいたいとのことです。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
ファイル名の先頭4文字が"支店社員"なのか、"支店顧客"なのかで 移動先のフォルダーを決めるということでいいですね? また、例示された移動先の1月は ─1月 ├─社員データ └─顧客データ 他方、12月は ─12月 ├─支店データ └─顧客データ と不一致です。 つまり、前者は社員データで、後者は支店データです。 後者を前提にしました。 更に、移動先の ─12月 ├─支店データ └─顧客データ これらのフォルダーはすでに作成されている前提としました。 複写のログをマクロブックのアクティブなシートに書き出しています。 マクロ実行中に異常が起きた場合に備え、移動ではなく複写にしました。 詳しくはコードを読んでください。 以下がサンプルなコードです。 Option Explicit Const GetDir = "C:\AAAA\BBBBB\2021年\データ" Const PutDir = "C:\AAAA\BBBBB\2021年" Dim FileCounter As Long Sub sample() FileCounter = 0 Cells.ClearContents GetFileName GetDir End Sub '//---全てのフォルダー内のファイルを総当たり Sub GetFileName(strPath As String) Dim tSfo As Object Dim tGf As Object Dim tFi As Object Dim tSub As Object Dim MyM As String '月 Dim PutPath As String Dim SubDir As String Set tSfo = CreateObject("Scripting.FileSystemObject") Set tGf = tSfo.GetFolder(strPath) For Each tFi In tGf.Files SubDir = "" MyM = "" If Right(strPath, 5) = "月\各顧客" And Left(Right(strPath, 7), 1) = "\" Then MyM = Left(Right(strPath, 6), 1) End If If Right(strPath, 5) = "月\各顧客" And Left(Right(strPath, 8), 1) = "\" Then MyM = Left(Right(strPath, 7), 2) End If If Right(strPath, 1) = "月" And Left(Right(strPath, 3), 1) = "\" Then MyM = Left(Right(strPath, 2), 1) End If If Right(strPath, 1) = "月" And Left(Right(strPath, 4), 1) = "\" Then MyM = Left(Right(strPath, 3), 2) End If If Left(tFi.Name, 4) = "支店社員" Then SubDir = "月\支店データ" End If If Left(tFi.Name, 4) = "支店顧客" Then SubDir = "月\顧客データ" End If FileCounter = FileCounter + 1 PutPath = PutDir & "\" & MyM & SubDir & "\" & tFi.Name Cells(FileCounter, 1).Value = strPath & "\" & tFi.Name If ((MyM <> "") And (SubDir <> "")) Then Cells(FileCounter, 2).Value = PutPath FileCopy strPath & "\" & tFi.Name, PutPath Else Cells(FileCounter, 2).Value = "複写対象外" End If Next For Each tSub In tGf.SubFolders GetFileName tSub.Path '再帰処理 Next End Sub
その他の回答 (2)
- SI299792
- ベストアンサー率47% (774/1619)
済みません。図を見間違い、 各顧客にあるものを顧客データに移し、 その上にあるものを、社員データに移せばいいと思っていました。 私のプログラムは使えません。無視して下さい。 本当に削除できないのは不便だ。
お礼
ご丁寧にありがとうございます。
- SI299792
- ベストアンサー率47% (774/1619)
Excel VBA でいいですか。 フォルダの移動だけを行います。中のファイル名はチェックしません。 画像の様に、親・変更前・変更後フォルダ名を入力して下さい。 Option Explicit ' Sub Macro1() Dim FSO As Object Dim Path As Object Dim RInp As Long Dim InpPath As String Dim OutPath As String ' Set FSO = CreateObject("Scripting.FileSystemObject") ' For Each Path In FSO.GetFolder([B1]).SubFolders ' For RInp = 2 To Cells(Rows.Count, "C").End(xlUp).Row InpPath = Path & Cells(RInp, "B") OutPath = Path & Cells(RInp, "C") On Error Resume Next MkDir OutPath FSO.MoveFile InpPath & "\*.*", OutPath RmDir InpPath On Error GoTo 0 Next RInp, Path End Sub
お礼
移動先のフォルダを作成する方法、移動の際にワイルドカードを使う方法など、詳しくありがとうございます。Cellsで列指定にアルファベットが使えることも初めて知りました。今後活用します。ありがとうございます。
お礼
詳しくありがとうございます。移動先にフォルダを分けて格納することができました。独力ではとてもできませんでした。ありがとうございます。