Excelで特定のフォルダ内にあるファイル名やフォルダ名の一覧を取得したい場面があるでしょう。手作業でコピー&ペーストするのは手間がかかり、ミスも発生しやすいです。VBAのFileSystemObjectを使えば、これらの作業を自動化できます。
この記事では、VBAのFileSystemObjectを使ってフォルダ内のファイル一覧を取得し、Excelシートに書き出す方法を解説します。この方法を習得すれば、ファイル管理の効率が大幅に向上します。
ADVERTISEMENT
目次
VBAでファイル一覧を取得する仕組み
Excel VBAでファイルやフォルダを操作する際、FileSystemObjectは非常に強力なツールです。このオブジェクトは、ファイルシステムへのアクセスを可能にし、ファイルの作成、削除、コピー、移動、そして一覧の取得といった様々な操作を実行できます。
FileSystemObjectを利用することで、指定したフォルダ内のすべてのファイルとサブフォルダをプログラムで列挙できます。各ファイルやフォルダのプロパティ(名前、サイズ、更新日時など)も取得できるため、Excelシートへの出力に必要な情報を効率的に収集することが可能です。
FileSystemObjectでファイル一覧を取得するVBAコード
ここでは、指定したフォルダ内のファイル名と更新日時を取得し、Excelシートに書き出すVBAコードを紹介します。コードを実行すると、指定したフォルダの内容がExcelシートに一覧表示されます。
- VBAエディタを開く
ExcelでAltキーとF11キーを同時に押してVBAエディタを開きます。 - 標準モジュールを挿入する
VBAエディタのメニューで「挿入」>「標準モジュール」を選択します。 - コードを貼り付ける
表示されたコードウィンドウに、以下のVBAコードをコピー&ペーストします。
【VBAコード】
Sub GetFileListToExcel()
Dim fso As Object
Dim targetFolder As Object
Dim fileItem As Object
Dim folderPath As String
Dim ws As Worksheet
Dim rowNum As Long
' フォルダパスを指定してください
folderPath = "C:\Users\YourUsername\Documents\TestFolder" ' ここを実際のフォルダパスに変更してください
' FileSystemObjectを作成
Set fso = CreateObject("Scripting.FileSystemObject")
' 指定したフォルダが存在するか確認
If Not fso.FolderExists(folderPath) Then
MsgBox "指定されたフォルダが存在しません。パスを確認してください。", vbExclamation
Exit Sub
End If
' 対象フォルダを取得
Set targetFolder = fso.GetFolder(folderPath)
' 作業対象のシートを設定(アクティブシートを使用)
Set ws = ThisWorkbook.ActiveSheet
ws.Cells.ClearContents ' シートの内容をクリア
' ヘッダー行を書き込む
ws.Cells(1, 1).Value = "ファイル名"
ws.Cells(1, 2).Value = "更新日時"
ws.Cells(1, 3).Value = "サイズ(バイト)"
ws.Cells(1, 4).Value = "種類"
ws.Range("A1:D1").Font.Bold = True ' ヘッダーを太字にする
' ファイル一覧を書き込む
rowNum = 2 ' 2行目から開始
For Each fileItem In targetFolder.Files
ws.Cells(rowNum, 1).Value = fileItem.Name
ws.Cells(rowNum, 2).Value = fileItem.DateLastModified
ws.Cells(rowNum, 3).Value = fileItem.Size
ws.Cells(rowNum, 4).Value = fso.GetExtensionName(fileItem.Name) ' ファイル拡張子を取得
rowNum = rowNum + 1
Next fileItem
' フォルダ一覧を書き込む(必要に応じて)
' For Each folderItem In targetFolder.SubFolders
' ws.Cells(rowNum, 1).Value = folderItem.Name
' ws.Cells(rowNum, 2).Value = folderItem.DateLastModified
' ws.Cells(rowNum, 3).Value = "<フォルダ>"
' ws.Cells(rowNum, 4).Value = "フォルダ"
' rowNum = rowNum + 1
' Next folderItem
' 列幅を自動調整
ws.Columns("A:D").AutoFit
MsgBox "ファイル一覧の取得が完了しました。", vbInformation
' オブジェクト変数を解放
Set fileItem = Nothing
Set targetFolder = Nothing
Set fso = Nothing
Set ws = Nothing
End Sub
- コードのカスタマイズ
コード内の `folderPath = “C:\Users\YourUsername\Documents\TestFolder”` の部分を、実際にファイル一覧を取得したいフォルダのパスに書き換えてください。 - マクロの実行
VBAエディタでF5キーを押すか、Excelシートに戻り「開発」タブ > 「マクロ」から「GetFileListToExcel」を選択して「実行」ボタンをクリックします。
実行後、アクティブなExcelシートに指定したフォルダ内のファイル名、更新日時、サイズ、種類(拡張子)が表示されます。コメントアウトされている部分を有効にすれば、サブフォルダ名も取得できます。
ファイル一覧取得時の注意点と応用
FileSystemObjectは非常に便利ですが、いくつか注意すべき点があります。また、応用することでさらに活用の幅が広がります。
ファイルパスの指定方法
フォルダパスを指定する際は、バックスラッシュ `\` を2つ重ねる `\` か、またはパスをダブルクォーテーションで囲み、パスの前に `&` をつける方法が推奨されます。これは、VBAにおいて `\` がエスケープ文字として解釈される場合があるためです。
例: `”C:\Users\YourUsername\Documents\TestFolder”` または `”C:” & “\Users\YourUsername\Documents\TestFolder”`
セキュリティ警告について
Excelでマクロを含むファイルを開いた際に、セキュリティ警告が表示されることがあります。これは、悪意のあるマクロが実行されるのを防ぐための機能です。FileSystemObjectはファイルシステムにアクセスするため、この警告が表示されることがあります。
信頼できるソースからのファイルである場合は、「コンテンツの有効化」をクリックしてマクロを有効にしてください。マクロのセキュリティ設定は「ファイル」>「オプション」>「トラストセンター」>「トラストセンターの設定」で調整できますが、セキュリティリスクを理解した上で設定を変更することが重要です。
エラーハンドリングの追加
指定したフォルダが存在しない場合や、ファイルへのアクセス権がない場合などにエラーが発生する可能性があります。コードにエラーハンドリングを追加することで、予期せぬエラーでマクロが停止するのを防ぎ、より安定した処理を実現できます。
例えば、 `On Error Resume Next` をコードの先頭に追加し、エラー発生後に処理を継続させる方法があります。ただし、エラーが発生した原因を特定しにくくなるため、デバッグが難しくなる場合もあります。必要に応じて、 `On Error GoTo ErrorHandler` を使用して、特定のエラー処理ルーチンにジャンプさせる方法も有効です。
取得情報の拡張
FileSystemObjectは、ファイル名や更新日時以外にも、ファイルサイズ (`fileItem.Size`)、ファイル属性 (`fileItem.Attributes`)、ファイルパス (`fileItem.Path`) など、多くのプロパティを持っています。これらの情報をExcelシートに書き出すことで、より詳細なファイル管理リストを作成できます。
例えば、ファイルサイズをKBやMB単位で表示するように計算したり、特定の拡張子を持つファイルだけを抽出したりする処理を組み込むことが可能です。これにより、ディスク容量の確認や、特定の種類のファイル検索などが容易になります。
サブフォルダの再帰処理
現在のコードは指定したフォルダ直下のファイルしか取得しません。もし、サブフォルダ内のファイルもすべて取得したい場合は、再帰処理(関数自身を呼び出す処理)を実装する必要があります。
例えば、フォルダを処理する関数を作成し、その関数内でサブフォルダを見つけたら、そのサブフォルダに対して同じ関数を呼び出すようにします。これにより、階層構造が深いフォルダでも、すべてのファイル一覧を正確に取得できます。
【再帰処理のイメージ】
Sub ProcessFolder(ByVal currentFolderPath As String)
Dim fso As Object
Dim folder As Object
Dim subFolder As Object
Dim file As Object
Set fso = CreateObject("Scripting.FileSystemObject")
Set folder = fso.GetFolder(currentFolderPath)
' ファイルを処理
For Each file In folder.Files
' ここでファイル情報をExcelに書き出す処理
Debug.Print file.Path
Next file
' サブフォルダを処理
For Each subFolder In folder.SubFolders
ProcessFolder subFolder.Path ' 再帰呼び出し
Next subFolder
Set fso = Nothing
Set folder = Nothing
Set subFolder = Nothing
Set file = Nothing
End Sub
' メインルーチンから呼び出す
Sub GetFileListRecursive()
Dim startPath As String
startPath = "C:\Users\YourUsername\Documents\TestFolder" ' 開始フォルダパス
ProcessFolder startPath
MsgBox "再帰処理によるファイル一覧取得が完了しました。", vbInformation
End Sub
この再帰処理を実装することで、複雑なフォルダ構造を持つデータでも、網羅的にファイル情報を収集することが可能になります。
ADVERTISEMENT
まとめ
この記事では、Excel VBAのFileSystemObjectを使用して、指定したフォルダ内のファイル一覧を取得し、Excelシートに書き出す方法を解説しました。
FileSystemObjectを活用することで、ファイルパスの指定、セキュリティ警告への対処、エラーハンドリングの追加、取得情報の拡張、そして再帰処理によるサブフォルダ内のファイル取得まで、様々なレベルでファイル管理を自動化できます。
このVBAコードを基に、ご自身の業務に合わせてパスや取得項目をカスタマイズし、ファイル管理の効率化に役立ててください。
ADVERTISEMENT
超解決 Excel・Word研究班
企業のDX支援や業務効率化を専門とする技術者チーム。20年以上のExcel・Word運用改善実績に基づき、不具合の根本原因と最短の解決策を監修しています。ExcelとWordを使った「やりたいこと」「困っていること」「より便利な使い方」をクライアントの視点で丁寧に提供します。
Office・仕事術の人気記事ランキング
- 【Word】差し込み印刷で数字の桁を整える!金額にカンマ(桁区切り)を入れる設定
- 【Teams】メッセージを「保存済み」にして後で読む!重要なチャットをブックマークして整理する技
- 【Outlook】宛先が「オートコンプリート」に出ない・間違っている時の修正手順|履歴の削除と再構築
- 【Excel】矢印キーで「セルが動かず画面がスクロールする」!ScrollLockの解除方法(ノートPC対応)
- 【Outlook】メールの受信が数分遅れる!リアルタイムで届かない時の同期設定と送受信グループ設定
- 【Outlook】予定表の「祝日」が表示されない!最新カレンダーの追加と二重表示の修正手順
- 【Outlook】「メール送信を5分遅らせる」設定!誤送信を防ぐ最強のディレイ機能
- 【Word】校閲機能の基本!赤字(変更履歴)とコメントで修正を見える化する
- 【神技】保存せずに閉じたExcel・Wordファイルを復元する!消えたデータを復活させる4つの救出法
- 【Excel】文字がセルの枠からはみ出す・隠れる!「折り返して表示」と「縮小して全体を表示」の使い分け
