どうもマサヤです!
「特定フォルダのファイル一覧を一括で取得したい!」
「フォルダの場所を指定したら、配下のファイル名を一括で取得してくれるコードがあればなぁ~」
そんな、あなたと私のためにコピペで使えるコードを紹介します!
更に、以下のコードも併せて紹介します!
結構使うので手間を減らすためにコピペして使えるようにしました。
【関連】ファイルやフォルダを階層別で表示させたいよ~というアナタは↓をどうぞ!
【関連】取得や表示でなく、フォルダを作りたい!というアナタは↓をどうぞ!
特定フォルダのファイル名を一括取得するコード
取得したファイル一覧をセルに出力しています。
Sub GetFolderList() Dim fso As Object Dim find_path As String Dim cf As Variant Dim i As Long find_path = "C:\Users\Sample" '←取得したいフォルダパスを指定する Set fso = CreateObject("Scripting.FileSystemObject") Set cf = fso.getfolder(find_path) i = 1 For Each f In cf.Files Cells(i, 1) = f.Path Cells(i, 2) = f.Name i = i + 1 Next End Sub
実行結果イメージ【動画】
実行結果は下記の動画のようになります。
サブフォルダ内のファイル名も一括取得するコード
サブフォルダ内のファイル一覧も取得してくれるコードを紹介します。
サブフォルダの中に、更にフォルダがあっても全て取得してくれますよ!
Sub GetFolderList() Dim fso As Object Dim find_path As String Dim cf As Variant find_path = "C:\Users\Sample" '←取得したいフォルダパスを指定する Set fso = CreateObject("Scripting.FileSystemObject") Set cf = fso.GetFolder(find_path) Call GetSubFolder(cf, 1) End Sub '=============================================================================== ' フォルダ単位で全探査 '=============================================================================== Sub GetSubFolder(cf, my_row) For Each f In cf.SubFolders Call GetSubFolder(f, my_row) '再帰呼出 Next For Each f In cf.Files Cells(my_row, 1) = f.Path Cells(my_row, 2) = f.Name my_row = my_row + 1 Next End Sub
ファイル形式を指定してファイル名を一括取得するコード
取得したいファイル拡張子を指定できます。
「xlsxだけを取得したい!」といった場合はこのコードをお使いください。
Sub GetSubFolder(cf, my_row) For Each f In cf.SubFolders Call GetSubFolder(f, my_row) '再帰呼出 Next For Each f In cf.Files If LCase(Mid(f.Name, InStrRev(f.Name, ".") + 1)) = "xlsm" Then '←拡張子を指定 Cells(my_row, 1) = f.Path Cells(my_row, 2) = f.Name my_row = my_row + 1 End If Next End Sub
おすすめ! ファイル一覧を配列に格納するコード
ファイル一覧を配列に格納するコードです。
関数にしているので、1行でファイル一覧を取得できます。
Public get_folders(1000, 1) As Variant Sub GetFolderList(find_path, Optional find_sub = 0, Optional file_type = "") Dim fso As Object Dim cf As Variant Set fso = CreateObject("Scripting.FileSystemObject") Set cf = fso.GetFolder(find_path) Call GetSubFolder(cf, 0, find_sub, file_type) Set fso = Nothing End Sub '=============================================================================== ' フォルダ単位で全探査 '=============================================================================== Sub GetSubFolder(cf, cnt, Optional find_sub = 0, Optional file_type = "") If find_sub = 1 Then 'サブフォルダのファイル取得有無 For Each f In cf.SubFolders Call GetSubFolder(f, cnt, find_sub, file_type) '再帰呼出 Next End If For Each f In cf.Files If file_type <> "" Then If LCase(Mid(f.Name, InStrRev(f.Name, ".") + 1)) = file_type Then '拡張子指定判定 get_folders(cnt, 0) = f.Path get_folders(cnt, 1) = f.Name cnt = cnt + 1 End If Else get_folders(cnt, 0) = f.Path get_folders(cnt, 1) = f.Name cnt = cnt + 1 End If Next End Sub
独自関数GetFolderListの説明
引数によって、サブフォルダ探索要否や拡張子指定有無を選択することができます。
◆定義◆
GetFolderList(①フォルダのパス, ②[サブフォルダ探査有無], ③[拡張子有無])
①:ファイル一覧を取得したいパスを指定。
②:省略可能。サブフォルダ内も取得するか指定。取得する場合は1、省略時はサブフォルダ探査無。
③:省略可能。拡張子を指定する場合は文字列で指定。省略時は全ファイル取得。
具体的な使い方
1行でファイル一覧を取得できます。
下記にのように呼出方法を複数あります。
'フォルダ内のファイル一覧を取得 Call GetFolderList("C:\Users\Sample") 'サブフォルダを含めたファイル一覧を取得 Call GetFolderList("C:\Users\Sample", 1) 'フォルダ内のxlsx形式のファイル一覧を取得 Call GetFolderList("C:\Users\Sample", , "xlsx") 'サブフォルダ含めたのxlsx形式のファイル一覧を取得 Call GetFolderList("C:\Users\Sample", 1, "xlsx")
ファイル一覧はget_foldersに格納されています。
For文などでファイル名を抽出してお使いください。
Dir関数ではなく、FileSystemObjectを使ってます
Dir関数でもファイル一覧を取得できますが、紹介するコードはFileSystemObjectを使っています。
理由はDir関数には文字数制限(256バイト)があるからです。
例えば、会社のネットワークフォルダのファイル一覧を取得する場合、フォルダパスの長さによってはDir関数の文字数を超えてしまい、正しいファイル一覧が取得できません。
また、特定ネットワーク名(パスに .【ドット】 含まれている)によるエラーなどもあります。
これらの問題を回避するため、FileSystemObjectを使っています。
まとめ
あなたが配列を知っているなら「ファイル一覧を配列に格納するコード」がおすすめです!
私もこのコードを良く使っています。
サブフォルダ探査の要否などを状況に応じて使い分けることができます。
仕事では色々な理由でブックを分けて保存・格納することが多いですよね。
でも、集計するとなるとデータを一つに統合する場合が多いです)涙
しかも、フォルダ内には関係のないファイルも混じってたりします。
そんな時のため今回のコードを作りました。
作業効率もかなり上がりましたよ!
アナタが同じ悩みをお持ちならぜひ使ってみてください!
コメント