今回は、サブフォルダを含めたファイル一覧をExcelに書き出す方法について解説します。
ファイルの洗い出しなどで、フォルダパスを指定し再帰的にサブフォルダを含むファイル一覧を書き出したい時があるかと思います。
サンプルコードを用いてご紹介しますので、ぜひ最後までお付き合いください。
- サブフォルダを含むファイル一覧の作成方法が分かります。
- コピペで使える実践的なサンプルコードを掲載しています。
前提
実行後イメージ
本記事でご紹介するサンプルコードでは、以下赤枠箇所のファイル一覧を書き出すものです。
以下の画像では、「C:\Users\xxxx\AppData\Local\Microsoft\Office\16.0」というフォルダパスを入力値とし、サブフォルダを含めて一覧を書き出しています。
※画像はクリックで拡大できます。
出力可能な項目
先述した実行イメージでは以下を書き出していました。
- フォルダパス
- フォルダ名
- ファイル名
- 拡張子
- ファイルサイズ
上記以外の項目も出力可能です。
FileSystemObjectの FolderオブジェクトとFileオブジェクトのプロパティに対応した項目が出力可能です。
詳細は以下を参照ください。(新しいタブで別記事が開きますのでご注意ください)
実行前の準備
FileSystemObjectを使用するため、「Microsoft Scripting Runtime」の参照設定を有効にする必要があります。
お手数ですが、以下記事の手順に則って、参照設定を有効化をしてからサンプルコードを実行ください。
サンプルコード
ファイル一覧の取得
サブフォルダを含むファイル一覧を書き出すサンプルコードです。
ハイライトされている以下の行を修正したうえでご使用ください。
- 13行目:検索を開始するフォルダパスを指定してください。
- 16行目:データを書き出す行を指定してください。
13行目をInputBoxにして、都度フォルダパスを入力可能にするのもオススメです!
' ****************************************
' 概要 :ファイル一覧の書き出しを行う
' 引数 :なし
' 戻り値:なし
' ****************************************
Public Sub writeFileList()
Dim fso As New FileSystemObject ' FileSystemObject
Dim targetFolder As Folder ' 検索対象Folderオブジェクト
Dim targetFolderPath As String ' 検索対象フォルダパス
Dim startRowIndex As Long ' 書き出し開始行Index
' 検索対象フォルダパスを入力させる
targetFolderPath = "C:\Users\xxxx\AppData\Local\Microsoft\Office\16.0"
' 書き出し開始の行を設定
startRowIndex = 2
' フォルダが存在した場合のみ処理を実行
If fso.FolderExists(targetFolderPath) Then
' 検索対象のフォルダオブジェクトを生成する
Set targetFolder = fso.GetFolder(targetFolderPath)
' ファイルの検索と書き出しを行う
Call execFileSearch(fso, targetFolder, startRowIndex)
End If
' オブジェクトの解放
Set fso = Nothing
Set targetFolder = Nothing
End Sub
' ****************************************
' 概要 :ファイルの検索を行う(サブフォルダーを含む)
' 引数 :fso … FileSystemObject
' folderObj … 検索対象Folderオブジェクト
' currentRowIndex … 書き出し行Index
' 戻り値:なし
' ****************************************
Private Sub execFileSearch( _
ByVal fso As FileSystemObject, ByVal folderObj As Folder, ByRef currentRowIndex As Long)
Dim fileObj As File ' Fileオブジェクト
Dim subFolderObj As Folder ' サブフォルダ用 Folderオブジェクト
' 検索対象フォルダ配下のファイルをループする
For Each fileObj In folderObj.Files
' ファイル情報を書き出し
Call writeFileInfo(fso, fileObj, currentRowIndex)
Next fileObj
' サブフォルダ情報を書き出し
For Each subFolderObj In folderObj.SubFolders
' サブフォルダを対象とし、再度ファイルの検索を行う
Call execFileSearch(fso, subFolderObj, currentRowIndex)
Next subFolderObj
' オブジェクトの解放
Set fileObj = Nothing
Set subFolderObj = Nothing
End Sub
' ****************************************
' 概要 :ファイル情報の書き出し
' 引数 :fso … FileSystemObject
' folderObj … Fileオブジェクト
' currentRowIndex … 書き出し行Index
' 戻り値:なし
' ****************************************
Private Sub writeFileInfo(ByVal fso As FileSystemObject, ByVal fileObj As File, ByRef currentRowIndex As Long)
' マクロを実行しているブックの1番目のシートに書き出し
With ThisWorkbook.Worksheets(1)
' フォルダ情報の書き出し
.Cells(currentRowIndex, 1).Value = fileObj.ParentFolder.Path ' フォルダパス
.Cells(currentRowIndex, 2).Value = fileObj.ParentFolder.Name ' フォルダ名
' ファイル情報の書き出し
.Cells(currentRowIndex, 3).Value = fileObj.Name ' ファイル名
.Cells(currentRowIndex, 4).Value = fso.GetExtensionName(fileObj.Name) ' 拡張子
.Cells(currentRowIndex, 5).Value = fileObj.Size ' ファイルサイズ(Byte)
End With
' 書き出し行Indexをインクリメント
currentRowIndex = currentRowIndex + 1
End Sub
最後に
今回は、サブフォルダを含むファイル一覧を書き出す方法について解説しました。
サンプルコードでは冗長的になるのを避けるため、ヘッダ部の書き出し・装飾や罫線などを引いていないため、追加でコーディング頂けると汎用的にご使用頂けると思います。
また、処理終了後にメッセージボックスを出力すると、より使いやすくなると思います。
本記事が皆さんのお力になれば幸いです!
コメント