【VBAリファレンス】VBAサンプル集エクセルでファイル一覧を作成.№1(概要)

スポンサーリンク

概要

Excel VBAを活用して、指定したフォルダ内のファイル一覧を自動で作成するテクニックは、多くのビジネスシーンで業務効率化に貢献します。例えば、毎日のように更新される報告書フォルダ、プロジェクトごとの資料が格納されたフォルダ、あるいはバックアップ用のファイル群など、その都度手作業でファイル名をリストアップするのは非常に手間のかかる作業です。このVBAサンプル集では、そのような煩雑な作業を数クリックで完了させるための、実践的かつ汎用性の高いコードを紹介していきます。

本記事「VBAサンプル集エクセルでファイル一覧を作成.№1(概要)」では、まずファイル一覧作成の基本的な考え方と、VBAで実装する上での主要な要素について解説します。具体的には、対象フォルダの指定方法、フォルダ内のファイルを取得する仕組み、そして取得したファイル情報をExcelシートに書き出すプロセスに焦点を当てます。この概要編を理解することで、読者の皆様はVBAによるファイル一覧作成の全体像を把握し、続く詳細解説編や応用編へとスムーズに進むことができるでしょう。

Excel VBAは、Microsoft Officeアプリケーションの自動化に特化したプログラミング言語であり、特別な開発環境を必要とせず、Excelがインストールされていればすぐに利用を開始できます。ファイル操作に関するVBAの機能は非常に豊富で、ファイルやフォルダの検索、コピー、移動、削除といった基本的な操作はもちろん、ファイルの内容を読み書きする高度な処理も可能です。今回ご紹介するファイル一覧作成も、これらのファイル操作機能の応用例と言えます。

ファイル一覧を作成する目的は多岐にわたります。
* **管理・棚卸し:** フォルダ内のファイル数や種類を把握し、不要なファイルの削除や整理に役立てる。
* **報告:** 特定の期間に作成・更新されたファイルをリストアップし、関係者に報告する。
* **検索・参照:** 大量のファイルの中から特定のファイルを探しやすくするためのインデックスとして利用する。
* **バックアップ管理:** バックアップ対象のファイルリストを作成し、漏れがないか確認する。
* **データ分析:** ファイル名に含まれる情報(日付、プロジェクト名など)を分析するための元データとする。

これらの目的を達成するために、VBAは強力なツールとなります。手作業で行う場合、ファイル名や更新日時などの情報を一つ一つコピー&ペーストするのはミスも発生しやすく、時間もかかります。VBAを使えば、これらの作業を正確かつ迅速に自動化できます。

本シリーズでは、まず最も基本的な「指定フォルダ内の全ファイル名を取得してExcelシートに一覧化する」という処理を解説します。この基本形をマスターすれば、ファイル名だけでなく、更新日時、ファイルサイズ、ファイルパスといった追加情報も取得できるようになり、さらに多様なニーズに対応できるようになります。

ファイル一覧作成のVBAコードを記述する上で、中心となるのは以下の要素です。

1. **対象フォルダの指定:** ユーザーにフォルダを選択させるか、コード内で直接パスを指定します。
2. **ファイル情報の取得:** `FileSystemObject`(FSO)や`Dir`関数といったVBAの機能を用いて、指定したフォルダ内のファイルやサブフォルダを列挙します。
3. **Excelシートへの出力:** 取得したファイル名やその他の情報を、Excelのワークシートのセルに書き込んでいきます。

これらの要素を組み合わせることで、目的とするファイル一覧表が完成します。概要編では、これらの各要素がどのような役割を果たすのか、そして全体としてどのように連携して機能するのかを、概念的に理解することを目的とします。続く詳細解説編では、具体的なVBAコードを提示しながら、各ステップの実装方法を掘り下げていきます。

このVBAサンプル集が、皆様のExcel業務におけるファイル管理の効率化、ひいては生産性向上の一助となれば幸いです。まずは、この概要編で全体像を掴み、次のステップへと進んでいきましょう。

詳細解説

Excel VBAでファイル一覧を作成する処理は、大きく分けて「対象フォルダの特定」「フォルダ内のファイル列挙」「Excelシートへの書き込み」の3つのステップで構成されます。ここでは、これらの各ステップについて詳細に解説します。

1. 対象フォルダの特定

ファイル一覧を作成するためには、まずどのフォルダを対象とするかを決定する必要があります。VBAで対象フォルダを指定する方法はいくつかあります。

* **コード内に直接パスを指定する:** 最も簡単な方法です。VBAエディター上で、`Const TargetFolder As String = “C:\Users\YourName\Documents\TargetFolder”` のように、対象フォルダのパスを直接文字列として変数に格納します。この方法の利点はシンプルであることですが、フォルダパスが変わるたびにコードを修正する必要があるという欠点があります。

* **ユーザーにフォルダを選択させる:** より汎用性の高い方法として、ユーザーにフォルダ選択ダイアログを表示させ、その場で対象フォルダを選んでもらう方法があります。これには、`Application.FileDialog(msoFileDialogFolderPicker)` オブジェクトを利用します。この方法であれば、コードを変更することなく、様々なフォルダに対してファイル一覧を作成できます。

* **アクティブシートのパスを基準にする:** Excelファイルが保存されているフォルダを基準にしたい場合、`ActiveWorkbook.Path` プロパティを利用することも可能です。ただし、これはExcelファイル自体が保存されているフォルダであり、必ずしもファイル一覧を作成したいフォルダとは限りません。

実務においては、ユーザーにフォルダを選択させる方法が最も柔軟で推奨されます。

2. フォルダ内のファイル列挙

対象フォルダが特定できたら、次にそのフォルダ内にあるファイル(およびサブフォルダ)を列挙する処理を行います。VBAでファイル列挙を行うには、主に以下の2つの方法があります。

* **`FileSystemObject` (FSO) を利用する方法:**
`FileSystemObject` は、ファイルやフォルダの操作に特化したCOMオブジェクトです。COMオブジェクトを利用するためには、VBAエディターの「ツール」メニューから「参照設定」を選択し、「Microsoft Scripting Runtime」にチェックを入れる必要があります。
FSOを使用すると、`GetFolder` メソッドでフォルダオブジェクトを取得し、そのフォルダオブジェクトの`Files`コレクションをループ処理することで、フォルダ内の各ファイルオブジェクトにアクセスできます。各ファイルオブジェクトは、`Name`(ファイル名)、`Path`(フルパス)、`DateLastModified`(更新日時)、`Size`(ファイルサイズ)などのプロパティを持っています。
また、`SubFolders`コレクションをループ処理することで、サブフォルダも再帰的に処理することが可能です。

* **`Dir` 関数を利用する方法:**
`Dir` 関数は、指定したパスに一致するファイル名を取得するVBAの組み込み関数です。最初に`Dir(“対象フォルダ\*.*”)`のように呼び出すと、最初のファイル名が返されます。その後、引数なしで`Dir()`を呼び出すと、次のファイル名が順番に返されます。ファイルが見つからなくなると、空文字列(””)が返されるため、それをループの終了条件とします。
`Dir` 関数は、ワイルドカード(`*`や`?`)を使用して特定の条件に一致するファイルのみを列挙することも可能です。例えば、`*.xlsx` と指定すればExcelファイルのみを対象にできます。
`Dir` 関数はFSOに比べて手軽に利用できますが、ファイルサイズや更新日時といった詳細な情報は直接取得できず、別途`FileDateTime`関数や`FileLen`関数などを組み合わせて取得する必要があります。

どちらの方法も一長一短がありますが、ファイル名だけでなく、更新日時やサイズなどの詳細情報もまとめて取得したい場合は、`FileSystemObject` の利用がより効率的で推奨されます。

3. Excelシートへの書き込み** 列挙したファイル情報をExcelシートに書き込んでいきます。このステップでは、以下の処理を行います。 * **シートの準備:** ファイル一覧を出力するワークシートを準備します。必要に応じて、既存のシートをクリアしたり、新しいシートを作成したりします。 * **ヘッダー行の作成:** ファイル名、更新日時、サイズなどの列見出し(ヘッダー)を1行目に書き込みます。 * **データ行の書き込み:** 列挙した各ファイルの情報(ファイル名、更新日時、サイズなど)を、ヘッダー行に続く行に順番に書き込んでいきます。 * **書式設定:** 必要に応じて、日付の表示形式を変更したり、列幅を調整したりして、見やすい表に整形します。 シートへの書き込みは、通常、ループ処理の中で行われます。取得したファイル情報を格納するための変数を用意しておき、ループの各イテレーションでその変数の値をシートのセルに代入していきます。例えば、1行目にヘッダーを書き込んだ後、2行目から順にファイル情報を書き込む場合、行番号を管理する変数(例: `rowNum = 2`)を用意し、ファイル情報を書き込むたびにインクリメント(`rowNum = rowNum + 1`)していくのが一般的な手法です。 これらの3つのステップを組み合わせることで、Excel VBAによるファイル一覧作成の基本的な処理が完成します。概要編では、これらの各要素の役割と連携について理解を深めることを目指しました。 サンプルコード

ここでは、「指定したフォルダ内の全ファイル名を取得し、Excelシートに一覧化する」という基本的な処理を実現するVBAサンプルコードを紹介します。このコードは、`FileSystemObject`(FSO)を利用してファイル情報を取得し、アクティブシートに書き出すものです。

Sub CreateFileList()

Dim fso As Object
Dim targetFolder As Object
Dim fileItem As Object
Dim folderPath As String
Dim ws As Worksheet
Dim rowNum As Long

‘ 1. 対象フォルダの指定
‘ ここでは、ユーザーにフォルダを選択させるダイアログを表示します。
With Application.FileDialog(msoFileDialogFolderPicker)
.Title = “ファイル一覧を作成したいフォルダを選択してください”
.AllowMultiSelect = False
If .Show <> -1 Then
MsgBox “フォルダが選択されませんでした。処理を中止します。”, vbExclamation
Exit Sub
End If
folderPath = .SelectedItems(1)
End With

‘ FSOオブジェクトを作成
Set fso = CreateObject(“Scripting.FileSystemObject”)

‘ 指定されたフォルダが存在するか確認
If Not fso.FolderExists(folderPath) Then
MsgBox “指定されたフォルダが見つかりません: ” & folderPath, vbCritical
Set fso = Nothing
Exit Sub
End If

‘ 対象フォルダオブジェクトを取得
Set targetFolder = fso.GetFolder(folderPath)

‘ 2. Excelシートの準備
‘ アクティブシートを対象とします。必要に応じて、新しいシートを作成したり、
‘ 特定のシートを指定したりすることも可能です。
Set ws = ThisWorkbook.ActiveSheet

‘ 既存のデータをクリア (必要に応じて)
ws.Cells.ClearContents

‘ ヘッダー行を作成
ws.Cells(1, 1).Value = “ファイル名”
ws.Cells(1, 2).Value = “更新日時”
ws.Cells(1, 3).Value = “ファイルサイズ (KB)”
ws.Cells(1, 4).Value = “フルパス”

‘ ヘッダー行の書式設定 (例: 太字)
ws.Range(“A1:D1”).Font.Bold = True

‘ 書き込み開始行を設定
rowNum = 2

‘ 3. フォルダ内のファイル列挙とシートへの書き込み
‘ FileSystemObjectのFilesコレクションをループ処理します。
If targetFolder.Files.Count > 0 Then
For Each fileItem In targetFolder.Files
‘ ファイル名
ws.Cells(rowNum, 1).Value = fileItem.Name
‘ 更新日時
ws.Cells(rowNum, 2).Value = fileItem.DateLastModified
‘ ファイルサイズ (バイト単位で取得されるため、KBに変換)
ws.Cells(rowNum, 3).Value = Round(fileItem.Size / 1024, 2)
‘ フルパス
ws.Cells(rowNum, 4).Value = fileItem.Path

‘ 次の行へ
rowNum = rowNum + 1
Next fileItem
Else
‘ ファイルが存在しない場合
ws.Cells(rowNum, 1).Value = “このフォルダにはファイルがありません。”
End If

‘ 列幅を自動調整
ws.Columns(“A:D”).AutoFit

‘ メッセージ表示
MsgBox “ファイル一覧の作成が完了しました。”, vbInformation

‘ オブジェクトの解放
Set fileItem = Nothing
Set targetFolder = Nothing
Set fso = Nothing
Set ws = Nothing

End Sub

**コードの解説:**

1. **変数宣言:**
* `fso`: `FileSystemObject` を格納するための変数。
* `targetFolder`: 対象となるフォルダオブジェクトを格納するための変数。
* `fileItem`: フォルダ内の各ファイルオブジェクトをループで取得するための変数。
* `folderPath`: ユーザーが選択したフォルダのパスを格納する文字列変数。
* `ws`: 書き込み対象のワークシートオブジェクトを格納するための変数。
* `rowNum`: Excelシートにデータを書き込む行番号を管理するための変数。

2. **対象フォルダの指定:**
* `Application.FileDialog(msoFileDialogFolderPicker)` を使用して、フォルダ選択ダイアログを表示します。
* `.Show` メソッドでダイアログが表示され、ユーザーが「OK」を選択すると `-1` を返します。キャンセルされた場合は、`Exit Sub` で処理を終了します。
* `.SelectedItems(1)` で選択されたフォルダのパスを取得し、`folderPath` 変数に格納します。

3. **`FileSystemObject` の準備:**
* `Set fso = CreateObject(“Scripting.FileSystemObject”)` で `FileSystemObject` のインスタンスを作成します。これにより、ファイルやフォルダを操作するためのメソッドやプロパティが利用可能になります。
* `fso.FolderExists(folderPath)` で、指定されたフォルダパスが存在するかどうかを確認します。存在しない場合はエラーメッセージを表示して終了します。
* `Set targetFolder = fso.GetFolder(folderPath)` で、指定されたフォルダの `Folder` オブジェクトを取得します。

4. **Excelシートの準備:**
* `Set ws = ThisWorkbook.ActiveSheet` で、現在アクティブなワークシートを対象とします。
* `ws.Cells.ClearContents` で、シート上の既存のデータをすべて削除します。これは、毎回新しい一覧を作成する場合に便利です。
* 1行目に「ファイル名」「更新日時」「ファイルサイズ (KB)」「フルパス」というヘッダーを書き込みます。
* `ws.Range(“A1:D1”).Font.Bold = True` で、ヘッダー行を太字に設定し、見やすくします。
* `rowNum = 2` で、データ書き込みを開始する行番号を2に設定します。

5. **ファイル列挙と書き込み:**
* `targetFolder.Files.Count > 0` で、フォルダ内にファイルが存在するかどうかを確認します。
* `For Each fileItem In targetFolder.Files` ループで、フォルダ内の各ファイルオブジェクトを順番に取得します。
* ループ内で、`fileItem` オブジェクトのプロパティ(`Name`, `DateLastModified`, `Size`, `Path`)を取得し、対応するExcelシートのセルに書き込みます。
* `fileItem.Size` はバイト単位で取得されるため、`Round(fileItem.Size / 1024, 2)` を使用してキロバイト(KB)に変換し、小数点以下2桁で丸めて表示しています。
* `rowNum = rowNum + 1` で、次のファイルのために行番号を1つ増やします。
* フォルダ内にファイルがない場合は、「このフォルダにはファイルがありません。」というメッセージをセルに表示します。

6. **後処理:**
* `ws.Columns(“A:D”).AutoFit` で、書き込んだデータに合わせて列幅を自動調整します。
* 完了メッセージを表示します。
* `Set … = Nothing` で、使用したオブジェクト変数を解放します。これは、メモリリークを防ぐための良い習慣です。

このサンプルコードを実行すると、指定したフォルダのファイル一覧がアクティブシートに作成されます。

実務アドバイス

このVBAサンプルコードは、ファイル一覧作成の基本を網羅していますが、実務で活用する際には、さらにいくつかの点を考慮すると、より便利で堅牢なコードになります。

* **エラーハンドリングの強化:**
現在、フォルダが存在しない場合のエラー処理は行われていますが、例えば、ファイルにアクセス権がない場合や、ファイル名が長すぎてExcelのセルに収まらない場合など、予期せぬエラーが発生する可能性があります。`On Error Resume Next` や `On Error GoTo` ステートメントを使用して、これらのエラーを適切に処理することで、コードの安定性を向上させることができます。例えば、アクセス権のないファイルはスキップしたり、エラーメッセージを表示したりするなどの対応が考えられます。

* **サブフォルダの処理:**
多くのビジネスシーンでは、ファイルは特定のフォルダだけでなく、その中のサブフォルダにも格納されています。このサンプルコードは指定されたフォルダ直下のファイルのみを対象としていますが、サブフォルダ内のファイルも一覧に含めたい場合は、再帰処理を実装する必要があります。`FileSystemObject` の `SubFolders` コレクションを利用して、サブフォルダを辿りながらファイルを取得するロジックを追加します。

* **ファイルの種類によるフィルタリング:**
例えば、「Excelファイルのみ」「PDFファイルのみ」など、特定の拡張子のファイルだけを一覧にしたい場合があります。`Dir` 関数ではワイルド

タイトルとURLをコピーしました