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

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

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

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

Q&A

解決済

2回答

2394閲覧

VBA サブフォルダ内のファイル取得

yakumo02

総合スコア103

VBA

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

0グッド

0クリップ

投稿2020/08/04 05:33

VBAで以下のようなファイル構造でサブフォルダ内のファイルを取得する場合での質問です。

Folder1------エクセルファイル1(Folder1の中)
エクセルファイル2(Folder1の中)
Folder2(Folder1の中)--------エクセルファイル3(Folder2の中)
Folder3(Folder1の中)--------エクセルファイル4(Folder3の中)
Folder4(Folder3の中)------エクセルファイル5(Folder4の中)

Folderの中にエクセルファイルが2つ、Folder2とFolder3が1つづつ
そのFolder2の中にエクセルファイルが1つ、Folder3の中にエクセルファイルが1つ、Folder4が1つ
Folder4の中にエクセルファイルが1つ
という構造です

エクセルファイル1~5を取得する場合、どのような実装をしたらいいのか分かりません。
ループで回すにも、途中でフォルダが2つに分かれたりなど悩みます。
ご教授お願いします。

現在は、For Eachを使ってFolder2とFolder3のパスを取得した段階です

TargetDir = "C:\Users***-***\Documents\Document" Set Folder = Fso.GetFolder(TargetDir) For Each Subf In Folder.SubFolders Subfolder = Subf.Path MsgBox Subfolder Next

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

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

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

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

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

guest

回答2

0

ベストアンサー

フォルダーが固定ではなく、また、階層数も決まっていないとなると再帰呼び出しになりますね。

例えば、下記とか。

サブフォルダを含めてファイル一覧を取得する(Dir関数の再帰呼び出し):Excel VBA|即効テクニック|Excel VBAを学ぶならmoug

FileSystemObjectを使うなら下記の後半にサンプルがあります。

Office TANAKA - Excel VBA Tips[ファイルを検索する]

投稿2020/08/04 05:57

編集2020/08/04 06:02
hatena19

総合スコア34075

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

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

yakumo02

2020/08/05 02:12

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

0

本件は、hatena19さんが紹介されているようにfileSystem使って再帰
というのがオーソドックスなのですが、最近私はDOSのdirコマンド
使っています。割合手軽なので紹介します。

' ' ▼dirコマンドを発行して結果をtxtに格納。  ' ※rootに先頭フォルダを指定する ' Dim root As String: root = "Z:\D\work*.xls*" ' パス+ファイル(*.xls*)指定 ' Dim root As String: root = "Z:\D\work" ' パス指定 Dim wSh As Object: Set wSh = CreateObject("WScript.Shell") Dim wEx As Object: Set wEx = wSh.exec("%ComSpec% /c Dir """ & root & """ /s /b") Dim txt As String: txt = wEx.StdOut.ReadAll Set wEx = Nothing Set wSh = Nothing ' ' ▼1行ごと配列に分解。※ファイル名はフルパスで入っている。 ' Dim fNs As Variant fNs = Split(txt, vbCrLf)

要するにdirコマンドを /s /b オプションつきで発行して行ごとに分解
しているだけです。
・フォルダ/ファイル数が多いと少し時間のかかることがあります。
・dirコマンドのオプション等については、DOSのdirコマンドの使用方法を
調べてください。

投稿2020/08/05 00:32

編集2020/08/05 00:34
h.horikoshi

総合スコア505

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

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

yakumo02

2020/08/05 02:12

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問