検索

キーワード


【Excel VBA】フォルダー内のフォルダー名を全て取得する方法

  • 公開日:2021-03-26 17:00:20
  • 最終更新日:2021-04-04 11:15:24

こんにちは。IMMRです。


フォルダー内にどんな名前のフォルダーがあるか、という資料を作成されたご経験はあると思います。

例えば、こんな感じです。 ※取得するのはフォルダー名のみです。テキスト等が同じフォルダー内に存在しても対象としません。


図1 -1 フォルダー内のフォルダー

フォルダー内のフォルダー



図1 -2 フォルダー内のファイル一覧

フォルダー内のフォルダー一覧


フォルダーという名のフォルダーの中には、

「AAA」というフォルダー、「BBB」というフォルダーがあって・・・

という感じで調べて、作成していくと思います。


フォルダー数が少ない場合はこれでよいですが、フォルダー数が多いと大変です。(涙)

このような作業をVBAで行うと簡単に出来ますのでその方法について説明致します。


ここでは、「フォルダー内フォルダー名を取得する」ことを説明しますが

フォルダー名ではなくファイル名を取得する記事も下記にて公開しています。

フォルダー内のファイル名を全て取得する方法


1.フォルダー内のフォルダー名を全て取得する方法

フォルダー内のファイル名を全て取得するするには、下記メソッドが必要です。


必要なメソッド①

Set FSO = CreateObject("Scripting.FileSystemObject")

Scripting.FileSystemObjectは、フォルダーに存在するサブファイルのコレクションです

セットするのはオブジェクト変数です。そのため、変数は、「Dim FSO As Object」と宣言しています。


必要なメソッド②

Set TARGET = FSO.GetFolder(フォルダーのパス).SubFolders

GetFolderは、指定したフォルダー内のフォルダー情報を検索するオブジェです。

セットするのはファイル変数です。そのため、変数は、「Dim TARGET As Files」と宣言しています。


これにより、変数「TAGET」に指定フォルダー内のフォルダー情報(複数)が取得されます。

しかし、これでは、フォルダー内のフォルダー情報全てが「TAGET」内に格納されているだけです。

1つ1つのファイル名を取得するには、

「TAGET」内に格納されているフォルダー情報をひとつずつにしてから取得しなくてはいけません。

取得するにはEachメソッドを使用します。


必要なメソッド③

For Each TEMP In TARGET
    BOOK_NAME = TEMP.Name


Next


For Each TEMP In TARGET

先ほど取得したオブジェクト変数「TARGET」に格納されている全てのフォルダー情報から

1つずつ取り出して、TEMPに格納します。TEMPは「Dim TEMP As Object」で宣言しています。 


BOOK_NAME = TEMP.Name

TEMPに格納されたファイル情報からフォルダー名をString変数に格納します。

そのため、「Dim BOOK_NAME As String」で宣言しています。


For Each TEMP In TARGET から Nextの間にある処理が繰り返し行われます。

 つまり、フォルダー名「aaa, bbb, ccc」が格納されていた場合は

 フォルダー名(aaa)を取得して、処理を行って。次にフォルダー名(bbb)を取得して、処理を行って。

 フォルダー名(ccc)を取得して処理を行うことになります。


2.フォルダー内の全てのフォルダー名を記載する方法

1の作業(フォルダー内のフォルダー名を全て取得する方法)では、

全てのフォルダー情報をTARGETに格納」→TARGETから1つずつのフォルダー情報取得

→「1つのフォルダー情報からフォルダー名を取得

ということをやってきました。


ここでは取得したフォルダー名をセルにセットしていきます。

取得方法は単準に変数BOOK_NAMEに格納したフォルダー名を =によって、cellにセットしていきます。


Cells(i, 2) = BOOK_NAME


iはカウンタとして使用するのでint形で宣言しています。

また、上記には記載していませんが「i = i + 1」も忘れないでください。


3.フォルダー内の全てのファイル名を記載するサンプルコード

では、実際にフォルダー内のファイル名を全て取得する方法を行っていきます。

今回は、下記のフォルダ「C:\VBA」配下にあるフォルダー(ファイル)を使用します。


図2 フォルダー名を確認するためのフォルダー

フォルダー名を確認するためのフォルダー


図3  フォルダー内のフォルダー

フォルダー内のフォルダー 


複数のフォルダーが格納されています。フォルダー以外のテキストファイルがありますが

今回は、フォルダーが対象なので対象外とします。


このフォルダー内のフォルダー名を全て取得するサンプルコードは以下になります。


サンプルコード

Sub test27()

Dim i       As Integer
Dim FILE_PATH       As String
Dim FSO             As Object
Dim TARGET          As Object
Dim TEMP            As Object

FILE_PATH = "C:\VBA\フォルダー"

'ヘッダーの作成
Cells(1, 1) = FILE_PATH & "内にあるフォルダ一覧"

'3行目からファイル名を記載します。
i = 3

Set FSO = CreateObject("Scripting.FileSystemObject")
Set TARGET = FSO.GetFolder(FILE_PATH).SubFolders

For Each TEMP In TARGET
    Cells(i, 1) = TEMP.Name
    i = i + 1
Next
   
Columns("A:B").AutoFit
   
End Sub


ちなみにColumns("A:B").AutoFitで行っているのは、A列とBt列の幅自動調整です。

今回の処理に関係しているところではありません。

見易さをよくするために行っています。


4.サンプルコードを実行する前に

フォルダー内の全てのフォルダー名を取得するためにはVBA内の詳細設定を確認または、設定が必要になります。

設定方法は、下記フォルダー内ファイル名を取得する」の

4.サンプルコードを実行してフォルダー内の全てのファイル名を取得する前に」をご参下さい。

フォルダー内のファイル名を全て取得する方法


5.フォルダー内の全てのファイル名を記載するサンプルコードの実行

フォルダー内のファイル名を全て取得できるか、上記のサンプルコードを使用して実行をして確認します。

まず、処理を開始する前のブックは以下のように何も記載していません。


図4 処理開始前のブック

処理開始前のブック


そして、今回処理を行うフォルダは、「C:\VBA\フォルダー」とします。

フォルダー内には、以下のようはフォルダーが投稿されています。


図5 処理を行うフォルダー内のフォルダー

処理を行うフォルダー内のフォルダー


それでは、サンプルコードを実行します。実行した結果が以下になります。


図6 実行結果

実行結果


フォルダー名のみがきちんと記載されています。


これにより、フォルダー内のフォルダー名を全て取得することが出来ました


【著者】

Imamura

今まではExcel VBAの開発をしてきました。
開発を主にしたものや他の業務の効率化を目指して行ったものさまざまです。
現在は、他のプログラミング言語に挑戦して、スキルアップを目指しています。

よく読まれている記事