もくじ
VBAでフォルダ内のファイル一覧を自動取得したいと考えたことはありませんか?
手作業でファイル名を確認する手間を省き、業務効率を大幅にアップできる便利な方法を、サンプルコード付きで解説します。
拡張子によるフィルタリングや、ファイル名・パスの取得方法もあわせてご紹介します。
【コピペOK】フォルダ内のファイル一覧を取得するget_files関数
Copyをクリックするとコピーできます。
Public Function get_files(ByVal folderPath As String, Optional ByVal extensions As Variant = Empty, Optional ByVal getPath As Boolean = True) As Variant On Error GoTo ErrHandler ' エラー処理開始 ' FileSystemObjectを作成 Dim fso As Object Set fso = CreateObject("Scripting.FileSystemObject") ' フォルダを取得 Dim folder As Object Set folder = fso.GetFolder(folderPath) ' 拡張子リスト作成 Dim extensionList() As Variant If IsEmpty(extensions) Then ReDim extensionList(0 To 0) extensionList(0) = "*" Else If IsArray(extensions) Then extensionList = extensions ElseIf Not extensions = False Then ReDim extensionList(0 To 0) extensionList(0) = extensions End If End If ' ファイルのリスト取得 Dim ext As Variant Dim file As Object Dim filesList() As String Dim i As Long i = 0 For Each file In folder.Files For Each ext In extensionList If ext = "*" Or LCase(file.Name) Like "*." & LCase(ext) Then ReDim Preserve filesList(i) If getPath Then filesList(i) = file.Path ' ファイルパスを取得 Else filesList(i) = file.Name ' ファイル名を取得 End If i = i + 1 Exit For ' 一致したら次のファイルへ End If Next ext Next file ' オブジェクト解放 Set fso = Nothing Set folder = Nothing Set file = Nothing ' 結果を返す If i = 0 Then get_files = Array() ' 空の配列を返す Else get_files = filesList End If Exit FunctionErrHandler: get_files = Array() ' 空の配列を返すEnd Functionget_files関数の使用方法
第一引数のfolderPathにフォルダパスを指定することで、ファイル一覧を配列で取得できます。
第二引数のextensions(拡張子)と第三引数のgetPath(ファイルパスの取得可否)は任意で指定できます。
対象のフォルダにファイルが存在しない場合は、空の配列Array()を返します。
各引数について
folderPath (必須)
ファイルが格納されているフォルダパスを指定します。extensions (省略可)
取得したいファイルの拡張子を指定します。
複数の拡張子を指定する場合、配列で拡張子を指定します。
ひとつの拡張子を指定する場合、配列か文字列で拡張子を指定します。
引数を省略した場合、すべての拡張子が対象となります。getPath (省略可)
ファイル一覧をパスで取得するか、ファイル名のみで取得するかを指定することができます。
パスで取得する場合、Trueを指定します。
ファイル名のみを取得する場合、Falseを指定します。
引数を省略した場合、ファイル一覧をパスで取得します。
【サンプル】get_files関数でフォルダ内のファイル名を取得する
デスクトップの「test」フォルダに格納してあるファイルの一覧を取得してみます。
「test」フォルダには以下のファイルが格納されています。
test.html
test.jpg
test.txt
test.xlsx

【サンプルコード】ファイル名一覧のパスを取得する
以下のVBAコードを実行することで、指定したフォルダ内のファイルパスを一括で取得できます。
この例では、get_files関数にフォルダパスのみを指定し、すべての拡張子のファイルを取得しています。
C:\Users\test\Desktop\test\test.html
C:\Users\test\Desktop\test\test.jpg
C:\Users\test\Desktop\test\test.txt
C:\Users\test\Desktop\test\test.xlsx
Copyをクリックするとコピーできます。
Sub sample() 'フォルダパス Dim folderPath As String folderPath = "C:\Users\test\Desktop\test" 'ファイル一覧を配列で取得 Dim fileList As Variant fileList = get_files(folderPath) ' ファイルが見つからなかった場合の処理 If Not IsArray(fileList) Or UBound(fileList) < 0 Then MsgBox "ファイルが見つかりませんでした", vbExclamation Exit Sub End If '配列で取得したファイル一覧を文字列に変換 Dim str As String Dim file As Variant For Each file In fileList str = str & file & vbCrLf Next file 'ファイル一覧をメッセージボックスに表示 MsgBox strEnd SubPublic Function get_files(ByVal folderPath As String, Optional ByVal extensions As Variant = Empty, Optional ByVal getPath As Boolean = True) As Variant On Error GoTo ErrHandler ' エラー処理開始 ' FileSystemObjectを作成 Dim fso As Object Set fso = CreateObject("Scripting.FileSystemObject") ' フォルダを取得 Dim folder As Object Set folder = fso.GetFolder(folderPath) ' 拡張子リスト作成 Dim extensionList() As Variant If IsEmpty(extensions) Then ReDim extensionList(0 To 0) extensionList(0) = "*" Else If IsArray(extensions) Then extensionList = extensions ElseIf Not extensions = False Then ReDim extensionList(0 To 0) extensionList(0) = extensions End If End If ' ファイルのリスト取得 Dim ext As Variant Dim file As Object Dim filesList() As String Dim i As Long i = 0 For Each file In folder.Files For Each ext In extensionList If ext = "*" Or LCase(file.Name) Like "*." & LCase(ext) Then ReDim Preserve filesList(i) If getPath Then filesList(i) = file.Path ' ファイルパスを取得 Else filesList(i) = file.Name ' ファイル名を取得 End If i = i + 1 Exit For ' 一致したら次のファイルへ End If Next ext Next file ' オブジェクト解放 Set fso = Nothing Set folder = Nothing Set file = Nothing ' 結果を返す If i = 0 Then get_files = Array() ' 空の配列を返す Else get_files = filesList End If Exit FunctionErrHandler: get_files = Array() ' 空の配列を返すEnd Function【サンプルコード】ファイル名のみを取得する
以下のVBAコードを実行することで、指定したフォルダ内のファイル名を簡単に取得できます。
get_files関数の第一引数にフォルダパスを指定、第二引数指定なし、第三引数にFalseを指定しています。
test.html
test.jpg
test.txt
test.xlsx
Copyをクリックするとコピーできます。
Sub sample() 'フォルダパス Dim folderPath As String folderPath = "C:\Users\test\Desktop\test" 'ファイル一覧を配列で取得 Dim fileList As Variant fileList = get_files(folderPath, , False) ' ファイルが見つからなかった場合の処理 If Not IsArray(fileList) Or UBound(fileList) < 0 Then MsgBox "ファイルが見つかりませんでした", vbExclamation Exit Sub End If '配列で取得したファイル一覧を文字列に変換 Dim str As String Dim file As Variant For Each file In fileList str = str & file & vbCrLf Next file 'ファイル一覧をメッセージボックスに表示 MsgBox strEnd SubPublic Function get_files(ByVal folderPath As String, Optional ByVal extensions As Variant = Empty, Optional ByVal getPath As Boolean = True) As Variant On Error GoTo ErrHandler ' エラー処理開始 ' FileSystemObjectを作成 Dim fso As Object Set fso = CreateObject("Scripting.FileSystemObject") ' フォルダを取得 Dim folder As Object Set folder = fso.GetFolder(folderPath) ' 拡張子リスト作成 Dim extensionList() As Variant If IsEmpty(extensions) Then ReDim extensionList(0 To 0) extensionList(0) = "*" Else If IsArray(extensions) Then extensionList = extensions ElseIf Not extensions = False Then ReDim extensionList(0 To 0) extensionList(0) = extensions End If End If ' ファイルのリスト取得 Dim ext As Variant Dim file As Object Dim filesList() As String Dim i As Long i = 0 For Each file In folder.Files For Each ext In extensionList If ext = "*" Or LCase(file.Name) Like "*." & LCase(ext) Then ReDim Preserve filesList(i) If getPath Then filesList(i) = file.Path ' ファイルパスを取得 Else filesList(i) = file.Name ' ファイル名を取得 End If i = i + 1 Exit For ' 一致したら次のファイルへ End If Next ext Next file ' オブジェクト解放 Set fso = Nothing Set folder = Nothing Set file = Nothing ' 結果を返す If i = 0 Then get_files = Array() ' 空の配列を返す Else get_files = filesList End If Exit FunctionErrHandler: get_files = Array() ' 空の配列を返すEnd Function【サンプルコード】拡張子でフィルタリングしファイル名を取得する
以下のVBAコードを実行することで、指定した特定の拡張子を持つファイル名を一度に取得できます。
たとえば、プロジェクトのフォルダ内にあるすべての画像ファイルやHTMLファイルを取得する場合に非常に便利です。
get_files関数の第一引数にフォルダパスを指定、第二引数に複数の拡張子(html、jpg)を配列で指定しています。
C:\Users\test\Desktop\test\test.html
C:\Users\test\Desktop\test\test.jpg
Copyをクリックするとコピーできます。
Sub sample() 'フォルダパス Dim folderPath As String folderPath = "C:\Users\test\Desktop\test" '拡張子リスト Dim extensionList As Variant extensionList = Array("html", "jpg") 'ファイル一覧を配列で取得 Dim fileList As Variant fileList = get_files(folderPath, extensionList) ' ファイルが見つからなかった場合の処理 If Not IsArray(fileList) Or UBound(fileList) < 0 Then MsgBox "ファイルが見つかりませんでした", vbExclamation Exit Sub End If '配列で取得したファイル一覧を文字列に変換 Dim str As String Dim file As Variant For Each file In fileList str = str & file & vbCrLf Next file 'ファイル一覧をメッセージボックスに表示 MsgBox strEnd SubPublic Function get_files(ByVal folderPath As String, Optional ByVal extensions As Variant = Empty, Optional ByVal getPath As Boolean = True) As Variant On Error GoTo ErrHandler ' エラー処理開始 ' FileSystemObjectを作成 Dim fso As Object Set fso = CreateObject("Scripting.FileSystemObject") ' フォルダを取得 Dim folder As Object Set folder = fso.GetFolder(folderPath) ' 拡張子リスト作成 Dim extensionList() As Variant If IsEmpty(extensions) Then ReDim extensionList(0 To 0) extensionList(0) = "*" Else If IsArray(extensions) Then extensionList = extensions ElseIf Not extensions = False Then ReDim extensionList(0 To 0) extensionList(0) = extensions End If End If ' ファイルのリスト取得 Dim ext As Variant Dim file As Object Dim filesList() As String Dim i As Long i = 0 For Each file In folder.Files For Each ext In extensionList If ext = "*" Or LCase(file.Name) Like "*." & LCase(ext) Then ReDim Preserve filesList(i) If getPath Then filesList(i) = file.Path ' ファイルパスを取得 Else filesList(i) = file.Name ' ファイル名を取得 End If i = i + 1 Exit For ' 一致したら次のファイルへ End If Next ext Next file ' オブジェクト解放 Set fso = Nothing Set folder = Nothing Set file = Nothing ' 結果を返す If i = 0 Then get_files = Array() ' 空の配列を返す Else get_files = filesList End If Exit FunctionErrHandler: get_files = Array() ' 空の配列を返すEnd Functionまとめ
今回ご紹介したVBAコードを使えば、フォルダ内のファイル一覧を簡単に取得できます。
拡張子の指定やファイル名・パスの取得方法も柔軟に対応できるので、さまざまな業務で活用できるはずです。
ぜひご自身の作業に合わせてアレンジしてみてください。
