Access2000VBA・Excel2000VBA独学~フォルダの中に含まれる全てのファイルを(全てのサブフォルダの中も全部)再帰的に順に編集するサンプルプログラム~
  
※まだ書きかけです。すみません。
※間違ってたらすみません。
※メモ書きなので、自分でも意味不明な箇所も多いです。ごめんなさい。
  

  
※関連記事
すべてのファイルを再帰的に順に編集
すべてのファイルのモジュールの内容を一括書き出し
すべてのファイルとフォルダの基本情報の吸い込み
処理速度がOpenメソッド利用時の2倍?すべてのExcelファイルのすべてのシート名をファイルを開かずにゲット

  
※2022/12/06 追記

★かなり重要な注意事項
後述の「Dir」を使う場合に関しては、
「Dir関数は認識できない文字(文字コード?)があるらしく、また、最悪なことに、プログラムの書き方によっては、”エラーが出てほしいところで出ない”」
という機能不足や不都合があるようです。
システムとしては致命的になってしまうので、基本的には「使わないほうが無難」なようです。

どうしても使いたいなら
『「確実にパソコン内」だけで付けたファイル名しか「絶対に・100%」ありえない 』、
という前提の場合しか役に立たないようです。

また、Dir関数を使うほうが速度は4、5倍は速いようですが、一部のファイル名を認識できずにエラーになるようでは、全てのファイルやフォルダを拾えません。「4、5倍は速い」なんてものは何の意味もない、ということになります。

そのあたりについて詳しく書いてあるWebサイトをご紹介します。
mhtmlなどで保存しておくことをおすすめします。
VBAでファイルリストを高速に取得する関数を自作する part1
VBAでファイルリストを高速に取得する関数を自作する part2
VBAでファイルリストを高速に取得する関数を自作する part3
VBAでファイルリストを高速に取得する関数を自作する part4

↑「ファイル・フォルダリストをゲットするだけ」というシーンでしか使えないかもしれませんが、Dir関数を使うよりも何倍も速いプログラムコードも紹介されています。
もちろん、文字コードの問題もありません。
ほんと、mhtmlなどで保存しておくことをおすすめします。
  

★ 参考サイト

[VBA]サブフォルダ含むファイル一覧を再帰的に取得する
サブフォルダを含めてファイル一覧を取得する(Dir関数の再帰呼び出し)
  
  

★ 重要な注意01

今回のような「すべてのサブフォルダのファイルに全部処理をする」みたいな処理をしたい場合方法は以下の(A)か(B)の2つの方法があります。

(A)「Dir()」を併用する方法
現在のディレクトリのファイル名の一覧取得や書き出し→Dir()を使ったループ
サブフォルダの全階層を覗きに行く→FSOを使ったループ

(B)「全部FSO」を使う方法   ※FSO=FileSystemObject=MSScriptingRuntime
現在のディレクトリのファイル名の一覧取得や書き出し→FSOを使ったループ
サブフォルダの全階層を覗きに行く→FSOを使ったループ

で、このとき、

(A)のDir()を併用する場合は、「さらにDir()で他のフォルダの存在チェックをしながら一覧ループでもDir()を使う」とエラーになったり、変な動きになったりします。
Dir()のループの途中に、その中でまたDir()してしまうと、その時点でそれまでのDir()の内容が書き換わってしまい、挙動がおかしくなるようです。

なので、
「すべてのサブフォルダをループする」中で、さらに、
「他のフォルダやファイルの存在チェックの分岐等々を入れたい」というときは・・・、

(01)Dir()を使わない。
(02)現在の階層のファイル一覧の書き出しも、他のフォルダやファイルの各種チェックも、再帰的ループも、「全部、FSOでやる」。
(03)もしDir()を使いたいなら、FSOのファイル名取得の再帰的ループの中で、「他の特定のファイルやフォルダの存在チェック」「だけ」に使う。

・・・としたほうが、エラーが出なくて無難かと思います。

Dir()を併用する方法でもエラーが出ないやり方があるかもしれませんが、もちろん、「全部FSOでやってしまう」のもラクだと思います。

逆に、

『 単純にファイル名を(サブフォルダも全部)一覧書き出ししたい場合 』、や、
『 さらに、他のフォルダやファイルの存在チェック等々を「全くしないで」、全サブフォルダへの再帰的ループをかけたい場合 』、等々は、

Dir()+FSOでOKです。

そういう形で、「サブフォルダのすべてのファイルのデータを何の条件も無しに1つのファイルにまとめたい」というようなときは、Dir()を併用しても一応はOKかと思います。

でも、将来的に『 さらに、他のフォルダやファイルの存在チェック等々を「する!」』ことを想定するなら、最初から全部、FSOでやってしまうほうがラクだと思います。

「サブフォルダのすべてのファイルのデータを1つのファイルにまとめたいけど、特定のファイル名のファイルは除外したい」とか、
「サブフォルダのすべてのファイルのデータを1つのファイルにまとめたいけど、処理済みのファイルを、指定の目的のフォルダが無かったらそれを作成し、そこへ入れたい」・・・、
などのケースが、将来的に想定される場合は、最初から全部、FSOだけを使ったほうが無難です。

  
  
★ 重要な注意02

この再帰的ループは、どちらかというと、「サブフォルダを全階層覗きに行くループ」中心に動くイメージです。
「現在のディレクトリのすべてのファイルを取得するループ」よりも。

なので、
「サブフォルダを全階層覗きに行くループ」のブロックの「前」の位置で、
「現在のディレクトリのすべてのファイルを取得するループ」を書くと、
ルートの全ファイルの取得→徐々に深い階層のフォルダ・ファイルの取得・・・と昇順なイメージで動きます。

逆に、
「サブフォルダを全階層覗きに行くループ」のブロックの「後ろ」の位置で、
「現在のディレクトリのすべてのファイルを取得するループ」を書くと、
最初のサブフォルダのもっとも深い階層のフォルダ・ファイルの取得→徐々にサブフォルダをさかのぼりつつファイル名を取得
→最後にルートの全ファイルの取得・・・と降順?なイメージで動きます。

これは、(B)の全部FSOでやる場合でも、(A)のDir()を併用する場合でも、どちらの場合でも同じです。

  
  
★ 一部にDir()を併用した、「サブフォルダも全部」、の、ファイル名の一覧書き出しの例((A)の「Dir()」を併用する方法)

※実行時バインディングをするので、「Microsoft Scripting Runtime」に参照設定は不要です。

  

★ 全部「FSO」を使った、「サブフォルダも全部」、の、ファイル名の一覧書き出しの例((B)「全部FSO」を使う方法)

※事前バインディングをするので、事前に、VBEの画面で「ツール→参照設定」にて、「Microsoft Scripting Runtime」に参照設定することが必要です。

  
  

★ なぜ、「一覧を書き出すループ」と「サブフォルダを覗きに行くループ」を順序を入れ替えると「さかのぼり」によって、降順のようなイメージでの書き出しになるのか?を少し考えるためのテストコード