もくじ
VBAを使って、フォルダ内のファイル名を簡単に取得する方法を解説します。
この記事では、複数の拡張子を指定してファイルをフィルタリングする方法も紹介しています。
【コピペOK】フォルダ内のファイル名を取得する関数(get_files)
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 Function
ErrHandler:
get_files = Array() ' 空の配列を返す
End Function
get_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
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 str
End Sub
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 Function
ErrHandler:
get_files = Array() ' 空の配列を返す
End Function
【サンプルコード】ファイル名のみを取得してメッセージボックスに表示する
以下のVBAコードを実行することで、指定したフォルダ内のファイル名を簡単に取得できます。
get_files関数の第一引数にフォルダパスを指定、第二引数指定なし、第三引数にFalse
を指定しています。
test.html
test.jpg
test.txt
test.xlsx
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 str
End Sub
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 Function
ErrHandler:
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
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 str
End Sub
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 Function
ErrHandler:
get_files = Array() ' 空の配列を返す
End Function