この記事では、指定したフォルダに存在する全てのサブフォルダおよびファイルの情報を取得する機能について説明します。
サブフォルダおよびファイルを再帰的に検索して、情報を取得します。
フォルダ・ファイル一覧を一度作成しておけば、追加されたり、変更されたフォルダやファイルを見つけることが簡単になります。
フォルダの情報は、以下を取得します。
- フォルダパス
- 更新日時
- フォルダサイズ
ファイルの情報は、以下を取得します。
- ファイル名
- ファイルが存在するフォルダパス
- 更新日時
- ファイルの種類
- ファイルサイズ
それでは、指定したフォルダのサブフォルダを含む全てのフォルダやファイルの情報を取得する機能を作成していきましょう。
困っている女性
困っている女性
解決する男性
困っている女性
困っている女性
解決する男性
困っている女性
もくじ
0.今回作成する機能の概要図
今回作成する機能(サブフォルダを含む全てのフォルダやファイルの情報を取得する)の概要図は、以下です。

サブフォルダを含む全てのフォルダやファイルの情報を取得するの概要図
フォルダパスを指定すると、そのフォルダに存在するサブフォルダおよびファイル情報を取得し、EXCELシートに出力します。
似たような機能については、以下の記事で説明しています。




それでは、サブフォルダを含む全てのフォルダやファイルの情報を取得する機能について、1つ1つ順番に説明していきます。
1.サブフォルダを含む全てのフォルダやファイルの情報を出力するシートを準備する
まず、取得した情報を出力するシートを作成します。
「メイン」シートを作成する

メインシートを作成する
- 「メイン」という名前のシートを作成します。
- A1セルに「フォルダパス」のタイトルを作成します。
- B1セルに「ファイル名」のタイトルを作成します。
- C1セルに「更新日時」のタイトルを作成します。
- D1セルに「種類」のタイトルを作成します。
- E1セルに「サイズKB」のタイトルを作成します。
- 2行目以降は、取得したフォルダやファイル情報が出力されます。
2行目以降には、VBAプログラムが取得したフォルダやファイル情報を出力します。
2.VBAでフォルダやファイル情報を取得する機能を作成する
「Microsoft Visual Basic for Applications」を起動します。

VBAプログラムを記入する(その1)
標準モジュールを追加して、以下のソースを書きます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
Public Sub MainProc() Dim folder As String Dim shtMain As Worksheet Dim fso As Object Dim maxRow As Long Dim nowRow As Long '1.フォルダパスを指定する folder = InputBox("フォルダパスを入力してください。", "フォルダパスの指定", "D:\") '2.参照するシートを変数に格納する Set shtMain = ThisWorkbook.Sheets("メイン") '3.データ入力されているA列の最終行を取得する maxRow = shtMain.Cells(shtMain.Rows.Count, 1).End(xlUp).Row '4.最終行が2行目以降なら、2行目以降のデータをクリアする If maxRow >= 2 Then shtMain.Range("A2:E" & maxRow).ClearContents End If '5.FileSystemObjectを変数に格納する Set fso = CreateObject("Scripting.FileSystemObject") nowRow = 1 '6.指定したフォルダの情報をシートに出力する Call WriteInfo(folder, fso, nowRow, shtMain) '7.FileSystemObjectをクリアする Set fso = Nothing MsgBox "完了" End Sub |
フォルダおよびファイル情報をEXCELに出力する機能が以下のVBAプログラムです。

VBAプログラムを記入する(その2)
次に、以下のソースも標準モジュールに書きます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
Private Sub WriteInfo(ByVal nowFolder As String, ByRef fso As Object, _ ByRef nowRow As Long, ByRef sht As Worksheet) Dim file As Object Dim folder As Object Dim subFolder As Object '1.エラーを無視して次の処理を続行する On Error Resume Next nowRow = nowRow + 1 '2.フォルダオブジェクトを取得する Set folder = fso.GetFolder(nowFolder) '3.フォルダパスを出力する sht.Range("A" & nowRow) = folder.Path '4.フォルダの更新日時を出力する sht.Range("C" & nowRow) = folder.DateLastModified '5.フォルダの種類を出力する sht.Range("D" & nowRow) = folder.Type '6.フォルダのサイズを出力する(EXCELのRoundup関数を使って、キロバイト単位にする) sht.Range("E" & nowRow) = WorksheetFunction.RoundUp(folder.Size / 1024, 0) '7.指定されたフォルダに存在するファイル数分、以降の処理を繰り返す For Each file In folder.files nowRow = nowRow + 1 '8.フォルダパスを出力する sht.Range("A" & nowRow) = folder.Path '9.ファイル名を出力する sht.Range("B" & nowRow) = file.Name '10.更新日時を出力する sht.Range("C" & nowRow) = file.DateLastModified '11.ファイルの種類を出力する sht.Range("D" & nowRow) = file.Type '12.ファイルのサイズを出力する(EXCELのRoundup関数を使って、キロバイト単位にする) sht.Range("E" & nowRow) = WorksheetFunction.RoundUp(file.Size / 1024, 0) Next '13.現在のフォルダに存在するサブフォルダ数分、以降の処理を繰り返す For Each subFolder In folder.SubFolders '14.指定したフォルダの情報をシートに出力する Call WriteInfo(subFolder, fso, nowRow, sht) Next End Sub |
最後にEXCELを「◯◯◯.xlsm」というような感じでマクロ有効ブック形式で保存します。
3.指定したフォルダ配下の全てのフォルダやファイル情報を取得する機能の使い方
それでは、指定したフォルダ配下の全てのフォルダやファイルの情報を取得する方法を説明します。
「開発」タブの「マクロ」をクリックします。

マクロを実行する
先程作成した「MainProc」を選択し、実行ボタンをクリックします。

実行ボタンをクリックする
フォルダパスを指定するダイアログが表示されます。
調査したいフォルダパスを入力して、OKボタンをクリックします。

フォルダパスを指定する
しばらく待つと、指定したフォルダに存在するフォルダおよびファイル情報の一覧が2行目以降に作成されます。

フォルダおよびファイル情報一覧が作成された
指定したフォルダに存在するサブフォルダおよびファイルの全ての情報が出力されました。
この一覧を作成しておけば、後日追加や変更されたフォルダやファイルについて知ることができます。
4.指定したフォルダ配下の全てのフォルダやファイル情報を取得するVBAプログラム(MainProc)の説明
それでは、指定したフォルダ配下の全てのフォルダやファイル情報を取得するVBAプログラム(MainProc)を説明します。
1.フォルダパスを指定する
1 2 |
'1.フォルダパスを指定する folder = InputBox("フォルダパスを入力してください。", "フォルダパスの指定", "D:\") |
デフォルトのフォルダパスは”D:\”にしています。
ダイアログで入力されたフォルダパスは、変数「folder」に格納します。
2.参照するシートを変数に格納する
1 2 |
'2.参照するシートを変数に格納する Set shtMain = ThisWorkbook.Sheets("メイン") |
そうすることにより、入力するプログラムを短くすることができるからです。
何度も「ThisWorkbook.Sheets(“メイン”)」と入力するより、「shtMain」と入力するほうが少なくすむからです。
3.データ入力されているA列の最終行を取得する
1 2 |
'3.データ入力されているA列の最終行を取得する maxRow = shtMain.Cells(shtMain.Rows.Count, 1).End(xlUp).Row |
取得した最終行番号を変数「maxRow」に格納します。
4.最終行が2行目以降なら、2行目以降のデータをクリアする
1 2 3 4 |
'4.最終行が2行目以降なら、2行目以降のデータをクリアする If maxRow >= 2 Then shtMain.Range("A2:E" & maxRow).ClearContents End If |
最終行が2行目より小さい場合は、タイトル行のみの状態なのでセルの値をクリアする必要がありません。
5.FileSystemObjectを変数に格納する
1 2 |
'5.FileSystemObjectを変数に格納する Set fso = CreateObject("Scripting.FileSystemObject") |
「FileSystemObject」はファイル操作やフォルダ操作をVBAで行うときに大変お世話になる便利なライブラリです、覚えておくと良いです。
6.指定したフォルダの情報をシートに出力する
1 2 |
'6.指定したフォルダの情報をシートに出力する Call WriteInfo(folder, fso, nowRow, shtMain) |
この関数には、フォルダパス、FileSystemObject、現在行、書き込みしたいシートを指定しています。
7.FileSystemObjectをクリアする
1 2 |
'7.FileSystemObjectをクリアする Set fso = Nothing |
クリアしないと、ファイル情報をつかんだままになりますので、ご注意ください。
5.指定したフォルダ配下の全てのフォルダやファイル情報を取得するVBAプログラム(WriteInfo)の説明
それでは、今回の機能の心臓部分となる「WriteInfo」について説明します。
1.エラーを無視して次の処理を続行する
1 2 |
'1.エラーを無視して次の処理を続行する On Error Resume Next |
フォルダやファイルの情報を取得する権限がない場合にエラーが発生します。
そういうエラーを無視して全ての処理を最後まで実行します。
2.フォルダオブジェクトを取得する
1 2 |
'2.フォルダオブジェクトを取得する Set folder = fso.GetFolder(nowFolder) |
引数で渡されたフォルダのフォルダオブジェクトになります。
3.フォルダパスを出力する
1 2 |
'3.フォルダパスを出力する sht.Range("A" & nowRow) = folder.Path |
4.フォルダの更新日時を出力する
1 2 |
'4.フォルダの更新日時を出力する sht.Range("C" & nowRow) = folder.DateLastModified |
5.フォルダの種類を出力する
1 2 |
'5.フォルダの種類を出力する sht.Range("D" & nowRow) = folder.Type |
種類といっても、「ファイル フォルダー」という文字列になります。
6.フォルダのサイズを出力する(EXCELのRoundup関数を使って、キロバイト単位にする)
1 2 |
'6.フォルダのサイズを出力する(EXCELのRoundup関数を使って、キロバイト単位にする) sht.Range("E" & nowRow) = WorksheetFunction.RoundUp(folder.Size / 1024, 0) |
フォルダサイズは、キロバイト単位にするため、1024で割ります。
EXCELのRoundUp関数を使って、整数に切り上げています。
7.指定されたフォルダに存在するファイル数分、以降の処理を繰り返す
1 2 |
'7.指定されたフォルダに存在するファイル数分、以降の処理を繰り返す For Each file In folder.files |
ファイルが5個存在すれば、5回以降の処理を繰り返します。
8.フォルダパスを出力する
1 2 |
'8.フォルダパスを出力する sht.Range("A" & nowRow) = folder.Path |
9.ファイル名を出力する
1 2 |
'9.ファイル名を出力する sht.Range("B" & nowRow) = file.Name |
10.更新日時を出力する
1 2 |
'10.更新日時を出力する sht.Range("C" & nowRow) = file.DateLastModified |
11.ファイルの種類を出力する
1 2 |
'11.ファイルの種類を出力する sht.Range("D" & nowRow) = file.Type |
12.ファイルのサイズを出力する(EXCELのRoundup関数を使って、キロバイト単位にする)
1 2 |
'12.ファイルのサイズを出力する(EXCELのRoundup関数を使って、キロバイト単位にする) sht.Range("E" & nowRow) = WorksheetFunction.RoundUp(file.Size / 1024, 0) |
ファイルサイズは、キロバイト単位にするため、1024で割ります。
EXCELのRoundUp関数を使って、整数に切り上げています。
13.現在のフォルダに存在するサブフォルダ数分、以降の処理を繰り返す
1 2 |
'13.現在のフォルダに存在するサブフォルダ数分、以降の処理を繰り返す For Each subFolder In folder.SubFolders |
サブフォルダが5個存在すれば、5回以降の処理を繰り返します。
14.指定したフォルダの情報をシートに出力する
1 2 |
'14.指定したフォルダの情報をシートに出力する Call WriteInfo(subFolder, fso, nowRow, sht) |
つまり、サブフォルダについて、フォルダやファイル情報を取得するようにしています。
もし、サブフォルダのサブフォルダが存在する場合、さらに下に向かって繰り返したどっていきます。
このようにすることにより、階層的にフォルダをたどり、情報を取得することができます。
それでは、指定したフォルダのサブフォルダを含む全てのフォルダやファイルの情報を取得する機能を利用してください。
以上です。
最後まで読んでいただきありがとうございました。
この記事をシェアしていただけると喜びます。