Excel VBAで指定したフォルダ内のファイル名を出力する

こんばんは。きわさです。

ExcelVBAは知っておくと結構便利です。
今回はFileSystemObjectでフォルダの情報を取得する方法です。
一部のよく使ってるものを記載します。

フォルダの有無をチェック

Sub test1()
    Dim fso As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
    If fso.FolderExists("C:\Test") = True Then
        Debug.Print "指定したフォルダは存在します"
    Else
        Debug.Print "指定したフォルダは存在しません"
    End If
    Set fso = Nothing
End Sub

FileSystemObjectはCreateObject(“Scripting.FileSystemObject”)で生成します。
フォルダの有無は FolderExists を使用します。
指定したフォルダが存在すれば True、しなければ False となります。

ファイルの有無をチェック

Sub test2()
    Dim fso As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
    If fso.FileExists("C:\Test\test.jpg") = True Then
        Debug.Print "指定したファイルは存在します"
    Else
        Debug.Print "指定したファイルは存在しません"
    End If
    Set fso = Nothing
End Sub

ファイルの場合は FileExists を使用します。
こちらも、指定したファイルが存在すれば True、しなければ False となります。

指定したフォルダ内のサブフォルダを取得

Sub test3()
    Dim fso As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
    Dim f As Object
    For Each f In fso.GetFolder("C:\Test").SubFolders
        Debug.Print f.Name
        Debug.Print f.Path
    Next
    Set fso = Nothing
End Sub

GetFolder() は指定したフォルダを取得します。
SubFolders はサブフォルダのリストです。
それらをFor Eachで一つずつ f に取り込み、NameとPathを取得しています。
Name: フォルダ名
Path: フォルダパス

指定したフォルダ内のファイルを取得

Sub test4()
    Dim fso As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
    Dim f As Object
    For Each f In fso.GetFolder("C:\Test").Files
        Debug.Print f.Name
        Debug.Print f.Path
    Next
    Set fso = Nothing
End Sub

ファイルの場合は Files で取得します。

指定したフォルダ下のすべてのファイル名を出力

応用編で、指定したフォルダ下のすべてのファイル一覧を作成してみます。

Sub test5()
    Dim fso As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
    If fso.FolderExists(Range("A1").Value) = True Then
        Dim row As Long
        row = 1
        Dim col As Long
        col = 1
        Call test6(Range("A1").Value, row, col)
    End If
    Set fso = Nothing
End Sub
Private Sub test6(path As String, ByRef row As Long, col As Long)
    Dim fso As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
    Dim f As Object
    For Each f In fso.GetFolder(path).SubFolders
        row = row + 1
        Cells(row, col).Value = f.Name
        Call test6(f.Path, row, col + 1)
    Next
    For Each f In fso.GetFolder(path).Files
        row = row + 1
        Cells(row, col).Value = f.Name
    Next
    Set fso = Nothing
End Sub

A1セルにフォルダパスを記載して test5 を実行すると、そのパスのフォルダが存在していれば、A2セルから下に向かってファイル名を出力していきます。
フォルダの場合は出力列を右にずらし、 test6 を再帰的に呼び出しています。

階層情報がいらない場合は、
row = row + 1
Cells(row, col).Value = f.Name
Call test6(f.Path, row, col + 1)

Call test6(f.Path, row, col)
に変更すればファイル名のみの出力になります。

スポンサーリンク