プログラミング

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

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

アイコン画像

もみじ

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

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

-プログラミング
-, ,