Categories: excel

VBAでフォルダ内のファイル名を一括取得する方法|初心者でも簡単に実装できるサンプル付き解説

Excelで作業をしていると、特定のフォルダ内にあるファイル名を一覧として取得したいという場面があります。たとえば、日報や売上ファイルなど、毎日自動で保存されるデータの管理には、フォルダ内のファイル名を一覧化することで、作業効率が大きく向上します。
本記事では、VBA(Visual Basic for Applications)を使用して、指定したフォルダ内のファイル名を簡単に取得する方法を解説します。初心者でもすぐに使える実用的なコード例を紹介しながら、応用方法や注意点についても触れていきます。


VBAでフォルダ内のファイル一覧を取得する基本的な考え方

VBAでフォルダ内のファイル名を取得するには、「Dir関数」とループ処理を組み合わせて使用します。Dir関数は、指定されたパスにあるファイルやフォルダの名前を取得することができる関数です。

基本的な流れは以下のとおりです。

  1. フォルダのパスを指定する
  2. Dir関数で最初のファイル名を取得する
  3. ループ処理で次のファイル名を順次取得していく
  4. すべてのファイル名を取得し終えたらループを終了する

この仕組みを理解しておけば、さまざまな応用が可能になります。


フォルダ内のすべてのファイル名を取得するVBAコード例

以下は、指定フォルダ内にあるすべてのファイル名をExcelのシートに一覧として表示するVBAコードです。

Sub GetFileNames()

Dim folderPath As String
Dim fileName As String
Dim row As Long

' フォルダのパスを指定(最後に「\」を忘れずに)
folderPath = "C:\Users\YourName\Documents\TestFolder\"

' 最初のファイルを取得
fileName = Dir(folderPath & "*.*")

row = 1

Do While fileName <> ""
' シートにファイル名を書き出し
Cells(row, 1).Value = fileName

' 次のファイル名を取得
fileName = Dir()

row = row + 1
Loop

MsgBox "ファイル名の取得が完了しました。", vbInformation

End Sub

このコードのポイント

  • Dir(folderPath & "*.*") で全ファイルを対象にします。
  • Cells(row, 1).Value = fileName でA列にファイル名を書き込みます。
  • Dir() を繰り返し呼び出すことで、次のファイル名を取得しています。

サブフォルダも含めてファイル名を取得する方法

上記のコードは、指定したフォルダ内の「直下」のファイルのみを取得します。
サブフォルダ内のファイルも含めて一覧にしたい場合は、「再帰処理」を使ってサブフォルダにもアクセスします。

Sub GetAllFilesWithSubFolders()

Dim folderPath As String
folderPath = "C:\Users\YourName\Documents\TestFolder\"

Cells.ClearContents
GetFilesRecursive folderPath, 1

MsgBox "すべてのファイルを取得しました。", vbInformation

End Sub

Sub GetFilesRecursive(ByVal path As String, ByRef row As Long)

Dim fileName As String
Dim subFolder As String
Dim fso As Object
Dim folder As Object
Dim subFolders As Object
Dim subFolderItem As Object

Set fso = CreateObject("Scripting.FileSystemObject")
Set folder = fso.GetFolder(path)

' ファイルの取得
For Each fileName In folder.Files
Cells(row, 1).Value = fileName.Name
Cells(row, 2).Value = fileName.Path
row = row + 1
Next fileName

' サブフォルダに対して再帰呼び出し
Set subFolders = folder.SubFolders
For Each subFolderItem In subFolders
GetFilesRecursive subFolderItem.Path, row
Next subFolderItem

End Sub

この方法を使えば、サブフォルダの中にあるすべてのファイルも漏れなく取得できます。


フィルターをかけて特定のファイルだけ取得する

たとえば「.xlsx」のファイルだけを取得したい場合は、以下のように記述を変更します。

fileName = Dir(folderPath & "*.xlsx")

また、拡張子を変数にしておけば、柔軟に他の種類のファイルにも対応できます。

vbaコピーする編集するDim ext As String
ext = "*.pdf"
fileName = Dir(folderPath & ext)

エラー処理とユーザー入力の追加

より実用的なスクリプトにするには、以下のような工夫を加えるとよいでしょう。

  • ユーザーがフォルダを選べるようにする(FileDialogを使う)
  • 空のフォルダだった場合のメッセージ
  • 実行前にシートを初期化するなどの前処理

フォルダ選択付きの例

Sub GetFilesWithFolderDialog()

Dim folderPath As String
Dim fileName As String
Dim row As Long
Dim fd As FileDialog

Set fd = Application.FileDialog(msoFileDialogFolderPicker)

If fd.Show = -1 Then
folderPath = fd.SelectedItems(1) & "\"
Else
MsgBox "キャンセルされました。", vbExclamation
Exit Sub
End If

fileName = Dir(folderPath & "*.*")
row = 1

Cells.ClearContents

Do While fileName <> ""
Cells(row, 1).Value = fileName
fileName = Dir()
row = row + 1
Loop

MsgBox "ファイル一覧を取得しました。", vbInformation

End Sub

まとめ

VBAを使えば、フォルダ内のファイル名を簡単に一覧化することができます。今回紹介したコードは、定期的な作業やファイル管理の効率化に大いに役立ちます。

ポイントを振り返ると次の通りです。

  • Dir関数を使って簡単にファイル名を取得できる
  • サブフォルダも含める場合は再帰処理が有効
  • フィルターをかければ特定のファイルだけ取得可能
  • FileDialogで操作性を向上できる

日々のExcel作業の効率化に、ぜひ今回のVBAスクリプトを取り入れてみてください。ファイルの整理や集計作業が格段にラクになります。

upandup

Web制作の記事を中心に、暮らし、ビジネスに役立つ情報を発信します。 アフィリエイトにも参加しています。よろしくお願いいたします。