みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
エクセルVBAでFileSystemオブジェクトを使ってファイルやフォルダの操作をする方法をシリーズでお伝えしています。
前回はこちらの記事。
特定のフォルダ内のファイル一覧を出力するプログラムを作成しました。
前回、ファイル一覧ということでしたので、今回はサブフォルダ一覧にチャレンジしてみたいと思います。
FileSystemオブジェクトとFor Each文で同じように実現できます。
では、エクセルVBAでFileSystemオブジェクトを使って、サブフォルダ一覧を取得する方法です。
よろしくお願いします!
前回のおさらい:ファイル一覧を取得する
まずは、前回のおさらいからです。
作成したプログラムはこちらでした。
Sub フォルダ内のファイル一覧を取得する() Dim objFso As Object Set objFso = CreateObject("Scripting.FileSystemObject") Dim objFolder As Object Set objFolder = objFso.GetFolder(ThisWorkbook.Path & "\xlsx") Dim f As Object For Each f In objFolder.Files Debug.Print f.Name Next f Set objFso = Nothing End Sub
7行目のGetFolderメソッドで対象となるフォルダをobjFolderとしてセットしています。
10行目からのFor Each文で、objFolder.Filesつまり、objFolder内のファイルのコレクションの各要素について繰り返し、そのファイル名をDebug.Printするという内容ですね。
このプログラムを少し手直しするだけで、特定のフォルダ内のサブフォルダ一覧を取得するプログラムを作成することができます。
今回対象となるフォルダ
今回、対象となるフォルダはこちらのフォルダです。
サブフォルダとして「pdf」「xlsx」というフォルダがありますので、この二つを一覧できれば成功です。
「FileSystemオブジェクト.xlsm」がいわゆるThisWorkbookですので、前述のプログラムの7行目のGetFolderメソッドで取得する箇所を以下のように変更をします。
Set objFolder = objFso.GetFolder(ThisWorkbook.Path)
前回もお伝えしましたが、GetFolderメソッドで指定する場合は、最後に「\」をつけても、つけなくてもOKですよ。
SubFoldersプロパティでフォルダコレクションを取得する
次に今回のキモとなる部分ですが、対象のフォルダのサブフォルダコレクションを取得します。
その場合は、Folderオブジェクトに対する、SubFoldersプロパティを使います。
書き方は
これでOKです。
それで、そのサブフォルダコレクションに対してFor Each文を使ってあげれば、対象フォルダに含まれる各サブフォルダについて、処理を行うことができます。
その部分、プログラムの9~12行目を以下のようにすればよいですね。
Dim f As Object For Each f In objFolder.SubFolders '処理 Next f
Nameプロパティでフォルダ名を取得する
フォルダ名を取得する際も、Folderオブジェクトに対してNameプロパティを使ってあげればOKです。
対象となるフォルダはfという変数に格納されていますから、冒頭のプログラムの11行目は、そのまんま
Debug.Print f.Name
でOKです。
フォルダ内のサブフォルダ一覧を出力するプログラム
以上をまとめたプログラムがこちらです。
Sub フォルダ内のサブフォルダ一覧を取得する() Dim objFso As Object Set objFso = CreateObject("Scripting.FileSystemObject") Dim objFolder As Object Set objFolder = objFso.GetFolder(ThisWorkbook.Path) Dim f As Object For Each f In objFolder.SubFolders Debug.Print f.Name Next f Set objFso = Nothing End Sub
このプログラムを実行すると
このようにサブフォルダ名を出力することができました。
まとめ
以上、エクセルVBAでFileSystemオブジェクトを使ってサブフォルダ一覧を取得する方法についてお伝えしました。
前回とほとんど同じでしたね…!
コレクションに対するFor Each文はとっても便利なので、ぜひマスター頂ければと思います。
次回もFileSystemオブジェクトを活用するテクニックについてお伝えします。
どうぞお楽しみに!