検索

キーワード


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

  • 公開日:2021-03-18 17:22:28
  • 最終更新日:2021-03-23 18:10:45

はじめに

こんにちは、IMMRです。


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

例えば、こんな感じです。


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

フォルダー内のファイル


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

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



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

データaのtxtファイル」があって、「データAのBookファイル」があって・・・

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


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

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


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

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


必要なメソッド①

Set FSO = New FileSystemObject

FileSystemObjectは、フォルダー・ファイル等を操作する時に必要としているオブジェクトです。

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


必要なメソッド②

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

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  フォルダー内のファイル

フォルダ内のファイル



「Accessのファイル」「Excelのファイル」「Power Pointのファイル」等、いろいろ格納されています。


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


サンプルコード

Sub test25()

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

FILE_PATH = "C:\VBA\ファイル"

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

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

Set FSO = New FileSystemObject
Set TARGET = FSO.GetFolder(FILE_PATH).Files

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.サンプルコードを実行してフォルダー内の全てのファイル名を取得する前に

フォルダー内の全てのファイル名を取得するために上記、サンプルコードを実行すると以下のようなエラーになる場合があります。


図4 実行後のエラー

実行後のエラー


VBA内の詳細設定を確認または、設定が必要になります。

下記のようにVBE画面で「ツール」→「詳細設定」を選択する。


図5 詳細設定画面を表示させる方法

詳細設定画面を表示させる方法


図6 詳細設定画面



上記のように詳細設定画面が表示されるので

Microsoft Scripting Runtime」がチェックされているか確認します。


チェックされていない場合は選択する必要があります。

下記のようにありますのでれレ点をチェックして、「OK」を押す


図7 詳細設定画面-Runtimeを選択

詳細設定画面-Runtimeを選択


詳細設定画面が閉じられますので、


図5の「詳細設定画面を表示させる方法」 をもう一度する。

そうすると


図8 詳細設定画面-Runtime選択後

詳細設定画面-Runtime選択後


Microsoft Scripting Runtime」がチェックされていることが確認できます。

これで詳細の設定は完了です。


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

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


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


図9 処理開始前のブック

処理開始前のブック


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

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


図10 処理を行うフォルダー内のファイル

処理を行うフォルダ内のファイル



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


図11 実行結果

実行結果


ファイル名がきちんと記載されています。


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


【著者】

Imamura

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

よく読まれている記事