質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

2回答

3055閲覧

複数のサブフォルダの中身をひとつのフォルダにまとめたい

seiya811

総合スコア15

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2018/10/19 07:42

前提・実現したいこと

「A」→「画像」→「a」
「B」→「画像」→「b」
「C」→「画像」→「c」

という状態で納品されます。
・「」内はフォルダ名、→はサブフォルダを意味します
・真ん中の「画像」は必ずこの名前で納品されます
・「A」「B」「C」は同じフォルダに入っています
・アルファベット部分は毎回名前が変わります(法則性もありません)

「画像」という一つのフォルダに、
「a」「b」「c」のフォルダが格納されている状態を作りたいと思っています。

発生している問題・エラーメッセージ

下記のコードで、
新しく「画像」フォルダを作りその中に「a」を入れる、は出来たのですが、
「b」も「c」も同じフォルダに入れる方法が分からず、困っております。

エラーメッセージ

該当のソースコード

excel

1Option Explicit 2 3Sub フォルダをまとめる() 4 5'「画像」フォルダが無ければ新しく作る 6 7Dim objF1 As Object 8Set objF1 = CreateObject("Scripting.FileSystemObject") 9 10Dim strFPath1 As String 11 12 If objF1.FolderExists(ThisWorkbook.Path & "\" & "画像") Then 13 14 Else 15 strFPath1 = objF1.CreateFolder(ThisWorkbook.Path & "\" & "画像") 16 17 End If 18 19'「画像」フォルダに移動 20 21Dim FSO As FileSystemObject 22Set FSO = New FileSystemObject 23 24Call FSO.MoveFolder(ThisWorkbook.Path & "\フォルダA\画像*", ThisWorkbook.Path & "\画像\") 25 26Set FSO = Nothing 27 28End Sub

試したこと

補足情報(FW/ツールのバージョンなど)

Excel 2013・OSはwindows 7です。
不足情報、不明点等御座いましたらお申し付けください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

あなたが作成したマクロに多少手を加えました。
Const baseFolder As String = "d:\goo\data"
は、移動元のフォルダをまとめたフォルダです。
baseFolder\folderA\画像\subA1
baseFolder\folderA\画像\subA2
baseFolder\folderB\画像\subB1
baseFolder\folderB\画像\subB2

のようにあるとすると、subA1,subA2,SubB1,subB2が移動されます。
ThisWorkbook.Path\画像に移動されます。

ThisWorkbook.Path\画像は、baseFolderの下には作成しないでください。
(作成した場合はThisWorkbook.Path\画像も移動対象となってしまいます)

VBA

1Sub フォルダをまとめる() 2 3 Const baseFolder As String = "d:\goo\data" '移動元の「画像」フォルダ 4 Dim objF1 As Object 5 Set objF1 = CreateObject("Scripting.FileSystemObject") 6 Dim strFPath1 As String 7 strFPath1 = ThisWorkbook.Path & "\" & "画像" 8 '「画像」フォルダが無ければ新しく作る 9 If objF1.FolderExists(strFPath1) = True Then 10 Else 11 Call objF1.CreateFolder(ThisWorkbook.Path & "\" & "画像") 12 End If 13 Dim FSO As FileSystemObject 14 Dim flds As Folders 15 Dim fld As Folder 16 Dim gflds As Folders 17 Dim gfld As Folder 18 Dim errmsg As String 19 Dim fctr As Long 20 Dim ectr As Long 21 errmsg = "" 22 fctr = 0 23 ectr = 0 24 Set FSO = New FileSystemObject 25 '移動元の「画像」フォルダに移動 26 Set flds = FSO.getfolder(baseFolder).subfolders 27 For Each fld In flds 28 'そのフォルダに「画像」のフォルダがあるなら、その下のフォルダを異動先の画像フォルダへ移動する 29 If FSO.FolderExists(fld & "\画像") = True Then 30 Set gflds = FSO.getfolder(fld & "\画像").subfolders 31 For Each gfld In gflds 32 On Error GoTo ERROR99 33 Debug.Print "2", gfld 34 fctr = fctr + 1 35 FSO.MoveFolder gfld, strFPath1 & "\" 36 Next 37 End If 38 Next 39 Set FSO = Nothing 40 MsgBox ("移動完了フォルダ数=" & fctr - ectr & " 移動不可フォルダ数=" & ectr) 41 If errmsg <> "" Then 42 MsgBox ("以下のフォルダは既に同名フォルダが移動先に存在しますので移動されませんでした。" & vbLf & errmsg) 43 End If 44 Exit Sub 45ERROR99: 46 ectr = ectr + 1 47 errmsg = errmsg & gfld & vbLf 48 Resume Next 49End Sub 50

投稿2018/10/20 09:34

tatsu99

総合スコア5438

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

seiya811

2018/10/21 07:42

返信が遅くなり申し訳ありません。 動作確認をしたところ、希望通りの処理が出来ました! メッセージボックスやエラー処理も追加していただき、 非常に使いやすくなりました! ありがとうございます!
guest

0

私の場合、 * を使わないようにします。
あまり美しくないですが、下記のよう書き換えてみました。

VBA

1'「画像」フォルダに移動 2Dim FSO As FileSystemObject 3Set FSO = New FileSystemObject 4 5Dim FSOfolder As Folder 6 7For Each FSOfolder In FSO.GetFolder(ThisWorkbook.Path & "\フォルダA\画像").SubFolders 8 Call FSO.MoveFolder(ThisWorkbook.Path & "\フォルダA\画像\" & FSOfolder.Name, ThisWorkbook.Path & "\画像\") 9Next FSOfolder 10 11For Each FSOfolder In FSO.GetFolder(ThisWorkbook.Path & "\フォルダB\画像").SubFolders 12 Call FSO.MoveFolder(ThisWorkbook.Path & "\フォルダB\画像\" & FSOfolder.Name, ThisWorkbook.Path & "\画像\") 13Next FSOfolder 14 15For Each FSOfolder In FSO.GetFolder(ThisWorkbook.Path & "\フォルダC\画像").SubFolders 16 Call FSO.MoveFolder(ThisWorkbook.Path & "\フォルダC\画像\" & FSOfolder.Name, ThisWorkbook.Path & "\画像\") 17Next FSOfolder 18 19Set FSO = Nothing

<追記>
フォルダ名が固定でないことを踏まえ、For Each 構文の多重ループを使用してみました。
その後、移動先に同一フォルダ名が存在する場合のエラー回避処理を追加しました。
動作確認をしていませんが、参考にしてください。

VBA

1'「画像」フォルダに移動 2Dim FSO As FileSystemObject 3Set FSO = New FileSystemObject 4 5Dim fol1 As Folder, fol2 As Folder, fol3 As Folder 6 7For Each fol1 In FSO.GetFolder(ThisWorkbook.Path).SubFolders 8 If fol1.Name <> "画像" Then 9 For Each fol2 In fol1.SubFolders 10 For Each fol3 In fol2.SubFolders 11 If FSO.FolderExists(ThisWorkbook.Path & "\画像\" & fol3.Name) Then 12 MsgBox "同一フォルダ名がありますので処理をスキップします。" 13 Else 14 FSO.MoveFolder CStr(fol3), ThisWorkbook.Path & "\画像\" 15 End If 16 Next fol3 17 Next fol2 18 End If 19Next fol1 20 21Set FSO = Nothing

投稿2018/10/19 08:26

編集2018/10/22 10:17
TanakaHiroaki

総合スコア1063

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

seiya811

2018/10/19 08:42

早速のご回答ありがとうございます。 説明がわかりづらく申し訳ありません。 「A」「B」「C」とした部分は毎回内容が変わります。 カメラマンに写真を撮っていただき、画像を納品していただくのですが、 例えば猫の写真をとった場合は「猫」→「画像」→「cat」で納品され、 犬の写真をとった場合は「犬」→「画像」→「dog」で納品される、といった形です。
TanakaHiroaki

2018/10/19 09:06 編集

「A」「B」「C」を変数にすることで解決できます。 コードを美しくしたければ、for Each 構文を多重ループにする方法が よいと思います。 私が記載したコードを参考にご自身で考えてみてください。
seiya811

2018/10/20 02:21

ご回答ありがとうございます。 参考にさせていただきます。
TanakaHiroaki

2018/10/20 02:37 編集

For Each 構文の多重ループを使用したコードを追記しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問