プログラミング

【PR】を含みます。

【VBA】フォルダ内のファイル名(ファイル一覧)を取得する方法

VBA ファイル名を取得する方法

VBAでフォルダ内ファイル名(ファイル一覧)を配列で取得する方法を紹介します。

拡張子を指定してファイル一覧を取得することも可能です。

VBAツール開発で時々使用するため、コピペで使用できるように関数にまとめました。

【実装コード】ファイル名(ファイル一覧)を取得する関数

VBA
Copy
  1. Public Function get_files(ByVal folderPath As String, Optional ByVal extensions As Variant = Empty, Optional ByVal getPath As Boolean = True) As Variant
  2.     ' FileSystemObjectを作成
  3.     Dim fso As Object
  4.     Set fso = CreateObject("Scripting.FileSystemObject")
  5.     ' 指定したディレクトリのフォルダを取得
  6.     Dim folder As Object
  7.     Set folder = fso.GetFolder(folderPath)
  8.     'ファイルが存在しない場合、処理を終了
  9.     If folder Is Nothing Then
  10.         get_files = False
  11.         Exit Function
  12.     End If
  13.     ' 拡張子リスト作成
  14.     Dim extensionList() As Variant
  15.     If IsEmpty(extensions) Then
  16.         ReDim extensionList(0 To 0)
  17.         extensionList(0) = "*"
  18.     Else
  19.         If IsArray(extensions) Then
  20.             extensionList = extensions
  21.         ElseIf Not extensions = False Then
  22.             ReDim extensionList(0 To 0)
  23.             extensionList(0) = extensions
  24.         End If
  25.     End If
  26.     ' ファイルのリスト取得
  27.     Dim ext As Variant
  28.     Dim file As Object
  29.     Dim filesList() As String
  30.     Dim i As Long
  31.     i = 0
  32.     For Each ext In extensionList
  33.         For Each file In folder.Files
  34.             If file.Name Like "*." & ext Then
  35.                 ReDim Preserve filesList(i)
  36.                 If getPath Then
  37.                     ' ファイルパスを取得
  38.                     filesList(i) = file.Path
  39.                 Else
  40.                     ' ファイル名を取得
  41.                     filesList(i) = file.Name
  42.                 End If
  43.                 i = i + 1
  44.             End If
  45.         Next file
  46.     Next ext
  47.     ' オブジェクトを解放
  48.     Set fso = Nothing
  49.     Set folder = Nothing
  50.     Set file = Nothing
  51.     'ファイルが1つも見つからない場合、Falseを返す
  52.     If i = 0 Then
  53.         get_files = False
  54.     Else
  55.         get_files = filesList
  56.     End If
  57. End Function

get_files(folderPath, extensions, getPath)関数の使用方法

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

第二引数のextensionsと第三引数のgetPathは必要に応じて指定します。

対象のフォルダにファイルが存在しない場合、Falseを返します。

各引数について

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

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

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

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

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

get_files()関数の使用例

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

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

  • test.html

  • test.jpg

  • test.txt

  • test.xlsx

testフォルダファイル一覧

ファイル一覧のパスをメッセージボックスに表示

以下のコードを実行すると、ファイルパスを取得することができます。

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
  1. Sub sample()
  2.     'フォルダパス
  3.     Dim folderPath As String
  4.     folderPath = "C:\Users\test\Desktop\test"
  5.     'ファイル一覧を配列で取得
  6.     Dim fileList As Variant
  7.     fileList = get_files(folderPath)
  8.     '配列で取得したファイル一覧を文字列に変換
  9.     Dim str As String
  10.     Dim file As Variant
  11.     For Each file In fileList
  12.        str = str & file & Chr(13)
  13.     Next file
  14.     'ファイル一覧をメッセージボックスに表示
  15.     MsgBox str
  16. End Sub
  17. Public Function get_files(ByVal folderPath As String, Optional ByVal extensions As Variant = Empty, Optional ByVal getPath As Boolean = True) As Variant
  18.     ' FileSystemObjectを作成
  19.     Dim fso As Object
  20.     Set fso = CreateObject("Scripting.FileSystemObject")
  21.     ' 指定したディレクトリのフォルダを取得
  22.     Dim folder As Object
  23.     Set folder = fso.GetFolder(folderPath)
  24.     'ファイルが存在しない場合、処理を終了
  25.     If folder Is Nothing Then
  26.         get_files = False
  27.         Exit Function
  28.     End If
  29.     ' 拡張子リスト作成
  30.     Dim extensionList() As Variant
  31.     If IsEmpty(extensions) Then
  32.         ReDim extensionList(0 To 0)
  33.         extensionList(0) = "*"
  34.     Else
  35.         If IsArray(extensions) Then
  36.             extensionList = extensions
  37.         ElseIf Not extensions = False Then
  38.             ReDim extensionList(0 To 0)
  39.             extensionList(0) = extensions
  40.         End If
  41.     End If
  42.     ' ファイルのリスト取得
  43.     Dim ext As Variant
  44.     Dim file As Object
  45.     Dim filesList() As String
  46.     Dim i As Long
  47.     i = 0
  48.     For Each ext In extensionList
  49.         For Each file In folder.Files
  50.             If file.Name Like "*." & ext Then
  51.                 ReDim Preserve filesList(i)
  52.                 If getPath Then
  53.                     ' ファイルパスを取得
  54.                     filesList(i) = file.Path
  55.                 Else
  56.                     ' ファイル名を取得
  57.                     filesList(i) = file.Name
  58.                 End If
  59.                 i = i + 1
  60.             End If
  61.         Next file
  62.     Next ext
  63.     ' オブジェクトを解放
  64.     Set fso = Nothing
  65.     Set folder = Nothing
  66.     Set file = Nothing
  67.     'ファイルが1つも見つからない場合、Falseを返す
  68.     If i = 0 Then
  69.         get_files = False
  70.     Else
  71.         get_files = filesList
  72.     End If
  73. End Function

ファイル一覧のファイル名のみを取得してメッセージボックスに表示

以下のコードを実行すると、ファイル名を取得することができます。

get_files()関数の第一引数にフォルダパスを指定、第二引数指定なし、第三引数にFalseを指定しています。

  • test.html

  • test.jpg

  • test.txt

  • test.xlsx

VBA
Copy
  1. Sub sample()
  2.     'フォルダパス
  3.     Dim folderPath As String
  4.     folderPath = "C:\Users\test\Desktop\test"
  5.     'ファイル一覧を配列で取得
  6.     Dim fileList As Variant
  7.     fileList = get_files(folderPath, , False)
  8.     '配列で取得したファイル一覧を文字列に変換
  9.     Dim str As String
  10.     Dim file As Variant
  11.     For Each file In fileList
  12.        str = str & file & Chr(13)
  13.     Next file
  14.     'ファイル一覧をメッセージボックスに表示
  15.     MsgBox str
  16. End Sub
  17. Public Function get_files(ByVal folderPath As String, Optional ByVal extensions As Variant = Empty, Optional ByVal getPath As Boolean = True) As Variant
  18.     ' FileSystemObjectを作成
  19.     Dim fso As Object
  20.     Set fso = CreateObject("Scripting.FileSystemObject")
  21.     ' 指定したディレクトリのフォルダを取得
  22.     Dim folder As Object
  23.     Set folder = fso.GetFolder(folderPath)
  24.     'ファイルが存在しない場合、処理を終了
  25.     If folder Is Nothing Then
  26.         get_files = False
  27.         Exit Function
  28.     End If
  29.     ' 拡張子リスト作成
  30.     Dim extensionList() As Variant
  31.     If IsEmpty(extensions) Then
  32.         ReDim extensionList(0 To 0)
  33.         extensionList(0) = "*"
  34.     Else
  35.         If IsArray(extensions) Then
  36.             extensionList = extensions
  37.         ElseIf Not extensions = False Then
  38.             ReDim extensionList(0 To 0)
  39.             extensionList(0) = extensions
  40.         End If
  41.     End If
  42.     ' ファイルのリスト取得
  43.     Dim ext As Variant
  44.     Dim file As Object
  45.     Dim filesList() As String
  46.     Dim i As Long
  47.     i = 0
  48.     For Each ext In extensionList
  49.         For Each file In folder.Files
  50.             If file.Name Like "*." & ext Then
  51.                 ReDim Preserve filesList(i)
  52.                 If getPath Then
  53.                     ' ファイルパスを取得
  54.                     filesList(i) = file.Path
  55.                 Else
  56.                     ' ファイル名を取得
  57.                     filesList(i) = file.Name
  58.                 End If
  59.                 i = i + 1
  60.             End If
  61.         Next file
  62.     Next ext
  63.     ' オブジェクトを解放
  64.     Set fso = Nothing
  65.     Set folder = Nothing
  66.     Set file = Nothing
  67.     'ファイルが1つも見つからない場合、Falseを返す
  68.     If i = 0 Then
  69.         get_files = False
  70.     Else
  71.         get_files = filesList
  72.     End If
  73. End Function

複数の拡張子を指定してファイルパスをメッセージボックスに表示

以下のコードを実行すると、ファイル名を取得することができます。

get_files()関数の第一引数にフォルダパスを指定、第二引数に複数の拡張子(html、jpg)を配列で指定しています。

  • C:\Users\test\Desktop\test\test.html

  • C:\Users\test\Desktop\test\test.jpg

VBA
Copy
  1. Sub sample()
  2.     'フォルダパス
  3.     Dim folderPath As String
  4.     folderPath = "C:\Users\test\Desktop\test"
  5.     '拡張子リスト
  6.     Dim extensionList As Variant
  7.     extensionList = Array("html", "jpg")
  8.     'ファイル一覧を配列で取得
  9.     Dim fileList As Variant
  10.     fileList = get_files(folderPath, extensionList)
  11.     '配列で取得したファイル一覧を文字列に変換
  12.     Dim str As String
  13.     Dim file As Variant
  14.     For Each file In fileList
  15.        str = str & file & Chr(13)
  16.     Next file
  17.     'ファイル一覧をメッセージボックスに表示
  18.     MsgBox str
  19. End Sub
  20. Public Function get_files(ByVal folderPath As String, Optional ByVal extensions As Variant = Empty, Optional ByVal getPath As Boolean = True) As Variant
  21.     ' FileSystemObjectを作成
  22.     Dim fso As Object
  23.     Set fso = CreateObject("Scripting.FileSystemObject")
  24.     ' 指定したディレクトリのフォルダを取得
  25.     Dim folder As Object
  26.     Set folder = fso.GetFolder(folderPath)
  27.     'ファイルが存在しない場合、処理を終了
  28.     If folder Is Nothing Then
  29.         get_files = False
  30.         Exit Function
  31.     End If
  32.     ' 拡張子リスト作成
  33.     Dim extensionList() As Variant
  34.     If IsEmpty(extensions) Then
  35.         ReDim extensionList(0 To 0)
  36.         extensionList(0) = "*"
  37.     Else
  38.         If IsArray(extensions) Then
  39.             extensionList = extensions
  40.         ElseIf Not extensions = False Then
  41.             ReDim extensionList(0 To 0)
  42.             extensionList(0) = extensions
  43.         End If
  44.     End If
  45.     ' ファイルのリスト取得
  46.     Dim ext As Variant
  47.     Dim file As Object
  48.     Dim filesList() As String
  49.     Dim i As Long
  50.     i = 0
  51.     For Each ext In extensionList
  52.         For Each file In folder.Files
  53.             If file.Name Like "*." & ext Then
  54.                 ReDim Preserve filesList(i)
  55.                 If getPath Then
  56.                     ' ファイルパスを取得
  57.                     filesList(i) = file.Path
  58.                 Else
  59.                     ' ファイル名を取得
  60.                     filesList(i) = file.Name
  61.                 End If
  62.                 i = i + 1
  63.             End If
  64.         Next file
  65.     Next ext
  66.     ' オブジェクトを解放
  67.     Set fso = Nothing
  68.     Set folder = Nothing
  69.     Set file = Nothing
  70.     'ファイルが1つも見つからない場合、Falseを返す
  71.     If i = 0 Then
  72.         get_files = False
  73.     Else
  74.         get_files = filesList
  75.     End If
  76. End Function

Excel VBAで初心者を卒業したいという方におすすめの1冊

アイコン画像

もみじ

入門書レベルの内容を理解できる方におすすめの1冊で、実務で必要なスキルを学ぶことができます。

具体的には、コーディングの作法や効率的なコーディング方法、CSVやWeb上のデータとの連携方法、そしてマクロの高速化などの実務で役立つスキルを学ぶことができます。

-プログラミング
-, ,