• ベストアンサー

Excel VBAでサブフォルダ内のファイルを呼び出したい

フォルダの下に複数階層のサブフォルダがあり、その下に複数のエクセルブックがあります。これらのブックのシート複数ですが、名前は統一されています。 これらのファイルを呼び出した上でのある特定の名前のシートを呼出し、それぞれ1枚のシートに上から順に貼り付けたいと考えています。 よろしくご教授お願いします

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

  • ベストアンサー
  • argument
  • ベストアンサー率63% (21/33)
回答No.6

こんばんわ matchy4649 さん ん~すっかり夜ですね。晩御飯の支度をする前にちょちょいと作って回答を投下しておきましょう。 以下は二階層ならば正常に動作します。 c:\workの部分はあなたの任意のフォルダ名とし、以下を新規bookに書き込んでください。 Sub test() directory = "C:\work" For Each fl In CreateObject("Scripting.FileSystemObject").GetFolder(directory).subfolders: fn = fn & directory & "\" & fl.Name & "/": Next: If InStr(fn, "\") > 0 Then folderlist = Split(Left(fn, Len(fn) - 1), "/") Else folderlist = Array("") For i = 0 To UBound(folderlist) fn = "": For Each fl In CreateObject("Scripting.FileSystemObject").GetFolder(folderlist(i)).Files: fn = fn & fl.Name & "/": Next: If InStr(fn, "/") > 0 Then filelist = Split(Left(fn, Len(fn) - 1), "/") Else filelist = Array("") For j = 0 To UBound(filelist) Workbooks.Open Filename:=folderlist(i) & "\" & filelist(j): Sheets("3").Select: Sheets("3").Copy Before:=Workbooks(ThisWorkbook.Name).Sheets(1): Sheets("3").Name = Left(filelist(j), Len(filelist(j)) - 4) & "3" Next Next End Sub どうですか?実行してみましたか?新規bookには 「各ファイル名&3」という名前で全てのbookシート3が新規bookに追加されました。 詳細を頂けなかったのでこれは二階層専用です。ちなみに順番は気にしませんでした。どうしてもというならば実装しますが・・・。 少なからず現状の仕様みたし、現在おっしゃるディレクトリ構成ならば正常に動作するはずです。 追加処理・処理違い・補足等あればいってください。

matchy4649
質問者

お礼

ありがとうございました!出来ました!!

その他の回答 (5)

  • argument
  • ベストアンサー率63% (21/33)
回答No.5

こんばんわ matchy4649 さん 日も暮れてきましたね。 つまり一つのbookに、とあるフォルダの下位階層の全てのbookのsheet3をアルファベット順にシートに纏める。でよろしいですか? また、bookの数などどうにでも処理できますが、階層は二階層までなのでしょうか?それならば再帰的にする必要はほぼない。 以下の用に三階層以上 root │ ├あ:フォルダ │├a:book │├b:book │├c:book │├い ││├h:book ││├i:book ││└j:book ││ ・ ・ のようにならない?ならないのであれば全然再帰的処理じゃなく二階層分でよいのでもっと楽(処理の書き方が少し変わってきます)。 まぁ条件さえきちんと分かれば基本的に回答つまりソースを書いても構いませんが。 最初に言ったとおり"仮に"作成依頼の場合。本来は規約違反だと知っていますよね? VBAのカテゴリ以外でも本来は 「自分はソースがここまでかけます。ここまでかけましたがこの処理がうまくいません」と書くのがマナーです。 まぁ良いでしょう。回答者が減る(もしくは削除依頼を誰かに出されいつの間にか消える)程度の問題です。 それに私はどうせ分かる範囲なら回答してしまうでしょうから…。

  • argument
  • ベストアンサー率63% (21/33)
回答No.4

おはようございます matchy4649 さん 久々の休日で寝すぎました(朝方までおきてたので)。 まぁそんなことはどうでもいいですね。 3番さんの説明(処理定義)を見てもさっぱりわかりませんでした。 2の補足より後の回答なのに補足のフォルダ・ファイル名が完全無視でいまいちよくわかりません。この問題にrenge(セル処理)は必要ない気がしますし・・。 とりあえず、今回の問題を私が書くならばこのように纏めますがどうでしょうか?意味はあってますか? まず、現在下記のように用にファイルが格納されています。 root(とあるフォルダ) │ ├あ:フォルダ │├a:book │├b:book │└c:book │ ├2:フォルダ │├d:book │├e:book │└f:book ・ ・ ・ これ以降も複数あり、さらにあり階層も深くなる また、bookのシート名は統一されており以下のような構成である book ├1:sheet ├2:sheet └3:sheet 今回するべき処理は以下となる ・各階層に新規bookを作成する(ただしほかにbookがない場合は作成しない)。 ・新規bookに必要なデータはその階層にあるアルファベット名のbookのシート3全てである ・シートはアルファベット順で格納される事 処理後は下記のようにデータが格納されている事。 また、深くネストしていてもrootフォルダ配下全てのファイルが対象となる。 root │ ├あ:フォルダ │├新規book ││├(sheet1)aのbookのsheet3 ││├(sheet2)bのbookのsheet3 ││└(sheet3)cのbookのsheet3 ││ │├a:book │├b:book │└c:book │ ├2:フォルダ │├新規book ││├(sheet1)dのbookのsheet3 ││├(sheet2)eのbookのsheet3 ││└(sheet3)fのbookのsheet3 ││ │├d:book │├e:book │└f:book ・ ・ ・ 「こうですか?わかりません」 どうやらこの言葉はネタらしい。とつい最近しりました。いや、まぁどうでもいいんですが。このような感じの処理なのでしょうか? もちろんこうなれば再帰的処理が必要になりfsoも必要でしょうが。

matchy4649
質問者

補足

argumentさんこんにちは。この表示だと分かりやすいですね。 自分がどれだけ分かりにくい説明をしていたか痛感します。 ありがとうございました。引用させていただきました。恐縮です。 私がやりたいのは以下のような事です。 ただし、「あ」フォルダ、「2」フォルダのファイル数はいつも一定ではありません。 root │ ├あ:フォルダ ││ │├a:book │├b:book │└c:book │ ├2:フォルダ │├d:book │├e:book │└f:book ・ ・ ・ 新規book ││├(sheet1)aのbookのsheet3 ││├(sheet2)bのbookのsheet3 ││└(sheet3)cのbookのsheet3 ││└(sheet4)dのbookのsheet3 ││└(sheet5)eのbookのsheet3 ││└(sheet6)fのbookのsheet3 ご教授願えたら幸いです。

回答No.3

質問を次の様に理解して、回答します。 ・マクロによって作成されるファイルのNameを[AA]、Fullname(保存場所を含めたName)を[BB]とします。 ・ファイルAAのシート名を左から順に[A][B][C][D]とします。 ・参照するファイルのFullnameを[AAA][BBB][CCC][DDD]とします。 ・また、貼付するシートの名を[X]とします。 ・なお、「各種名前のデータがマクロを実行するファイルのシート[Y]に次のように記述してある。」とします。  セルA1;AA,セルA2;BB,セルB1;A,セルB2;B,セルB3;C,セルB4;D, セルC1;AAA,セルC2;BBB,セルC3;CCC,セルC4;DDD,セルD1;X マクロ文 Dim P Dim PP,QQ,RR Dim PPP() Sheets(Y).Select PP=Range("A1").Value QQ=Range("A2").Value RR=Range("D1").Value ReDim PPP(4,2) For P=1 To 4 PPP(P,1)=Cells(P,2).Value PPP(P,2)=Cells(P,3).Value Next P For P=1 To 4 Workbooks.Open FileName:=PPP(P,2) IF P=1 THEN Sheets(RR).Copy ActiveWorkbook.Name=PP Else Sheets(RR).Copy After:=Workbooks(PP).Sheet(P-1) End If ActiveSheet.Name=PPP(P,1) Workbooks(PPP(P,2)).Close False Next P Workbooks(PP).SaveAs FileName:=QQ **これは一例です。 データの取得方法、変数の定義の仕方等々を創意工夫して、 ご自分の理解し易い記述をして下さい。

  • argument
  • ベストアンサー率63% (21/33)
回答No.2

こんばんわ matchy4649 さん 名前が統一されているというのは同じ名前なのかはたまた連番か何かで規則性があるという意味なのか・・。同じ名前ならば同名ブックは同時に開けないので呼び出した上ではなく順に呼び出すとなります。 順に開いた上でその中のシートを選択するのかなぁ? >それぞれ1枚のシートに上から順に貼り付けたい ここの意味が特にわからない。 文章が全体的に抽象的で何がどれを指しているのかわかり辛すぎる。 ディレクトリ構成はどうでもいいとしてもどんな作業がしたいかさっぱりわからない。作業例もない。例文ない。仮に作業依頼にしても作成すらできません。 ちなみに再帰的処理が必ずしも必要なわけではありません。 再帰的処理"でも"できるだけで、なくても下位フォルダ・下位ファイルの全取得は可能です(もちろんソース的には再帰的処理の方が断然きれいですけどね。)

matchy4649
質問者

補足

argumentさん、こんばんは。 読み返してみると本当に分かりにくい文章でした。申し訳ありません。 ファイル名は「あ」というフォルダの下に「a」、「b」、「c」というファイルがあり、2というフォルダの下に「d」、「e」、「f」というファイルがあります。 「a」、「b」、「c」、「d」、「e」、「f」はそれぞれ「1」、「2」、「3」という3つの同じ形式のシートで構成されております。 そのうちうシート「3」のみをそれぞれ特定のファイルにシート貼付を行いたいと考えております。 (新規ファイルのsheet1にファイル「a」の「3」を、sheet2にファイル「b」の「3」を、sheet3に「c」の「3」を、sheet4に「d」の「3」を、と考えています。文章が稚拙ですみません。 当方Excel2002使用です。

  • marbin
  • ベストアンサー率27% (636/2290)
回答No.1
matchy4649
質問者

お礼

下のリンクが役立ちました。ありがとうございました!

関連するQ&A

  • VBA サブフォルダ内のエクセルファイル転記

    VBAについてお尋ねします。 当方VBA初心者です。 やりたい事は下記です。 ・サブフォルダ(2階層目)に入っているエクセルファイルからマクロ実行ファイルにセルデータを転記 ・全てのサブフォルダを網羅 サブフォルダに対しての扱いが難しくて理解に困ってます。 サルプルなどありましたらいただけると幸いです。 よろしくお願いします。

  • エクセルVBAをつかってフォルダ内のファイルの特定シートのデータを1つのシートにまとめる

    はじめまして。 過去ログ検索しましたが、載っていないようなので投稿させていただきます。 ブックAがあるフォルダ内にある「○年*.xls」のさらに「○月(○月以外のシートもあり)」のシート内の特定のセル(範囲は固定されてます)の文字列を、全てブックAの1つのシートにまとめたいのですが、VBAにてこれは可能ですか? フォルダ内のファイルが複数だったり、またそのファイル内の該当シートが1つだったり複数だったりで、かなり行き詰ってます。 どなたかご存知の方いらっしゃいましたらご教授願います。 エクセル2000を使用しております。

  • エクセルVBAで複数のファイルをひとつにまとめる

    はじめまして。 VBA初心者で恐縮なのですが、教えてください。   ブックAAAがあるフォルダ内に複数ある「***.xls」の全てのフイルのシート「A」内の特定のセル(A1:F30)の文字列を、全てブックAAAの1つのシートの特定の列(A:F)に重ねてまとめたいと思っています。 但し、シート「A」は非表示となっていて、また、「***.xls」のファイルは全て「ブックの保護」がかかっているため、シート「A」を表示させるためにはパスワードの入力が必要となります。 これをVBAを使って実行することは可能でしょうか。複雑で手に負えず行き詰っています。 どなたかご存知の方いらっしゃいましたらご教授願います。 エクセル2007を使用しております。  

  • フォルダに入っている複数のファイルをコピーしたい。

    エクセルなのですが、 1つのフォルダに入っている複数のエクセルファイルを 1つのエクセルファイルに(下に付け加えて)まとめたいと思っています。 このようなことをやりたいと思っているのですが、 お力をお貸ししていただけないでしょうか? どのシートも形式は同じなのですが、 1つのエクセルファイルに複数のBookがある場合もあります。 中身としてはA~Z列まであり、また行についてはそれぞれのシートによって異なります。 そして、どのシートに対しても1~3行についてはタイトル等が書いてありますので、 4行目以降でデータが入っているところまで、同じフォルダに用意したファイルに 順番にコピーしていきたいと思っています。 色々と試してみたのですが、どうしても複数のファイルから取り出してくることができなくて、 すみませんがよろしくお願します。

  • エクセルVBAで全てのサブフォルダ内にファイルをコピー

    お世話になります。 サブサブフォルダが、100個くらい入ったサブフォルダがさらに20個くらいメインフォルダの中にあります。 エクセルのマクロで、全てのフォルダの中に、 メインフォルダにおいてあるファイルをコピーして入れたいのですが、 どなたかご教授ください。

  • VBA_フォルダ内複数のExcelファイルの集約

    Excel VBAに関する質問です。 特定のフォルダ内(例としてC:\folder1)の複数のExcelファイルにおける シート(例としてSheet1)内のセル範囲A2:I1000の情報をコピーし、 特定のフォルダ内に格納されたExcelファイル(例としてC:\tougou\tougou.xls)の シート(例としてTOUGOU)内のA2を起点に貼り付け処理をしたいのですが、可能でしょうか? <貼り付けイメージ> (例)特定のフォルダ内(例としてC:\folder1)のExcelファイル数が2つの場合 A2 B2 ・・・・・I2 ・ ・ ・ ・ ・ A1999・・・・・・I1999 A2~I1999の範囲にデータが集約される。 どうぞよろしくお願いいたします。

  • サブフォルダを含めた最新のエクセルを取得したいです

    VBA初心者です。 ①サブフォルダを含めた最新更新日のエクセルファイルを取得したいです。 ②そして、最新更新日のエクセルファイルは、そのエクセルが入っていたフォルダの名前に変更し、別フォルダへコピーしたいです。 お手数ですが、ご教授ください。

  • Excel VBA でサブフォルダ含むファイル名取得

    勉強不足で申し訳ないですが、以下の処理をExcel VBAでやるにはどうしたらいいでしょうか? 仮に「C:\aaa」をルートフォルダとします。そのルートフォルダ下には「2008年」「2009年」など年の名前を付けたフォルダだけがあり、他に余計なファイル等はありません。そして、その「2008年」など年の名前のフォルダに、雑多なファイルが入っています。大雑把に図にすると、次のような感じです。 C:\aaa ├2008年 │ ├a1.pdf │ └a2.pdf │ └2009年   ├b5.pdf   └b6.pdf そして、添付の図のように、A列には「2008年」などサブフォルダ名が、B列には「a1」などファイル名が出力されるようにしたいのです。なお、 (1)B列のファイル名の拡張子は、消えれば最高ですが、別に消えなくてもいいです。 (2)B列のファイル名をクリックするとファイルが開けるハイパーリンクがあると、嬉しいです。別になくてもいいです。

  • エクセルのVBA

    A-B-Cとうフォルダの階層構造になっていて、Cにたくさんの音声ファイルがあります。そのファイルをエクセルのセルの列の上から順に挿入していくプログラムを作りたいと思っています。Cの階層にはいくつかの有限のフォルダがあります。これを自動化したいと思っています。 なかなか、ファイルを一気に扱う、挿入するという書き方がみつかりませんでした。なんとか力をかしてください。よろしくお願いします。

  • VBAで複数のフォルダから最新のファイルを検索してコピーするには?

    はじめましてこんにちは!エクセルを少しいじり始めた者です。 エクセルのVBAで複数のフォルダから最新更新日のファイルを検索して特定シートのセルD1からF20までをコピーして貼り付けるにはどのようにコードを書いたらいいのでしょうか?具体的に申し上げますと、ある特定のフォルダの中に複数のフォルダが入っており、複数のフォルダにはそれぞれ同じ名前の後に日付が入っていて、さらにその中には同じファイル名の後に日付が付いているファイルがあります。(「日本」フォルダの中に「日本200401」、「日本200402」、「日本200403」フォルダが入っていてさらにそれぞれのフォルダ内には「全国200401」」、「全国200402」、「全国200403」みたいな感じでフォルダ名と同じ日付が付いたファイルが入っています。) その複数のフォルダの中から最新更新日時のファイルだけを開いて特定のシートからデータをコピーして貼り付けるにはどのようにコードを記述したら良いのでしょうか?

専門家に質問してみよう