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

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

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

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

Q&A

解決済

2回答

417閲覧

全フォルダの中から特定の名前がついたファイルを見つけ、リストにする上で階層数の制限をしたい

Ta-Jn

総合スコア11

VBA

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

0グッド

0クリップ

投稿2020/10/28 06:29

目的:
全フォルダの中から特定の名前がついたファイルを見つけ、リストにする

下記のコードの中で FirstGetFile = Dir(Path & "" & Target) で検索かけて特定ファイルを探しています。
ただ、今のコードでは無作為に全フォルダを見に行っており処理が結構かかります。
少しでも軽減できるように階層数を指定し、それ以上の階層になると強制的に次のフォルダに
行くようなコードを書きたいです。
その中で、カウント変数を用いて処理をしようと思いましたが、
Call FileSearch() で変数リセットされてしまう点や(Staticも考えましたがいい案が思いつかず)
連続したフォルダ階層数の維持が浮かんでこず詰まっております。

いい案があればご教授お願いします。

Function FileSearch(Path As String, Target As String, SpFileCount As Long) As String Set wsSP = ActiveWorkbook.Worksheets("") Set wsZikkou = ActiveWorkbook.Worksheets("") With wsZikkou Period = .Range("B3").Value End With Set FileObject = CreateObject("Scripting.FileSystemObject") For Each Folder In FileObject.GetFolder(Path).SubFolders Debug.Print Folder    Call FileSearch(Folder.Path, Target, SpFileCount) Next Folder '----検索処理ーーーーーーーーーーーーーーーーーーーー FirstGetFile = Dir(Path & "\" & Target) Do While FirstGetFile <> "" FirstFileCheck = Mid(FirstGetFile, 12, 2) If IsNumeric(FirstFileCheck) Then If FirstFileCheck = Period Then With wsSP SpFileCount = SpFileCount + 1 End With End If End If FirstGetFile = Dir() '次のファイルを検索 Loop

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

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

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

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

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

guest

回答2

0

ベストアンサー

以下のような形になるかと思います。
最初のFileSearchの呼び出しは、deepLevel に1を指定してください。
DeepMaxの値は適切な値をセットしておいてください。

VBA

1Const DeepMax As Long = 5 '追加 2Function FileSearch(ByVal deepLevel As Long, Path As String, Target As String, SpFileCount As Long) As String 3 If deepLevel > DeepMax Then Exit Function '追加 4 Set wsSP = ActiveWorkbook.Worksheets("") 5 Set wsZikkou = ActiveWorkbook.Worksheets("") 6 7 With wsZikkou 8 Period = .Range("B3").Value 9 End With 10 11 Set FileObject = CreateObject("Scripting.FileSystemObject") 12 13 For Each Folder In FileObject.GetFolder(Path).SubFolders 14 Debug.Print Folder 15 Call FileSearch(deepLevel + 1, Folder.Path, Target, SpFileCount) '修正 16 Next Folder 17 18 '----検索処理ーーーーーーーーーーーーーーーーーーーー 19 FirstGetFile = Dir(Path & "\" & Target) 20 Do While FirstGetFile <> "" 21 FirstFileCheck = Mid(FirstGetFile, 12, 2) 22 If IsNumeric(FirstFileCheck) Then 23 If FirstFileCheck = Period Then 24 With wsSP 25 SpFileCount = SpFileCount + 1 26 End With 27 End If 28 End If 29 FirstGetFile = Dir() '次のファイルを検索 30 Loop 31 '以下、不明 32End Function 33

投稿2020/10/28 07:27

tatsu99

総合スコア5438

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

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

Ta-Jn

2020/10/28 07:44

引数でのカウント処理勉強になりました。 コードでの処理の流れをご教授くれたので、ベストアンサー選ばせていただきます。 ありがとうございます。
guest

0

階層数を引数に追加して、呼ばれるたびに加算して、一定数になったら、何もせずに戻る(あるいは、次を呼ばない)とすればよいのでは。

投稿2020/10/28 06:53

kitasue

総合スコア314

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

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

Ta-Jn

2020/10/28 07:40

ありがとうございます。引数を用いてのカウント処理をしたことなかったので 盲点でした(^-^; 勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問