【エクセルVBA】FileSystemオブジェクトでフォルダ内のサブフォルダ一覧を取得する


folders

photo credit: fotofeliz 8th oct via photopin (license)

みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。

エクセルVBAでFileSystemオブジェクトを使ってファイルやフォルダの操作をする方法をシリーズでお伝えしています。

前回はこちらの記事。

【エクセルVBA】FileSystemオブジェクトとFor Each文でファイル一覧を取得する方法
エクセルVBAでFileSystemオブジェクトを使ってファイルやフォルダの操作をする方法についてお伝えしています。今回は、FilesコレクションとそのFor Each文を使ってファイル一覧を出力する方法です。

特定のフォルダ内のファイル一覧を出力するプログラムを作成しました。

前回、ファイル一覧ということでしたので、今回はサブフォルダ一覧にチャレンジしてみたいと思います。

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するという内容ですね。

このプログラムを少し手直しするだけで、特定のフォルダ内のサブフォルダ一覧を取得するプログラムを作成することができます。

今回対象となるフォルダ

今回、対象となるフォルダはこちらのフォルダです。

エクセルVBAでサブフォルダを取得する対象フォルダ

サブフォルダとして「pdf」「xlsx」というフォルダがありますので、この二つを一覧できれば成功です。

「FileSystemオブジェクト.xlsm」がいわゆるThisWorkbookですので、前述のプログラムの7行目のGetFolderメソッドで取得する箇所を以下のように変更をします。

Set objFolder = objFso.GetFolder(ThisWorkbook.Path)

前回もお伝えしましたが、GetFolderメソッドで指定する場合は、最後に「\」をつけても、つけなくてもOKですよ。

SubFoldersプロパティでフォルダコレクションを取得する

次に今回のキモとなる部分ですが、対象のフォルダのサブフォルダコレクションを取得します。

その場合は、Folderオブジェクトに対する、SubFoldersプロパティを使います。

書き方は

Folderオブジェクト.SubFolders

これでOKです。

それで、そのサブフォルダコレクションに対してFor Each文を使ってあげれば、対象フォルダに含まれる各サブフォルダについて、処理を行うことができます。

その部分、プログラムの9~12行目を以下のようにすればよいですね。

Dim f As Object
For Each f In objFolder.SubFolders
    '処理
Next f

Nameプロパティでフォルダ名を取得する

フォルダ名を取得する際も、Folderオブジェクトに対してNameプロパティを使ってあげればOKです。

Folderオブジェクト.Name

対象となるフォルダは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でサブフォルダ一覧を出力した結果

このようにサブフォルダ名を出力することができました。

まとめ

以上、エクセルVBAでFileSystemオブジェクトを使ってサブフォルダ一覧を取得する方法についてお伝えしました。

前回とほとんど同じでしたね…!

コレクションに対するFor Each文はとっても便利なので、ぜひマスター頂ければと思います。

次回もFileSystemオブジェクトを活用するテクニックについてお伝えします。

どうぞお楽しみに!

連載目次:FileSystemオブジェクトでフォルダやファイルを操作する

ファイルやフォルダを操作するのはデリケートな気がしますが、エクセルVBAではFileSystemオブジェクトを使うことでファイル、フォルダ、ドライブをオブジェクトとして安全にそして細やかに操作をすることができます。 このシリーズでは、FileSystemオブジェクトの様々な活用法についてシリーズでお伝えしていきます。
  1. 【エクセルVBA】FileSystemオブジェクトの基本と簡単にフルパスを生成・分解する方法
  2. 【エクセルVBA】FileSystemオブジェクトでファイルやフォルダが存在するかを判定する
  3. 【エクセルVBA】指定のフォルダが存在するか判定して、存在してなければ作成する方法
  4. 【エクセルVBA】FileSystemオブジェクトとFor Each文でファイル一覧を取得する方法
  5. 【エクセルVBA】FileSystemオブジェクトでフォルダ内のサブフォルダ一覧を取得する

タイトルとURLをコピーしました