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

このQ&Aのポイント
  • ExcelのVBAを使用して、複数階層のフォルダからフォルダ名を取得する方法についてご質問いただきました。
  • 具体的には、Cドライブのtest1フォルダ内にあるdddフォルダ以下のフォルダ名を取得し、ExcelのSheet1に書き出す方法についてお知らせください。
  • 質問者様はVBAについての知識が不足しているため、ご教示いただけると幸いです。
回答を見る
  • ベストアンサー

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 勉強不足で申し訳ありません。 どうぞ宜しくお願い致します。

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

  • ベストアンサー
  • jcctaira
  • ベストアンサー率58% (119/204)
回答No.3

※サンプルプログラムです。 Public 設定セル As Range Sub フォルダ処理()  Const 開始フォルダ = "C:\TEST1"  Dim objFSO As Object  Dim objFolder As Object  Set objFSO = CreateObject("Scripting.FileSystemObject")  Set objFolder = objFSO.GetFolder(開始フォルダ)  Set 設定セル = Range("A1")  Call 該当フォルダ取得(objFolder)  Set objFolder = Nothing  Set objFSO = Nothing End Sub Sub 該当フォルダ取得(フォルダパス As Object)  Dim objSubFolder As Object  For Each objSubFolder In フォルダパス.SubFolders    Call 該当フォルダ取得(objSubFolder)  Next  If UCase(フォルダパス.ParentFolder.Name) = "DDD" Then    設定セル = フォルダパス.Name    Set 設定セル = 設定セル.Offset(1)  End If  Set objSubFolder = Nothing End Sub

kazu0056
質問者

お礼

回答ありがとうございます。 抽出結果に加え、コーディングの内容と、まさに自分が作りたかったものです。 >Const 開始フォルダ = "C:\TEST1" この部分に関しては、毎回指定・選択出来る形にしておこうと思いますので、 質問に記載していない部分を含め、調べて自己解決して完成させたいと思います。 皆様、本当にありがとうございました。

その他の回答 (3)

  • layy
  • ベストアンサー率23% (292/1222)
回答No.4

フォルダ操作は利用頻度高いと思うので、 いきなり回答VBAを実行せずに内容(仕組み)を理解してから行う方が良いです。 応用がきくので、リンク先載せておきます。 「すぐに役立つエクセルVBAマクロ集」サイト 「ブックマーク」 http://www.asahi-net.or.jp/~zn3y-ngi/YNxv252.html#1 1) フォルダ中のファイル名をシートに書く ネットでは、 ここ以外にも探せばいろいろ図解入り説明があると思います。

kazu0056
質問者

お礼

回答ありがとうございます。 仰る通り、今後色々な状況に対応するには、 根本を理解して自力で応用する必要がありますね。 単発操作はネットを参考に何とか分かるのですが、 それを他の操作と組み合わせたり繰り返す動作が現状飲み込めません。 今週末の休みに、参照先をしっかり勉強させて頂きます。

回答No.2

詳しくは書きませんが、ファイルシステムオブジェクトを使って、C:\test1を取得してFor Eachでディレクトリ名を取り出しながらシートに記載していくほうが簡単だと思います。

kazu0056
質問者

お礼

回答ありがとうございます。 やはりFileSystemObjectが使い勝手が良さそうですね。 C:\test\aaa\ddd\を指定して、SubFoldersで、 ddd内部のフォルダ名を取得する事までは出来ましたが、 それを各フォルダから一気に取得する事が出来ませんでした。 どうも自分は、何か根本的な所が理解出来ていないようです。

  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.1

>複数階層からのフォルダ名の取得 フォルダ名が取得できれば,各フォルダからのファイルは拾い上げられるという前提で。 Dir関数の再帰呼び出しとFileSystemObjectを使う方法の2通り,下記を参考にマスターしておきましょう。 http://www.moug.net/tech/exvba/0150117.htm ちなみにフォルダツリーの取得はあくまで途中経過で,最終的にはやはり中のファイルが必要だという場合,FileSearchする手も考えられます。ただしご利用のエクセルのバージョンによります。 http://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub05_110_130.html

kazu0056
質問者

お礼

回答ありがとうございます。 一応FileSystemObjectでの作成を考えています。 一部のフォルダ名の取得は自力で適いましたが、 各フォルダから拾い上げる事ができませんでした。 参照先の内容は非常に分かりやすいですね。 理解しておく必要がありますので、リンク先で勉強させて頂きます。

関連するQ&A

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

    VBA 多階層のフォルダーを配置換えする 2021/07/13 16:54 以下のような操作をEXCELのVBAで処理可能でしょうか ? --------------------- 例えば、 添付画像のような階層が深いフォルダーの各層の最後に存在している AAABBB,CCC,DDD,EEEの各フォルダーを#testに引き上げる。 ターゲットは、フォルダーでファイルではありません。 1段下層のフォルダーを引き上げるBATなどは検索すれば見つかりますが 階層が深い(多階層)の場合を見つけられませんでした。 (ファイルの場合は少し見つかりましたがフォルダーは見つけられませんでした。) 具体的には O:\#test\AAA O:\#test\#2\BBB O:\#test\#2\#3\CCC O:\#test\#2\#3\DDD O:\#test\#2\#3\#4\EEE を O:\#test\AAA O:\#test\BBB O:\#test\CCC O:\#test\DDD O:\#test\EEE に配置換えする 配置換え後は、O:\#test\#2及#2以降の下層のフォルダーは削除する。 ---------------------

  • VBAエクセル・・・フォルダ名を取得する

    VBA初心者です。 マクロで、ヘッダー部分にフォルダ名を入力したいのですが、 どのように取得すればよいでしょうか? ThisWorkbook.Path にすると、パスが出てきますが、 \C:\***\△△△\○○○\XXX.xls だとすると、「○○○」だけを入力したいのですが・・・ よろしくお願いいたします。

  • エクセルVBAでテキスト保存

    エクセルのファイルをメモ帳で保存する場合に下記のコードが書いてあります。 strFILENAME = xlAPP.GetSaveAsFilename(InitialFileName:="データxxx_yyy_zzz.txt",FileFilter:=cnsFILTER, Title:=cnsTITLE) このうち、ファイル名の"データxxx_yyy_zzz.txt"、xxx, yyy,zzzをそれぞれ、特定のセルから取得したい場合、どのように直せばいいのでしょうか? xxx=A1セル yyy=A2セル zzz=A3セル といった感じです。 よろしくお願いします。

  • フルパスから指定階層目のフォルダ名 VBA

    Access 2007のVBA (Access内モジュール)で、次の様な仕様の関数を作ろうとしていますが、プログラムから離れて10年超で、感が無くなってしまって冷や汗をかいています!!!! どなたか助けてもらえませんか? フォルダ名の指定階層数目の文字列を得る。 例 (文字列:フォルダ名相当)    abc\def\ghi\jkl\mno\pqr.xxx (数値:フォルダ階層指定数)  3 (返値)               ghi ・階層数より指定数値が大きいことはない。 ・なお、階層の最大値は15 固定の2階層目であれば、Left$(Mid$([FolderPath],InStr([FolderPath],"\")),InStr(Mid$([FolderPath],InStr([FolderPath],"\")+1),"\")) でOKそうですが、 初めての質問で戸惑っていますが、利用方法が間違っているようであればご指摘下さい。 よろしくお願いします。

  • EXCEL VBAで自作DLLを呼び出すには?

    EXCEL VBAで自作DLLを呼び出すことをしています。一応うまくいったのですが、他人のPCで実行すると、「DLLがみつかりません」というエラーになってしまいます。DLLは、C:\Windows\system32 に入れてもだめです。また、c:\Program Files\xxx\yyy.dll にDLLをおき、EXCEL VBAで、Declare Function zzz Lib "c:\Program Files\xxx\yyy.dll" Alias _zzz@8" ( ...) As Long と 絶対パスでDLLを指定してもだめです。自分のPCは、Windows XP SP2です。他人のPCもXPですが、幾分新しいXPのようです。VISTAでもうまくいきません。 これはいったいなぜでしょうか?新しいOSではセキュリティを堅牢にしたたまに、DLLの呼び出しを制限しているのでしょうか? どうやったらDLLを呼び出せるか、教えていただけないでしょうか? よろしくお願いいたします。

  • エクセル2007 複数セルのデータを1つに連結

    いつもお世話になります。 エクセルで、複数セルのデータを1つに連結して表示させる方法を教えてください。 データ件数が多い(1000件以上)ため、 関数(CONCATENATE)や、連結記号(&) は、セルを1つずつ選択する時間が掛かるため、 その他に方法があれば教えてください。 また関数(CONCATENATE)でセル範囲をドラッグなど簡単に指定できる方法があれば教えてください。 【やりたいこと】  A列が同じデータの場合、B列の値をC列のセルに連結して表示させたい 【イメージ】 A列 B列 C列 xxx aaa aaa bbb ccc ddd eee xxx bbb xxx ccc xxx ddd xxx eee yyy ffff fff ggg hhh yyy gggg yyy hhh zzz iii iii jjj zzz jjj

  • EXCEL VBA function で、引数のシート名を取得する

    EXCEL VBA で、 Function yyy(a) yyy = a.row とすると、a の行番号を返すことができます。 a のシート名を返す(取得する)には、どうしたらよいのでしょうか? * a にはセル範囲を渡すのは、運用上の約束としていますので、チェック等は不要です。 よろしくお願いします。

  • フォルダ名の取得方法

    お世話になります。 location.href="//xxx/yyy/zzz/index.html" のとき、 htmlName = location.href.substr(location.href.lastIndexOf("/")+1); で、htmlName ='index.html' と、なりますが、 htmlName ='zzz' を取得する方法はないものでしょうか。 よろしくお願いいたします。

  • エクセルについて教えてください

    異なる2つシートのデータを別のシートにまとめるにはどうすればよいのでしょうか。 2つのシートそれぞれには約1000件のデータがあります。 シート1 シート2  シート3 1 AAA | 1 QQQ |1 AAAQQQ 3 BBB | 2 XXX |2 XXX 5 CCC | 5 ZZZ |3 BBB 7 DDD | 6 YYY |5 CCCZZZ           |6 YYY           |7 DDD

  • Access VBAよりシート名を取得したい

    お世話になります。 現在、Accessにてツールを作成しておりますが、VBAより 特定のパスにあるExcelファイルのシート名を取得する必要が あります。 ※当該ツールはRuntime環境にて利用するため、CreateObject  が利用できません。 取得はDAO.Tabledefs を使って取得できましたが、GetObjectを 使って取得する方法をご教授頂けると幸いです。 シート名を取得するExcelファイルが、 C:\test\テスト.xlsxの場合 どのような記述になりますでしょうか。 勉強不足で大変恐縮ですが、ご教授のほど宜しくお願い致します。

専門家に質問してみよう