【PR】を含みます。

プログラミング

【VBA】フォルダ内のファイル名を簡単に取得する方法(拡張子指定も可能)

VBA フォルダ内のファイル名を簡単に取得する方法(拡張子指定も可能)

VBAを使って、フォルダ内のファイル名を簡単に取得する方法を解説します。

この記事では、複数の拡張子を指定してファイルをフィルタリングする方法も紹介しています。

【コピペOK】フォルダ内のファイル名を取得する関数(get_files)

VBA
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 Function
ErrHandler:
    get_files = Array() ' 空の配列を返す
End Function

get_files関数の使用方法

第一引数のfolderPathにフォルダパスを指定することで、ファイル一覧を配列で取得できます。

第二引数のextensions(拡張子)と第三引数のgetPath(ファイルパスの取得可否)は任意で指定できます。

対象のフォルダにファイルが存在しない場合は、空の配列Array()を返します。

各引数について

  1. folderPath (必須)
    ファイルが格納されているフォルダパスを指定します。

  2. extensions (省略可)
    取得したいファイルの拡張子を指定します。

    複数の拡張子を指定する場合、配列で拡張子を指定します。
    ひとつの拡張子を指定する場合、配列か文字列で拡張子を指定します。
    引数を省略した場合、すべての拡張子が対象となります。

  3. getPath (省略可)
    ファイル一覧をパスで取得するか、ファイル名のみで取得すかを指定することができます。

    パスで取得する場合、Trueを指定します。
    ファイル名のみを取得する場合、Falseを指定します。
    引数を省略した場合、ファイル一覧をパスで取得します。

get_files関数でフォルダ内のファイル名を取得する方法

デスクトップの「test」フォルダに格納してあるファイルの一覧を取得してみます。

「test」フォルダには以下のファイルが格納されています。

  • test.html

  • test.jpg

  • test.txt

  • test.xlsx

testフォルダファイル一覧

【サンプルコード】ファイル名一覧のパスをメッセージボックスに表示する

以下の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

VBA
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 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

VBA
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 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

VBA
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 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

-プログラミング
-, ,