• ベストアンサー

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列のファイル名をクリックするとファイルが開けるハイパーリンクがあると、嬉しいです。別になくてもいいです。

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

  • ベストアンサー
回答No.3

Sub test() Dim fso As FileSystemObject, fol As Folder, sfol As Folder, f As File Dim ws As Worksheet Dim rn As Range Dim fn As String Set fso = CreateObject("scripting.filesystemobject") Set fol = fso.GetFolder(ThisWorkbook.Path) Set ws = ActiveSheet Set rn = ws.Cells(2, 1) For Each sfol In fol.SubFolders For Each f In sfol.Files rn.Value = sfol.Name fn = Left(f.Name, InStr(1, f.Name, ".") - 1) ws.Hyperlinks.Add anchor:=rn.Offset(, 1), Address:=f.Path, TextToDisplay:=fn Set rn = rn.Offset(1) Next Next End Sub 参照設定で、Microsoft Scripting Runtimeを参照させてから実行してください。 アクティブシートのA2から、フォルダ名とファイル名・ハイパーリンク付を書き出します。 ただし、サブフォルダ内にフォルダがないことが前提です。

roundtrip
質問者

お礼

ありがとうございます。正にこれです。すごく助かりました。

その他の回答 (2)

  • kmetu
  • ベストアンサー率41% (562/1346)
回答No.2

> どうもそのサイトでは、「サブフォルダ名を取得する」とかは分かっても、「サブフォルダの名前およびその中にあるファイル名を取得する」ことが分かりにくいのです。 サブフォルダ名を取得してそれを変数に入れておき その変数を利用して サブフォルダを指定したDIRを使ってファイル名一覧を取得 をサブフォルダ分ループすればできませんか? 以下のsssの部分をサブフォルダ名を取得した 配列変数にしてループさせてください。 Sub Sample20() Dim buf As String, i As Long Dim sss As String sss = "D:\" buf = Dir(sss & "*.*") Do While buf <> "" i = i + 1 Worksheets("Sheet1").Cells(i, 1) = sss Worksheets("Sheet1").Cells(i, 2) = buf buf = Dir() Loop End Sub

  • kmetu
  • ベストアンサー率41% (562/1346)
回答No.1

Dir関数でサブフォルダを取得する http://officetanaka.net/excel/vba/tips/tips95.htm ファイルの一覧を取得する http://officetanaka.net/excel/vba/file/file07.htm このあたりを参考にしてください。

roundtrip
質問者

お礼

えっと、補足に書いた > VBAを行うExcelファイルは、例で言う「C:\aaa」フォルダにおいて っていう文の「おいて」っていうのは、「保存して」という意味です。

roundtrip
質問者

補足

どうもそのサイトでは、「サブフォルダ名を取得する」とかは分かっても、「サブフォルダの名前およびその中にあるファイル名を取得する」ことが分かりにくいのです。なお、VBAを行うExcelファイルは、例で言う「C:\aaa」フォルダにおいて、フォルダの相対参照を利用したディレクトリ参照にしたいと思っています。

関連するQ&A

  • エクセルVBAハイパーリンクの自動設定について

    はじめて質問させていただきます。 エクセルVBAハイパーリンクの自動設定についてですが A列にAAA、BBB、CCC、DDD・・・という文字列が入っています。 D:\dataというフォルダーにAAA-01、BBB-02、CCC-01、DDD-05 という名前のファイル(.DOC)が入っています。 A列の文字列にハイパーリンクを貼りたいのですがどうしたらよいでしょうか? AAAの文字にAAA-01.docのハイパーリンクを自動で貼る。 -01はファイルのバージョンで更新されたら-02、-03と変わって いくため頭から3文字があえばリンクを貼るようにしたいのです。 よろしくお願いします。

  • 【EXCELマクロ】サブフォルダ内のファイル名一覧

    いつもお世話になります。 マクロ初心者です。 ファイル名の一覧を取得するマクロを、他サイトを参考に作成しました。 構造は以下のようになっておりました。 C:\test\ファイル  ├1234-5678.pdf  ├1234-5679.pdf  ├1234-5680.pdf ・ ・ ・ これについては、下記のコードでファイル名を取得することができました。 Sub ファイル一覧() フォルダ = "C:\test\ファイル" ファイル名 = Dir(フォルダ & "\*.*") 行 = 2 Range("A2:A1000").Clear Do While ファイル名 <> "" Cells(行, 1).Value = Left(ファイル名, 9) 行 = 行 + 1 ファイル名 = Dir() Loop End Sub Sheet1のA列に以下のように表示されます。 1234-5678 1234-5679 1234-5680 ・ ・ ・ ところが今回、ファイルをフォルダで分類することになってしまいました。 以下のような構造です。 C:\test\ファイル  └カテゴリ1   └サブカテゴリ1-1    ├1234-5678.pdf    └1234-5679.pdf  └カテゴリ2   └サブカテゴリ2-1    └1234-5680.pdf   └サブカテゴリ2-2    └1234-5681.pdf ・ ・ ・ 望む結果としては、フォルダ名は表示させず、 上記と同様、A列にファイル名のみを表示したいと思っています。 1234-5678 1234-5679 1234-5680 1234-5681 ・ ・ ・ フォルダ名にワイルドカードを用いればいいかと思うのですが、どうにも上手くいきません。 ※PDFファイルを置く階層は、すべて カテゴリ→サブカテゴリ 以下(2階層)です。 ※ファイル名の文字数はすべて同一です。 どのようにコードを変更すれば上手くいくでしょうか。 アドバイスだけでもいただけると幸いです。 長々とごめんなさい。よろしくお願いいたします。

  • wordのvbaでハイパーリンク設定したい

    wordのvbaに関する質問です。極めて初歩的な質問とは思いますが、仕事の都合上じっくり勉強をしている時間がないのでご容赦ください。 「C:\test」ディレクトリに作ったwordファイルに、下のような表Aを入れます。表Aで「|」マークはwordの縦罫線です。また「aaaa,bbb,ccccc」というのは、完全に出鱈目な名前で、ただの例です。 番号 | ファイル名 1 | aaaa 2 | bbb 3 | ccccc ここで、「C:\test\sub」フォルダに「sub_aaaa.pdf,sub_bbb.pdf,sub_ccccc.pdf」という、表A中のファイル名に「sub_」をつけた名前のPDFがあります。表A中の文字列「aaaa」を「ctrl+クリック」すれば「sub_aaaa.pdf」が開けるように、文字列にハイパーリンクを貼ります。同様に、「bbb」「ccccc」の文字列にも、文字列+subの名前のPDFが開けるようにハイパーリンクを貼っていきます。この手順が一発で出来るように、マクロ化するということはできるでしょうか。ちなみに、表A中の文字列「aaaa」が「abc」に変更されるなどはありえます。そのときはPDFファイル名も、それにしたがって一致するよう変更します。

  • EXCEL VBA 社員毎にファイルを分割したい

    お世話になります。 実績.xlsというブックがあります。 これは社内の各支店の売上実績を個人別に記述したファイルです。 内容は下記のような感じです。 A列=支店名 B列=担当者名 C列=売上金額 このデータが記述しているシートの端にボタンをつけてクリックすると、B列の担当者別にファイルを分割して、データも担当者毎に分けて(A-C列をそのままコピーでいいです)デスクトップにファイルを保存する、ということは出来るのでしょうか? ファイル名もA列+B列の支店名+担当者の名称で保存できれば最高です! どなたかご教授いただけませんでしょうか? 添付図の例ですと6つのファイルが保存されることになります。 環境 Windows7 Excel2013

  • エクセルで指定フォルダ内の増加ファイルの一覧を作る

    いつも大変お世話になっております。 この質問はエクセルで可能かどうかも当方には不明な課題です。 また可能だとしても当方で実行できないような高度な知識が必要ならあっさり諦めるつもりの投稿です。 サーバ上の特定のフォルダ内に不定期で新規のフォルダが作成され、その中にPDFファイルが保存されていきます。 その新規に保存されたPDFファイルのフルパスとファイル名をエクセルシートの最下行に追加していくことはできるのでしょうか? フルパスにはファイル名も入るのでパスだけでもOKです。 具合的な作業としては、エクセルシートのB列に複数の顧客フォルダのフルパスを下方向に記入していきます。 そのフォルダに新規のフォルダ(名称不明)が出来たら別のシートのB列に新規にできたファルダのフルバスとC列にPDFファイルのファイル名を最下行に追加していく。 作業内容はサーバー上のフォルダに顧客別のフォルダがあり、その中に製品名別のフォルダがあります。 新製品が出来たらその顧客別フォルダ内に新製品の品名フォルダーを作成して当該製品に関する品質データをPDFファイルで保存し行くことになっています。 この新製品のPDFファイルをエクセルにリストアップして、リンクを貼る作業を半年に一度やっています。 新規に増えた分を探すのが手間で抜けがあるハズと思っています。 どの顧客フォルダに新製品のフォルダが新規作成され、その中のPDFファイルの名前をVBAで一覧表にすることが出来ればかなり作業が効率化されるのですが。 更には新規顧客からの仕事の場合は顧客別フォルダが増設されることになるのですが、これは数が少ないので先ずは既存の顧客フォルダ内に増加した品名フォルダのパスとその中のPDFファイル名までが抽出出来れば非常に助かります。 当方の理解を超えた要求なので必要な条件が抜けているかもしれませんがご容赦。

  • サブフォルダのファイルごと「送る」ことができる手段ありますか?

    Aというフォルダのサブフォルダで A-A,A-B.A-Cというフォルダがあるとします。 その中には無数のファイルがフォルダ内にそれぞれあるとします。 Aという親フォルダを「送る」して、clipnameというソフトでサブフォルダA-A.A-B.A-Cの中の沢山のファイルの 絶対ファイル名を一気にコピーしたいんですが、 そういう感じで「送る」ができる手段はありますでしょうか? つまり、Aという親フォルダを送るしたら、サブフォルダ内のファイルを全て「送る」するというような挙動をしたいということです

  • エクセルでフォルダとファイルを作りたい

    お世話になります。 エクセル2007で質問です。 下記のような表をエクセルで作り、A列の名称でフォルダを作り、 そのフォルダの中にすべて同じファイル名のテキストファイルを作り、 その内容をB列の文字としたいのですが、マクロなどでの作成方法を教えてくだい。 A列 B列 a1  ああああああ a2  いいいい a5  かかかかか いままで使っていたマクロはテキストのファイル名がすべてバラバラだった ので同じフォルダ内に書き出していましたが、変更があり同じファイル名で内容が 違うデータが必要となってしまいましたので、違う名称のフォルダの中に、 同じ名称のテキストデータを格納したいと思っています。 テキストデータの名称は何でもいいです。 作成するデータの数は決まっていなく、最大で1000くらいあります。 ぜひ、ご教授お願いします。

  • エクセルの関数で画像ファイルを開く

    エクセル97をつかってます 任意の画像「ファイル名「99999999.tif」(99999999は任意)」があり そのファイル名をA列のセルに表示し、B列のハイパーリンク =HYPERLINK("C:\Users\フォルダ名\" & A2 & ".tif) をクリックすると開くようにしております。 ところが 開きたい画像名が「99999999-1.tif」というファイル名が まざっており、この場合”ファイルがありません”となり開くことができません。 (VBAでやれば簡単ですが、エクセル関数でやらなくてはならいので困っております) どちらでも開く関数がくめないでしょうか? 詳しいかた教えて下さい。

  • VBAを使い、同一フォルダにあるファイルの特定のシートの情報を取得したい

    はじめまして。 書籍や過去の質問等を調べましたが、類似するものを見つけられなかったため質問させていただきます。 Xというエクセルファイルで、Xと同一フォルダ内にある、ファイル名に特定の文字列(例えば「月報」)を含んだ全てのエクセルファイルの、特定の文字列(例えば「○年○月」)を含んだ全シートの、一定のセル範囲をひとつのシートにまとめたいと思っています。 X内のコマンドボタンで動かす予定ですが、複数のボタンになると自分では思っています(ボタンAでファイル名の取得、ボタンBでシートの取得、ボタンCでセルに貼り付け、みたいな感じで。ボタンの数は特に制限はないです) 要点としては a, 定定の文字列を含んだファイル名の取得 b, aで取得したファイル内の特定の文字列を含んだ全てのシート内の一定のセル範囲の取得(シートの数はファイルによる。必ずしも1つというわけではない。) c. bで取得した一定のセル範囲のデータを、1つのシートにまとめる。 あとはこれらのデータをtxtやcsvなどに出力できるようにするつもりです。 私がやってできたのは、同一フォルダ内にあるファイル名に特定の文字列を含むファイルの全てのファイル名を指定したセルに吐き出すことしかできませんでした。 なんか、ややこしい表現かもしれませんが、ご指導お願いします。 環境はxp、エクセル2003です。 よろしくお願いします。

  • エクセルマクロによるハイパーリンクの方法

    はじめて投稿します。 エクセルマクロを始めたばかりですが、よろしくお願いします。 Fileフォルダ内にマクロ.xlsとdataフォルダがあり、 dataフォルダ内には複数のPDFファイルがあります。 マクロ.xlsのセルA1~A10に適当な英数字の文字列(例えばA123,B243,C072…など)が書かれていて dataフォルダ内にはセルA1~A10に書かれている文字列に少し文字が追加された名前のPDFファイル (例えばセルの文字列が"A123"なら"A123(OK).pdf")があります。 これをマクロを使ってA1~A10の文字列にハイパーリンクさせて、 セルに書かれている文字列をクリックして開きたいのですがどうすればよいでしょうか? A1~A10に書かれている文字列を変数cellnameに代入し、 PDFファイルをcellnameにワイルドカードを使って変数pdfnameに代入できずにつまずいています…。 どなたかご解答の程宜しくお願いいたします。

専門家に質問してみよう