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

