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