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

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

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

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

Q&A

解決済

2回答

1859閲覧

VBA 再帰呼び出し

yakumo02

総合スコア103

VBA

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

0グッド

1クリップ

投稿2020/08/31 10:37

編集2020/08/31 10:41

再帰呼び出しで、変数bufが見つかった場合は、配列Sheet、Sheet_pathに格納するコードを書いています。
bufを全て取得したらcallで別のプロシージャを呼び出そうと思っているのですが、再帰の時点ではbufが何個あるのか分からず、いつifでcallを実行できるのかで悩んでいます。

現時点のコード

Sub FileSearch(path) Dim FSO As Object, Folder As Variant, file As Variant, buf As String, this As Worksheet Set FSO = CreateObject("Scripting.FileSystemObject") buf = Dir(path & "*test.xls*") Do While buf <> "" ReDim Preserve Sheet(bb) ReDim Preserve Sheet_path(bb) Sheet(bb) = buf Sheet_path(bb) = path bb = bb + 1 buf = Dir() If Then 'ここで思考中 Call hikaku End End If Loop For Each Folder In FSO.GetFolder(path).SubFolders Call FileSearch(Folder.path) '??A??яo?? Next Folder End Sub

例えばbufが7つあれば、

If bb=8 then call hikaku End End If

とできるのですが、全てのフォルダに7つづつあるとも限りません

どうやって再帰を抜け出そうか思考中です

よろしくお願いします

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

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

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

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

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

guest

回答2

0

ベストアンサー

1回のFileSearchの呼び出しで、対象フォルダ内のファイル抽出を行い、サブフォルダがあれば再度FileSearchを呼び出す。
この仕組みになっていれば再帰を抜け出す条件は不要です。
というわけでコードを見てみるとそのような作りになっているので、悩んでいるところのIf文のところはバッサリなくして大丈夫です。
FileSearchの先頭あたりで、

VBA

1Debug.Print path

と書いておけば、どのファルダが対象になっているかわかるはずなので、ご確認を。
少なくとも私の環境では問題なく実行できました。

投稿2020/09/01 00:18

ttyp03

総合スコア16998

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

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

0

対象のフォルダ(とそのサブフォルダ)の中からbuf相当のファイルを全て抜出し、一番最後にhikakuを1度だけコールしたいと読めますが合っていますか?

それなら、別の関数からFileSearchをコールし、これが終了したら1回hikakuをコールすればよいのではないでしょうか。
Do While でループしていて、ループ終了条件もはっきりしているならループ回数は気にする必要ありません。

vba

1' FileSearchはそのまま。hikakuするコードは削除。 2Sub FileSearch(path) 3 4 Dim FSO As Object, Folder As Variant, file As Variant, buf As String, this As Worksheet 5 Set FSO = CreateObject("Scripting.FileSystemObject") 6 7 buf = Dir(path & "*test.xls*") 8 9 Do While buf <> "" 10 ReDim Preserve Sheet(bb) 11 ReDim Preserve Sheet_path(bb) 12 Sheet(bb) = buf 13 Sheet_path(bb) = path 14 15 bb = bb + 1 16 buf = Dir() 17 Loop 18 19 For Each Folder In FSO.GetFolder(path).SubFolders 20 Call FileSearch(Folder.path) 21 Next Folder 22 23End Sub 24 25' 画面からはこの関数をコールする。 26Sub DoFileSearch(path) 27 call FileSearch(path) 28 call hikaku 29End Sub 30

投稿2020/08/31 14:50

hope_mucci

総合スコア4447

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問