こんばんは。きわさです。
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)
に変更すればファイル名のみの出力になります。