VBAサンプル集
Dir関数で全サブフォルダの全ファイルを取得

ExcelマクロVBAの実用サンプル、エクセルVBA集と解説
公開日:2013-08-24 最終更新日:2020-07-30

Dir関数で全サブフォルダの全ファイルを取得


指定フォルダ以下の全サブフォルダ内の全ファイルを取得する場合、
通常はFileSystemObjectの再帰モジュールで実現しますが、
これをDir関数だけで、かつ、再帰ではなく二重ループで実現しています。

FileSystemObjectの再帰プロシージャーについては、

こちらをご覧ください。


Dir関数でサブフォルダも含むファイル一覧を取得するVBA

Function GetFileList(ByVal argDir As String) As String()
 Dim i As Long
 Dim aryDir() As String
 Dim aryFile() As String
 Dim strName As String

 ReDim aryDir(i)
 aryDir(i) = argDir '引数のフォルダを配列の先頭に入れる
 
 'まずは、指定フォルダ以下の全サブフォルダを取得し、配列aryDirに入れます。
 i = 0
 Do
  strName = Dir(aryDir(i) & "\", vbDirectory)
  Do While strName <> ""
   If GetAttr(aryDir(i) & "\" & strName) And vbDirectory Then
    If strName <> "." And strName <> ".." Then
     ReDim Preserve aryDir(UBound(aryDir) + 1)
     aryDir(UBound(aryDir)) = aryDir(i) & "\" & strName
    End If
   End If
   strName = Dir()
  Loop
  i = i + 1
  If i > UBound(aryDir) Then Exit Do
 Loop
 
 '配列aryDirの全フォルダについて、ファイルを取得し、配列aryFileに入れます。
 ReDim aryFile(0)
 For i = 0 To UBound(aryDir)
  strName = Dir(aryDir(i) & "\", vbNormal + vbHidden + vbReadOnly + vbSystem)
  Do While strName <> ""
   If aryFile(0) <> "" Then
    ReDim Preserve aryFile(UBound(aryFile) + 1)
   End If
   aryFile(UBound(aryFile)) = aryDir(i) & "\" & strName
   '実行結果が分かりやすいように、テスト的にセルに書き出す場合
   'Cells(UBound(aryFile) + 1, 1) = aryFile(UBound(aryFile))
   strName = Dir()
  Loop
 Next
 
 GetFileList = aryFile
End Function


ファイル一覧を取得するVBAの使用例と解説

Sub sample()
  Dim v As Variant
  v = GetFileList("指定フォルダ")
End Sub

先のVBA関数では、引数のフォルダ以下にある、全サブフォルダが、配列aryDirに入ります。
aryDir(0)には、最初の指定フォルダを入れています。
これは、その後の処理を書きやすくする為と、指定フォルダ直下のファイルも一緒に取得する為に入れています。

全サブフォルダが、配列aryDirに入ッた後は、配列aryDirに入っているフォルダを一つずつ処理し、全ファイルを、配列aryFileに取得しています。

vbNormal + vbHidden + vbReadOnly + vbSystem
この指定は、通常のファイルだけが対象なら、指定の必要はありません。

この例では、フォルダもファイルも、無条件に配列に入れているだけですが、
実務としては、それぞれの何らかの条件を指定して取得する等の処理になる場合が多いかもしれません。

配列aryFileにフルパスのファイル名が入っていますので、その後の処理は書き易いはずです。

しかし、やはりFileSystemObjectの再帰モジュールに比べると、かなり無理やり感は否めません。
それでも、FileSystemObjectを何らかの理由で使いたくない場合には、参考になると思います。
また、配列の使い方とロジックの組み立てについて、参考にしてもらえればと思います。

Dir関数の関連記事

以下の記事も参考にしてください。
第79回.ファイル操作Ⅰ(Dir)|VBA入門
・Dir関数 ・Dir関数の使用例 ・Dir関数の実践例 ・Dir関数の制限について ・Dir関数の関連記事
ファイル一覧を取得する(Do~LoopとDir関数)|VBA再入門
・Dir関数 ・Dir関数の使い方 ・ファイルの一覧を取得するマクロVBAコード ・Do~Loopステートメント ・ExcelマクロVBA入門等の対応ページ
Dir関数の制限について
・3桁拡張子の指定時の問題 ・256バイトを超えるパス名が扱えない ・UNICODEファイル名が扱えない ・特殊なネットワークドライブでエラー ・Dir関数の制限の最後に



同じテーマ「マクロVBAサンプル集」の記事

1次元配列の並べ替え(バブルソート,挿入ソート,クイックソート)
2次元配列の並べ替え(バブルソート,クイックソート)
Dir関数で全サブフォルダの全ファイルを取得
順列の全組み合わせ作成と応用方法
スピルに対応したXSPLITユーザー定義関数(文字区切り)
ヒープソートのサンプルVBA:1次元/2次元配列対応版


新着記事NEW ・・・新着記事一覧を見る

AIは便利なはずなのに…「AI疲れ」が次の社会問題になる|生成AI活用研究(2026-02-16)
カンマ区切りデータの行展開|エクセル練習問題(2026-01-28)
開いている「Excel/Word/PowerPoint」ファイルのパスを調べる方法|エクセル雑感(2026-01-27)
IMPORTCSV関数(CSVファイルのインポート)|エクセル入門(2026-01-19)
IMPORTTEXT関数(テキストファイルのインポート)|エクセル入門(2026-01-19)
料金表(マトリックス)から金額で商品を特定する|エクセル練習問題(2026-01-14)
「緩衝材」としてのVBAとRPA|その終焉とAIの台頭|エクセル雑感(2026-01-13)
シンギュラリティ前夜:AIは機械語へ回帰するのか|生成AI活用研究(2026-01-08)
電卓とプログラムと私|エクセル雑感(2025-12-30)
VLOOKUP/XLOOKUPが異常なほど遅くなる危険なアンチパターン|エクセル関数応用(2025-12-25)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.日本の祝日一覧|Excelリファレンス
3.変数宣言のDimとデータ型|VBA入門
4.FILTER関数(範囲をフィルター処理)|エクセル入門
5.RangeとCellsの使い方|VBA入門
6.繰り返し処理(For Next)|VBA入門
7.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
8.マクロとは?VBAとは?VBAでできること|VBA入門
9.セルのクリア(Clear,ClearContents)|VBA入門
10.メッセージボックス(MsgBox関数)|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。
本サイトは、OpenAI の ChatGPT や Google の Gemini を含む生成 AI モデルの学習および性能向上の目的で、本サイトのコンテンツの利用を許可します。
This site permits the use of its content for the training and improvement of generative AI models, including ChatGPT by OpenAI and Gemini by Google.



このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ