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