• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:(VBA) 多階層のフォルダーの配置換え)

(VBA) 多階層のフォルダーの配置換え

このQ&Aのポイント
  • VBAを使用して、深い階層にあるフォルダーを配置換えする方法について教えてください。
  • 具体的な操作は、指定されたフォルダー内に存在するフォルダーを特定の場所に移動し、階層を変更することです。
  • 配置換え後は、指定されたフォルダー内の下層フォルダーは削除されます。

質問者が選んだベストアンサー

  • ベストアンサー
  • kkkkkm
  • ベストアンサー率65% (1645/2495)
回答No.18

> B列とC列が同じになる場合にC列にはパスを表示しないはずなのに > 9行目でB,C行共に同じなのにC列が表示されています。 OがB1は小文字でB2からは大文字だったのを見逃してました。 B列とC列の比較時に両方ともすべて小文字して比較するようにしました。 セルへの代入は大文字小文字今まで通りです。 If mCount = 1 And _ Cells(i, "B").Value <> Range("B1").Value & "\" & fso.GetFolder(Cells(i, "B").Value).Name Then Cells(i, "C").Value = Range("B1").Value & "\" & fso.GetFolder(Cells(i, "B").Value).Name End If の部分を Dim FName As String を追加して FName = Range("B1").Value & "\" & fso.GetFolder(Cells(i, "B").Value).Name If mCount = 1 And _ StrConv(Cells(i, "B").Value, vbLowerCase) <> StrConv(FName, vbLowerCase) Then Cells(i, "C").Value = FName End If に変更してください。

NuboChan
質問者

お礼

改正コード提示、ありがとうございます。 コードを修正して、検証した結果  下記のようにパスが修正できました。 https://imgur.com/VdHPbQ0 これで、サンプルディレクトリーでの検証が出来たので  ホントのディレクトリーでの改名に入りたいと思います。 ホントのディレクトリーで又新たな問題などが有りましたら  新規に質問するかもしれませんが今回は終了とさせてください。 今回も長々とお付き合い頂き感謝いたします。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (17)

  • kkkkkm
  • ベストアンサー率65% (1645/2495)
回答No.7

訂正です > O:\#test\#2\#3\BBB\#4\FFF > のような階層のパスがあると > O:\#test\#2\BBB > は無視されます。 これは無視されない感じです。

全文を見る
すると、全ての回答が全文表示されます。
  • kkkkkm
  • ベストアンサー率65% (1645/2495)
回答No.6

No5の補足です 不用になったフォルダは手動で削除するか、移動が終わった後でフォルダの中でサブフォルダがあるフォルダを削除するようにすればいいのではないかと思えます。

全文を見る
すると、全ての回答が全文表示されます。
  • kkkkkm
  • ベストアンサー率65% (1645/2495)
回答No.5

ベストな方法かどうかは分かりませんが B1にO:\#testが入っているとして Private Sub listSubFolders の Cells(n, "B").Value = Replace(fol.Path, PATH_, "") を Cells(n, "B").Value = Range("B1").Value & Replace(fol.Path, PATH_, "") に変更します。最下層フォルダー名取り出しにフルパスが必要な為と最後の移動にこのデータを使うため B列に O:\#test\#2 O:\#test\#2\#3 O:\#test\#2\#3\#4 という移動しないフォルダも出るのでC列に最下層として表示しないようにします。 B列のリストの各々パスの最後のフォルダ名がB列のリストで一度しか出現しないものを移動対象とします。 なので O:\#test\#2\#3\BBB\#4\FFF のような階層のパスがあると O:\#test\#2\BBB は無視されます。 Sub ②最下層フォルダー名() Dim fso As Object, i As Long, mCount As Long Dim LastRowsCount As Long LastRowsCount = Cells(1, "B").End(xlDown).Row Set fso = CreateObject("Scripting.FileSystemObject") For i = 2 To LastRowsCount mCount = WorksheetFunction.CountIf(Range(Cells(2, "B"), Cells(Rows.Count, "B").End(xlUp)), "*" & fso.GetFolder(Cells(i, "B").Value) & "*") Cells(i, "F").Value = mCount If mCount = 1 Then Cells(i, "C").Value = Range("B1").Value & "\" & fso.GetFolder(Cells(i, "B").Value).Name End If Next Set fso = Nothing Range("A:E").EntireColumn.AutoFit End Sub これでB列に移動元、C列に移動先がセットされます。 間違いがなければ回答No.2で紹介されていたMoveFolderを使います。 Sub 移動() Dim fso As Object, i As Long Dim LastRowsCount As Long Set fso = CreateObject("Scripting.FileSystemObject") LastRowsCount = Cells(Rows.Count, "C").End(xlUp).Row For i = 2 To LastRowsCount If Cells(i, "C") <> "" Then fso.MoveFolder Cells(i, "B").Value, Cells(i, "C").Value End If Next Set fso = Nothing End Sub 不用になったフォルダは手動で削除するか、F列にフォルダ名が出た回数を出しているのでそれの最大の行に該当するB列の対象フォルダを削除するコードで対応してください。質問のデータの場合O:\#test\#2が最大になっていると思います。

全文を見る
すると、全ての回答が全文表示されます。
回答No.4

もう答えの回答がついたかな? もし私がコーディングするなら?と考えてみました。VBAをいじっていたのは何年も前だったのでもうよく覚えていない。しかしなんとかしなくちゃ・・・ ということで、目標のディレクトリに共通する最も深いパス、質問文で言うと、 O:\#test\#2 をカレントディレクトリにして、DOSコマンドでファイル一覧を出し、結果をリダイレクション、その結果ファイルを解析します。VBAからDOSコマンドを実行できたと私は思いました。 OSがWindowsなら、コマンドは、 dir /s/ad /b > sumdir.txt でしょう。 VBAでsumdir.txtを加工・ファイル処理する。ディレクトリを移動するバッチファイルをVBAで作ってそれを実行もできそうな感じはします。 私の途中までの実験では、そのコマンドは、ファイルを抜かしてディレクトリだけ表示してます。

NuboChan
質問者

お礼

DOSコマンドの提示ありがとうございます。 今回はフルパスのリストは、VBAで作成できましたが DOSコマンドは次回利用できそうなので覚書に記録しました。

全文を見る
すると、全ての回答が全文表示されます。
  • kkkkkm
  • ベストアンサー率65% (1645/2495)
回答No.3

最下層のフォルダ名は たとえばフォルダのリストが A1=O:\#test\AAA A2=O:\#test\#2\BBB A3=O:\#test\#2\#3\CCC A4=O:\#test\#2\#3\DDD A5=O:\#test\#2\#3\#4\EEE となっていた場合、B列に最下層のAAA,BBB,CCC,DDD,EEEを表示します。 https://okwave.jp/qa/q9901225.html の時に使った.GetFolder().Nameを使います。 Sub Test() Dim fso As Object, i As Long Set fso = CreateObject("Scripting.FileSystemObject") For i = 1 To 5 Cells(i, "B").Value = fso.GetFolder(Cells(i, "A").Value).Name Next Set fso = Nothing End Sub

NuboChan
質問者

お礼

kkkkkmさん、毎回のアドバイス感謝いたします。 アドバイスを受けて以下のコードまで作成できました。 下記画像を参照下さい。 参照画像(最下層フォルダ名抜き出しまで) https://imgur.com/fHSEfzG --------------------------------------------------------- Option Explicit Private PATH_ As String ' 一覧を作成するルートフォルダーのフルパス Public Sub ①フルパスフォルダー名() Dim fso As Scripting.FileSystemObject Dim n As Long ' 書き出しを行う行番号 Range("A1") = "ターゲット" n = 1 PATH_ = Cells(n, "B").Value n = n + 1 Set fso = New FileSystemObject On Error GoTo ErrHndl listSubFolders fso.GetFolder(PATH_), n ExitSub: Set fso = Nothing Exit Sub ErrHndl: MsgBox Err.Description Err.Clear GoTo ExitSub End Sub Private Sub listSubFolders(ByVal folder_ As Scripting.Folder, ByRef n As Long) Dim fol As Scripting.Folder For Each fol In folder_.SubFolders Cells(n, "B").Value = Replace(fol.Path, PATH_, "") n = n + 1 listSubFolders fol, n Next Set fol = Nothing End Sub Sub ②最下層フォルダー名() Dim fso As Object, i As Long Dim LastRowsCount As Single LastRowsCount = Cells(1, "B").End(xlDown).Row Set fso = CreateObject("Scripting.FileSystemObject") For i = 1 To LastRowsCount Cells(i, "C").Value = fso.GetFolder(Cells(i, "B").Value).Name Next Set fso = Nothing Range("A:E").EntireColumn.AutoFit End Sub ------------------------------------------ 後は、以前作成した以下のコードが利用できそうですが 変名したいフォルダーのみA列にマーク(○)を入れるようにしたのと、 フォルダー構造が違うので試行錯誤していますが上手く処理出来ていません。 (B2セルのフォルダー名にC列の内A列に○を付けたフォルダー名のみを  &で連結して変名するのですがコードが出来ていません。) Sub ⑤フォルダー名の変更() Dim i As Long Dim LastColumn As Single Dim LastColumn_ABC As String Dim MSG As String LastColumn = Cells(5, "A").End(xlToRight).Column LastColumn_ABC = Split(Cells(1, LastColumn).Address, "$")(1) MSG = MsgBox("B列フォルダー名が" & LastColumn_ABC & "列フォルダー名に変更されます!" & vbCrLf _ & "B," & LastColumn_ABC & "列に値がなければ、処理は行いません。", 257, "フォルダー名変更") If MSG = vbCancel Then Exit Sub i = 5 'subフォルダ名取得が5行目からフォルダー名を表示するため。 Do While Range("b" & i).Text <> "" If Cells(i, LastColumn).Text <> "" Then ' 新フォルダー名がある場合のみ、名前変更を行う。 With CreateObject("Scripting.FileSystemObject") .GetFolder(Range("A2").Text & Range("B" & i).Text).Name = Cells(i, LastColumn).Text End With End If i = i + 1 Loop MsgBox "変名処理が終了しました。" End Sub ---------------------------------------------------------

全文を見る
すると、全ての回答が全文表示されます。
  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.2

https://whiteleia.com/%E3%82%A8%E3%82%AF%E3%82%BB%E3%83%AB-vba-%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80-%E7%A7%BB%E5%8B%95/ FSOですが、この記事を読んで、MoveFoldeメソッドでできませんか。 誤って、構成を崩したくないので、コピーなど取って、テストは慎重に行ってください。 模擬データ状態をつくりづらいので、言うだけで、すみません。

NuboChan
質問者

お礼

回答、ありがとうございます。 紹介いただいたサイトは私には理解が難しいです。 イメージとしては、下記のURLが参考になるのですが https://happy-tenshoku.com/post-1489/ 取得できるのがフォルダー名でフルパスでは無いので 他に参考になるサイトをサーチ中です。

NuboChan
質問者

補足

以下がフルパスを取得するのに参考になりそうです。 https://www.relief.jp/docs/excel-vba-recursive-list-folders.html

全文を見る
すると、全ての回答が全文表示されます。
回答No.1

可能だろう。VBAを使ってプログラマは、例えば、 O:\#test\#2\#3\#4\EEE という文字列を取得できる。たぶん。 ので、それを、 O:\#test\EEE と変換すれば良いだけだから。そのアルゴリズム・方針は、2番目の/の次~最後の/の手前を削除となる。

NuboChan
質問者

補足

回答ありがとうございます。 >文字列を取得できる   では、最初にApplication.FileDialog(msoFileDialogFolderPicker)で   ターゲットフォルダーを指定して   それぞれ各層にある最後のフォルダーのフルパスを取得するにはどのようなコードを利用しますか ?   フォルダーの変名については、コードを作れそうですが    フルパスの取得がネックになりそうです。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • ExcelのVBAでの複数階層からのフォルダ名の取得

    ExcelのVBAでの複数階層からのフォルダ名の取得 下記階層に対して以下の処理をExcelのVBAで行うにはどしたら良いか、 申し訳ありませんが、どうか教えて頂きたく思います。 C:\test1   ├\aaa\ddd   │   ├\xxx1\   │   └\yyy2\   │   ├\bbb\ddd   │   └\xxx3\   │   │   └\ccc\ddd       ├\xxx4\       ├\xxx5\       └\zzz6\ 1 C:\test1を指定する 2 1で指定した中にある各\dddフォルダ内にあるフォルダ名を順に取得する 3 2で取得したフォルダ名をExcelのSheet1のA1から順に書き出す Excel   A    B    C    D    E 1 xxx1 2 yyy2 3 xxx3 4 xxx4 5 xxx5 6 zzz6 7 8 9  Sheet1 Sheet2 Sheet3 勉強不足で申し訳ありません。 どうぞ宜しくお願い致します。

  • Excel VBA サブディレクトリの取得について

    Excel VBA についての質問です。 私は、VBAの初心者です。 フォルダ選択ダイアログを開き、あるフォルダを選択させます。 選択したフォルダ配下のファイルとサブフォルダにあるファイル一覧とそのファイルのパス取得したいです。 【例】D:\TEMP\AAA フォルダを選択 D:\TEMP\AAA  D:\TEMP\AAA\BBB\CCC.txt D:\TEMP\AAA\BBB\DDD\EEE.txt D:\TEMP\AAA\BBB\DDD\FFF.txt GGG.txt が存在する。 まず、フォルダAAAまで選択されたら、 以下の結果がエクセルに出力したいです。 BBB         CCC.txt BBB\DDD        EEE.txt BBB\DDD        FFF.txt               GGG.txt うまく伝えないかもしれないですが、ご教授お願いいたします。

  • 抽出して並べ替えたい

    初めまして 非常に悩んでいます。 エクセルシートの列に下記のようにデータが並んでいます。(文字列) AAA bbb ccc (空白) BBB ddd eee (空白) AAA bbb ccc (空白) AAA eee ggg 並べ替え後 AAA AAA BBB bbb eee ddd ccc ggg eee 尚、列上でセル位置は任意で、空白行も任意です。(1つ以上です) できれば関数でお願いします。 VBAの場合、使用したことがないので詳しくお願いします。

  • フォルダのアクセス制限

    \\AAA\(共有フォルダ)  - BBBフォルダ    - CCCフォルダ    - DDDファイル  - EEEフォルダ [やりたいこと] AAA共有フォルダ下のBBBフォルダだけ、フォルダの名称変更、移動・削除不可に設定したい。 BBBフォルダ下のCCCフォルダ、DDDファイルなどは自由に新規作成や変更削除可に設定したい。 BBBフォルダにどんなアクセス制限を付ければ実現可能でしょうか。 いくつか試しているのですが、一向にうまくいかなくて・・・

  • 1つ上の階層にフォルダを移動させるバッチファイル

    windows XPで下記のようなバッチファイルを作成したいです。 aaaフォルダ内にyyy.batと111フォルダがあり、111フォルダの中にbbbフォルダとcccフォルダがあるとします。なお、bbb、cccフォルダ内にはファイルが存在しています。 そしてaaa、bbb、cccの各フォルダの名称は可変します。 この状態でyyy.batにbbb、cccフォルダをaaaフォルダ内に移動させる(一つ上の階層に移動させる)バッチプログラムを作成したいと思っています。 どのようにすればいいのでしょうか。 お分かりの方、お教えいただけないでしょうか。 よろしくお願いいたします。

  • CSVに外部テキストファイルを列として追加する方法

    こんにちは。 CSVファイル(base.csv)の先頭列に、別のテキストファイル(add.txt)の中身を新規の列として挿入したいと考えているのですが、よい方法がわかりません。。。 どうのような方法を使えば対応することができるでしょうか? どうぞよろしくお願いいたします。 ■CSVファイル(master.csv) title,developer_name,seller_name,primary_genre_name,application_url AAA,BBB,CCC,DDD,EEE AAA,BBB,CCC,DDD,EEE AAA,BBB,CCC,DDD,EEE AAA,BBB,CCC,DDD,EEE ■テキストファイル(add.txt) id 000 111 222 333 ↓ ■目標としたファイル(master.csv) id,title,developer_name,seller_name,primary_genre_name,application_url 000,AAA,BBB,CCC,DDD,EEE 111,AAA,BBB,CCC,DDD,EEE 222,AAA,BBB,CCC,DDD,EEE 333,AAA,BBB,CCC,DDD,EEE

  • awkやsed等で特定の文字間を抜き出す

    cat text aaaa bbbb <AAA> ccc ddd <BBB> eee とあるときに <AAA> ccc ddd <BBB> だけ抜き出したいです。 どのようにすればよいでしょうか?

  • SQLについて

    aaa bbb ccc ddd eee ggg hhh ---------------------------------------------- 111 111 111 111 111 111 111 112 112 112 112 112 112 111 112 113 113 113 113 113 111 114 114 114 114 114 114 111 114 114 114 114 114 114 112 114 115 115 114 114 115 111 114 115 115 114 114 115 112 116 116 116 116 116 116 111 116 116 116 116 116 116 112 116 116 116 116 116 117 111 116 116 116 116 116 117 112 118 118 118 118 118 118 118 上記のようなデータより、SQLのSELECTを使用して、以下のように抽出したいです。 抽出条件は以下が全て満たしているものとなります。 ・aaa,ccc,ddd,eee,gggが重複、hhhが小さいもの ・bbbが異なるもの aaa bbb ccc ddd eee ggg hhh ---------------------------------------------- 112 112 112 112 112 112 111 ・・・(1) 112 113 113 113 113 113 111 ・・・(1) 114 114 114 114 114 114 111 ・・・(2) 114 115 114 114 114 115 111 ・・・(2) (1)はaaa,ccc,ddd,eee,gggが重複、bbbが異なるため抽出対象 (2)はaaa,ccc,ddd,eee,gggが重複、bbbが異なるため抽出対象  また、hhhが小さいもの 以上、よろしくお願いします。

  • accessvbaで内容を結合して保存

    accessvba初心者です。質問なのですが下記のようなxmlファイルがあるとします。 <?xml version="1.0" encoding="shift_jis"?> <データ> <aaa> <bbb>1</bbb> <ccc>2</ccc> <ddd>3</ddd> <eee>4</eee> <fff>5</fff> </aaa> </データ> これをvbaにて<bbb><ccc><ddd><eee>の内容を取り出し結合して出来た1234をAテーブルのBフィールドにレコード保存したいのですが出来ますでしょうか? テーブルを開いてフィールドに保存する部分はなんとか理解出来たのですが要素を取り出して結合する部分がわかりません。 access2003を使用しています。よろしくお願いします。

  • EXCELのVBAで空白列を削除して左づめにできますか?

    いつも参考にしています。まだ、マクロの記録にチョット手を加えて自動化?している程度の腕前ですが? 仕事の都合で下記の問題を解決しなくてはならなくなり、皆様のお知恵をお借りしたいと思い質問させて頂きます。 エクセルのワークシートに空白のセルがランダムに入っているデータがあります。これを、ある列まで(例ではD列までの左の空白セルをなくして左づめのデータとしたいのです。 (例)  | A | B | C | D | E | 1|AAA|BBB|CCC|DDD|EEE| 2|   |BBB|CCC|DDD|EEE| 3|AAA|   |CCC|DDD|EEE| 4|AAA|   |CCC|   |EEE| 5|   |   |   |DDD|EEE|     ↓  | A | B | C | D | E | 1|AAA|BBB|CCC|DDD|EEE| 2|BBB|CCC|DDD|   |EEE| 3|AAA|CCC|DDD|   |EEE| 4|AAA|CCC|   |   |EEE| 5|DDD|   |   |   |EEE| ここで、E列以降は詰めないでほしいのです。 できれば、VBAで実現したいのですが、どのような考えで、どのようなコード?を書けばよいのか教えてください。 質問の仕方も用途を得ないで、失礼な質問になっていると思いますが、よろしくお願いします。

このQ&Aのポイント
  • Win Zip self-Extractorが表示され、プリンターのドライバーのダウンロードができない状況です。
  • 富士通FMVの場合、Win Zipをダウンロードしていない状態でもWin Zip self-Extractorが表示される場合があります。
  • 解決方法としては、Win Zip self-Extractorを閉じて、プリンターのドライバーを別の方法でダウンロードすることができます。
回答を見る

専門家に質問してみよう