Excelで作業をしていると、特定のフォルダ内にあるファイル名を一覧として取得したいという場面があります。たとえば、日報や売上ファイルなど、毎日自動で保存されるデータの管理には、フォルダ内のファイル名を一覧化することで、作業効率が大きく向上します。
本記事では、VBA(Visual Basic for Applications)を使用して、指定したフォルダ内のファイル名を簡単に取得する方法を解説します。初心者でもすぐに使える実用的なコード例を紹介しながら、応用方法や注意点についても触れていきます。
VBAでフォルダ内のファイル一覧を取得する基本的な考え方
VBAでフォルダ内のファイル名を取得するには、「Dir
関数」とループ処理を組み合わせて使用します。Dir
関数は、指定されたパスにあるファイルやフォルダの名前を取得することができる関数です。
基本的な流れは以下のとおりです。
- フォルダのパスを指定する
Dir
関数で最初のファイル名を取得する- ループ処理で次のファイル名を順次取得していく
- すべてのファイル名を取得し終えたらループを終了する
この仕組みを理解しておけば、さまざまな応用が可能になります。
フォルダ内のすべてのファイル名を取得する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スクリプトを取り入れてみてください。ファイルの整理や集計作業が格段にラクになります。