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

ExcelマクロVBAの実用サンプル、エクセルVBA集と解説
最終更新日: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入門
VBAでは、フォルダのファイル一覧を取得したりファイルの存在確認をする事が出来ます、Dir関数は、指定したパターン(ワイルドカード)やファイル属性と一致するファイルまたはフォルダの名前を表す文字列の値を返します。引数に指定したファイルが存在すると、そのファイル名を返し存在しないと空欄を返します。
ファイル一覧を取得する(Do~LoopとDir関数)|VBA再入門
マクロVBAで他のブック(ファイル)を扱う時、まず問題となるのがファイル名です。ファイル数が常に同じでファイル名も変化しなければ良いのですが… ファイル数もファイル名も決まっていない場合は、まずはファイルの一覧を取得する必要があります。ファイル名を取得するには、Dir関数を使います。
Dir関数の制限について
Dir関数は、VBAでフォルダ・ファイルの存在確認や一覧取得において使われる関数ですが、いくつかの使用上の注意点、制限事項があります。3桁拡張子の指定時の問題 このように指定した場合、xlsxやxlsmも対象となります。3桁の拡張子を指定した場合は、4桁の拡張子も対象となります。



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

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


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

VBA100本ノック 18本目:名前定義の削除|VBA練習問題100(11月6日)
VBA100本ノック 17本目:重複削除(ユニーク化)|VBA練習問題100(11月6日)
VBA100本ノック 16本目:無駄な改行を削除|VBA練習問題100(11月5日)
VBA100本ノック 15本目:シートの並べ替え|VBA練習問題100(11月4日)
VBA100本ノック 14本目:社外秘シート削除|VBA練習問題100(11月3日)
VBA100本ノック 13本目:文字列の部分フォント|VBA練習問題100(11月1日)
VBA100本ノック 12本目:セル結合を解除|VBA練習問題100(10月31日)
VBA100本ノック 11本目:セル結合の警告|VBA練習問題100(10月30日)
VBA100本ノック 10本目:行の削除|VBA練習問題100(10月29日)
VBA100本ノック 9本目:フィルターコピー|VBA練習問題100(10月28日)


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

1.最終行の取得(End,Rows.Count)|VBA入門
2.RangeとCellsの使い方|VBA入門
3.変数宣言のDimとデータ型|VBA入門
4.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
5.マクロって何?VBAって何?|VBA入門
6.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
7.繰り返し処理(For Next)|VBA入門
8.セルに文字を入れるとは(Range,Value)|VBA入門
9.とにかく書いてみよう(Sub,End Sub)|VBA入門
10.マクロはどこに書くの(VBEの起動)|VBA入門




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


記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。



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