VBA コピペで使える!特定フォルダのファイル一覧を一括取得するコード

この記事は約9分で読めます。

VBA ファイル一覧取得

 

どうもマサヤです!

「特定フォルダのファイル一覧を一括で取得したい!」

「フォルダの場所を指定したら、配下のファイル名を一括で取得してくれるコードがあればなぁ~」

 

そんな、あなたと私のためにコピペで使えるコードを紹介します!

更に、以下のコードも併せて紹介します!

  • サブフォルダ内のファイル名も一括取得するコード
  • 特定形式のファイル名を一括で取得するコード
  • ファイル一覧を配列に格納するコード

結構使うので手間を減らすためにコピペして使えるようにしました。

 

【関連】ファイルやフォルダを階層別で表示させたいよ~というアナタは↓をどうぞ!

【関連】取得や表示でなく、フォルダを作りたい!というアナタは↓をどうぞ!

 

スポンサーリンク

特定フォルダのファイル名を一括取得するコード

 

取得したファイル一覧をセルに出力しています。

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

 

実行結果イメージ【動画】

実行結果は下記の動画のようになります。

VBA ファイル一覧取得

 

サブフォルダ内のファイル名も一括取得するコード

 

サブフォルダ内のファイル一覧も取得してくれるコードを紹介します。

サブフォルダの中に、更にフォルダがあっても全て取得してくれますよ!

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だけを取得したい!」といった場合はこのコードをお使いください。

※使い方※ ↑で紹介したコード内のGetSubFolder関数を、下記コードと差し替えてください。
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を使っています。

 

まとめ

 

あなたが配列を知っているなら「ファイル一覧を配列に格納するコード」がおすすめです!

私もこのコードを良く使っています。

サブフォルダ探査の要否などを状況に応じて使い分けることができます。

 

仕事では色々な理由でブックを分けて保存・格納することが多いですよね。

でも、集計するとなるとデータを一つに統合する場合が多いです)涙

しかも、フォルダ内には関係のないファイルも混じってたりします。

 

そんな時のため今回のコードを作りました。

作業効率もかなり上がりましたよ!

アナタが同じ悩みをお持ちならぜひ使ってみてください!

 

コメント