はじめに:手作業はもうやめよう!VBAでファイル一覧を自動作成
日々の業務で、特定のフォルダにあるファイル名をExcelに一覧としてまとめたい、と思ったことはありませんか? 手作業でファイル名をコピー&ペーストしていると、時間もかかる上にミスも発生しがちです。特にファイル数が多い場合や、定期的に更新が必要な場合は、その手間は計り知れません。
こんなお悩みありませんか?
- 大量のファイル名をExcelに転記するのが面倒…
- サブフォルダ内のファイル名まで含めて一覧にしたいけど、どうすればいい?
- 毎回手作業でリストを作成しているが、もっと効率化したい!
本記事で得られること
この記事では、Excel VBA(Visual Basic for Applications)を使って、指定したフォルダ内のファイル名を自動でExcelシートに一覧表示する方法を、初級者の方にも分かりやすく解説します。基本のコードから、サブフォルダ内のファイルも対象にする応用編まで、具体的なサンプルコードを交えてご紹介するので、ぜひあなたの業務に役立ててください!
VBA実行前の準備:開発タブの表示とVBEの起動
VBAを記述・実行するためには、いくつかの準備が必要です。
開発タブの表示
Excelのリボンに「開発」タブが表示されていない場合は、以下の手順で表示させます。
- 「ファイル」タブをクリックし、「オプション」を選択します。
- 「Excelのオプション」ダイアログで「リボンのユーザー設定」を選択します。
- 右側の「メインタブ」リストから「開発」のチェックボックスをオンにして「OK」をクリックします。
標準モジュールの挿入
VBAコードを記述するための場所(VBE: Visual Basic Editor)を開き、標準モジュールを挿入します。
- 「開発」タブをクリックし、「Visual Basic」をクリックしてVBEを起動します。(または
Alt + F11キー) - VBEのメニューバーから「挿入」→「標準モジュール」を選択します。
- 新しく表示された真っ白なウィンドウ(コードウィンドウ)にVBAコードを記述していきます。
【基本編】指定フォルダ直下のファイル名を一覧表示するVBAコード
まずは、指定したフォルダの直下にあるファイル名だけを一覧表示する基本的なVBAコードから見ていきましょう。
サンプルコード
Sub GetFileListBasic()
Dim folderPath As String
Dim fileName As String
Dim rowNum As Long
' ★ファイルを取得したいフォルダのパスを指定してください
folderPath = "C:\Users\YourUser\Documents\MyFiles\" ' 例: "C:\Users\〇〇\デスクトップ\テストフォルダ\"
' もしフォルダパスの最後に「\」がなければ追加する
If Right(folderPath, 1) <> "\" Then
folderPath = folderPath & "\"
End If
' 出力開始行を設定
rowNum = 1
' ヘッダーを書き込む
Sheets(1).Cells(rowNum, 1).Value = "ファイル名"
Sheets(1).Cells(rowNum, 2).Value = "フルパス"
rowNum = rowNum + 1
' 最初のファイル名を取得
fileName = Dir(folderPath & "*.*")
' ファイルが存在する間ループ
Do While fileName <> ""
' Excelシートにファイル名とフルパスを出力
Sheets(1).Cells(rowNum, 1).Value = fileName
Sheets(1).Cells(rowNum, 2).Value = folderPath & fileName
rowNum = rowNum + 1
' 次のファイル名を取得
fileName = Dir()
Loop
' 列の幅を自動調整
Sheets(1).Columns("A:B").AutoFit
MsgBox "ファイル名の一覧作成が完了しました!", vbInformation
End Sub
コード解説
folderPath = "C:\Users\YourUser\Documents\MyFiles\": ここに、ファイル名を一覧にしたいフォルダのパスを記述します。ご自身の環境に合わせて変更してください。Dir(folderPath & "*.*"):Dir関数は、指定したパスにあるファイルやフォルダを検索します。"*.*"は全てのファイル(拡張子問わず)を意味します。最初のDir関数で最初のファイル名を取得し、以降は引数なしのDir()で次のファイル名を取得します。Do While fileName <> "" ... Loop: ファイル名が取得できる間(つまりファイルが存在する間)処理を繰り返します。Sheets(1).Cells(rowNum, 1).Value = fileName: アクティブなブックの1番目のシート(Sheets(1))の指定した行(rowNum)と列(1列目)にファイル名を出力します。Sheets(1).Columns("A:B").AutoFit: 出力したデータの列幅を自動調整し、見やすくします。
マクロの実行方法
- VBEのコードウィンドウに上記のコードを貼り付けます。
- コード内の
folderPathをご自身の環境に合わせて変更します。 - Excelシートに戻り、「開発」タブの「マクロ」をクリックします。
- 「マクロ」ダイアログボックスで
GetFileListBasicを選択し、「実行」をクリックします。
すると、シート1に指定フォルダ直下のファイル名とフルパスが一覧表示されるはずです。
【応用編】サブフォルダ内のファイルもまとめて一覧表示するVBAコード
次に、サブフォルダ内にあるファイルも全て一覧に含める方法です。ここではFileSystemObject (FSO)というオブジェクトを使って、より柔軟なファイル操作を行います。
FileSystemObject (FSO) とは?
FSOは、フォルダやファイルの作成、移動、削除、そして内容の取得など、ファイルシステムに関する様々な操作を行うためのオブジェクトです。VBA標準のDir関数よりも高機能で、再帰的な処理(サブフォルダを次々に辿っていく処理)にも向いています。
サンプルコード
Dim ws As Worksheet
Dim lastRow As Long
Sub GetFileListAdvanced()
Dim fso As Object ' FileSystemObject
Dim folderPath As String
' ★ファイルを取得したいフォルダのパスを指定してください
folderPath = "C:\Users\YourUser\Documents\MyFiles\" ' 例: "C:\Users\〇〇\デスクトップ\テストフォルダ\"
' 出力シートをセット
Set ws = ThisWorkbook.Sheets(1)
' 既存のデータをクリア(必要であれば)
ws.Cells.ClearContents
' ヘッダーを書き込む
ws.Cells(1, 1).Value = "ファイル名"
ws.Cells(1, 2).Value = "フォルダパス"
ws.Cells(1, 3).Value = "フルパス"
lastRow = 1 ' データ開始行を初期化
' FileSystemObjectを生成
Set fso = CreateObject("Scripting.FileSystemObject")
' 指定フォルダが存在するかチェック
If fso.FolderExists(folderPath) Then
' メインの処理を実行
Call ListFilesInFolder(fso.GetFolder(folderPath))
MsgBox "ファイル名の一覧作成が完了しました!", vbInformation
Else
MsgBox "指定されたフォルダが見つかりません。パスを確認してください。", vbExclamation
End If
' 列の幅を自動調整
ws.Columns("A:C").AutoFit
' オブジェクトを解放
Set fso = Nothing
Set ws = Nothing
End Sub
' サブフォルダを再帰的に検索する関数
Private Sub ListFilesInFolder(ByVal targetFolder As Object)
Dim subFolder As Object
Dim fileItem As Object
' 現在のフォルダ内のファイルを処理
For Each fileItem In targetFolder.Files
lastRow = lastRow + 1
ws.Cells(lastRow, 1).Value = fileItem.Name
ws.Cells(lastRow, 2).Value = targetFolder.Path
ws.Cells(lastRow, 3).Value = fileItem.Path
Next fileItem
' サブフォルダを再帰的に処理
For Each subFolder In targetFolder.SubFolders
Call ListFilesInFolder(subFolder)
Next subFolder
End Sub
コード解説
Dim fso As Object:FileSystemObjectを格納するための変数を宣言します。Set fso = CreateObject("Scripting.FileSystemObject"):FileSystemObjectのインスタンスを生成します。ws.Cells.ClearContents: マクロを実行するたびに、シートの既存データを一度クリアします。Call ListFilesInFolder(fso.GetFolder(folderPath)):ListFilesInFolderというカスタム関数を呼び出します。この関数が再帰的に(自分自身を呼び出しながら)サブフォルダを探索します。For Each fileItem In targetFolder.Files: 現在処理しているフォルダ内の全てのファイルをループで処理します。fileItem.Nameでファイル名、fileItem.Pathでファイルのフルパスを取得できます。For Each subFolder In targetFolder.SubFolders ... Call ListFilesInFolder(subFolder): 現在処理しているフォルダ内のサブフォルダをループし、それぞれのサブフォルダに対して再度ListFilesInFolder関数を呼び出します。これが「再帰処理」と呼ばれるもので、サブフォルダの奥深くまでファイルを検索できます。
さらに便利に!応用TIPS
ファイルパスやシート名を変更可能にする
毎回コードを編集しなくても良いように、ファイルパスをExcelシート上のセルに入力させたり、出力先のシート名を指定できるようにすると便利です。
' 例: A1セルにフォルダパス、B1セルに出力シート名を入力
folderPath = ThisWorkbook.Sheets("設定").Range("A1").Value
Set ws = ThisWorkbook.Sheets(ThisWorkbook.Sheets("設定").Range("B1").Value)
特定の拡張子のみを抽出する
例えば、PDFファイルだけを抽出したい場合は、fileItem.TypeやfileItem.Extensionプロパティを使って条件分岐を追加します。
' ListFilesInFolder関数内
For Each fileItem In targetFolder.Files
' PDFファイルのみを抽出する場合
If LCase(fileItem.Extension) = "pdf" Then
lastRow = lastRow + 1
ws.Cells(lastRow, 1).Value = fileItem.Name
ws.Cells(lastRow, 2).Value = targetFolder.Path
ws.Cells(lastRow, 3).Value = fileItem.Path
End If
Next fileItem
まとめ:VBAでファイル管理を効率化しよう
本記事では、Excel VBAを使ってフォルダ内のファイル名を一覧表示する方法を、基本編と応用編に分けて解説しました。手作業では時間と手間がかかる作業も、VBAを活用すれば一瞬で完了させることができます。
Dir関数を使えば、指定フォルダ直下のファイル名を手軽に取得できます。FileSystemObjectと再帰処理を使えば、サブフォルダ内のファイルも含めて網羅的に一覧化できます。
これらのマクロは、ファイル整理、バックアップ管理、データ分析の前処理など、様々な場面で役立つはずです。ぜひ今回のコードを参考に、ご自身の業務に合わせてカスタマイズし、さらなる業務効率化を目指してください!


コメント