Excel VBAでフォルダ内のファイル一覧を取得する方法をお探しですね。

広告

Excel VBAでフォルダ内のファイルを一括処理する方法【初心者向け完全ガイド】

Excel VBAで大量のファイルを扱うとき、「フォルダの中にあるファイル名を一覧にしたい」「Excelファイルを1つずつ開いて同じ作業をしたい」という場面、よくありますよね。

手作業でファイルを開いて、コピーして、保存して…を繰り返していると、時間がかかるだけじゃなくて、処理し忘れや保存ミスも起きやすくなります。

この記事では、Excel VBAを使って**特定のフォルダにある全ファイル名を取得して、順番に処理する方法**を、基本から実務で使えるコツまで、わかりやすく解説していきます。

フォルダ内のファイル名を取得する2つの方法

Excel VBAでフォルダ内のファイル名を取得するには、大きく分けて2つの方法があります。

1. Dir関数を使う方法

VBAに最初から用意されている関数なので、準備が簡単で、短いコードでファイル名を取得できます。

「とりあえずファイル名の一覧がほしい」というときに便利です。

2. FileSystemObjectを使う方法

ファイルやフォルダを「オブジェクト」として扱える方法です。

ファイル名だけじゃなくて、フルパス、拡張子、作成日時、更新日時なども簡単に取得できます。

後々の拡張性を考えると、こちらの方が実務向きです。

単純に「ファイル名をセルに並べたい」だけならDir関数で十分ですが、**「後でファイルを開いて処理したい」「拡張子で分けたい」「サブフォルダにも対応したい」**という可能性があるなら、FileSystemObjectを使う方がおすすめです。

Dir関数でファイル名を取得する基本コード

まずは、Dir関数を使って、指定したフォルダ内にある「.xlsx」ファイルをアクティブシートのA列に書き出してみましょう。

Dir関数の使い方には少しクセがあって、**最初は検索条件を指定して呼び出し、2回目以降は引数なしで呼び出す**ことで、次のファイル名を取得します。

該当するファイルがなくなると空っぽの文字列(`””`)が返ってくるので、それを利用してループを回します。

“`vb
Sub フォルダ内のファイル名を取得_Dir()

Dim folderPath As String
Dim fileName As String
Dim rowNo As Long

folderPath = “C:\Sample\”
fileName = Dir(folderPath & “*.xlsx”)
rowNo = 2

Do While fileName <> “”
Cells(rowNo, 1).Value = fileName
Cells(rowNo, 2).Value = folderPath & fileName

fileName = Dir()
rowNo = rowNo + 1
Loop

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

End Sub
“`

ポイント

– **フォルダパスの末尾には「\」を付ける**
エクスプローラーからフォルダパスをコピーすると、末尾の区切り文字が付いていないことが多いです。

そのままファイル名とつなげると正しいパスにならないので注意しましょう。

– **拡張子を変えれば対象ファイルを絞り込める**
`”*.xlsx”`を`”*.csv”`や`”*.pdf”`に変えれば、対象ファイルを変更できます。

`”*.xls*”`にするとxlsx、xlsm、xlsすべてに対応できますが、想定外のファイルも引っかかる可能性があるので、厳密に処理したいときは拡張子を個別に判定する方が安全です。

FileSystemObjectで全ファイルを順番に処理する

実務で「フォルダ内のExcelファイルを順番に開いて処理する」なら、**FileSystemObject**を使う方が扱いやすいです。

FileSystemObjectは、Windowsのファイルシステムを操作するための仕組みで、ファイルを「オブジェクト」として扱えます。

参照設定で「Microsoft Scripting Runtime」を追加する方法もありますが、他のパソコンでマクロを使うことを考えると、`CreateObject`を使う方法(遅延バインディング)にしておくと共有しやすくなります。

以下のコードは、**フォルダ選択ダイアログで対象フォルダを選んで、その中のExcelファイルを1つずつ開いて処理する**基本形です。

“`vb
Sub 指定フォルダ内のExcelファイルを順番に処理()

Dim fso As Object
Dim folder As Object
Dim file As Object
Dim targetFolder As String
Dim wb As Workbook
Dim ext As String
Dim count As Long

With Application.FileDialog(msoFileDialogFolderPicker)
.Title = “処理対象のExcelファイルが入っているフォルダを選択してください”
If .Show <> -1 Then Exit Sub
targetFolder = .SelectedItems(1)
End With

Set fso = CreateObject(“Scripting.FileSystemObject”)
Set folder = fso.GetFolder(targetFolder)

Application.ScreenUpdating = False
Application.DisplayAlerts = False

For Each file In folder.Files

ext = LCase(fso.GetExtensionName(file.Name))

If (ext = “xlsx” Or ext = “xlsm” Or ext = “xls”) _
And Left(file.Name, 2) <> “~$” Then

count = count + 1
Application.StatusBar = count & “件目を処理中: ” & file.Name

Set wb = Workbooks.Open(file.Path, ReadOnly:=True)

‘ここに各ブックに対する処理を書く
‘例: Debug.Print wb.Name

wb.Close SaveChanges:=False
Set wb = Nothing

End If

Next file

Application.StatusBar = False
Application.DisplayAlerts = True
Application.ScreenUpdating = True

MsgBox count & “件の処理が完了しました。

End Sub
“`

このコードのポイント

**拡張子でフィルタリング**
xlsx、xlsm、xlsのファイルだけを対象にしています。

CSVやPDFを処理したいときは、この部分を変更すればOKです。

**一時ファイルを除外**
Excelファイルを開くと、一時的に「~$」で始まるファイルが作られます。

これを除外しておかないと、共有フォルダや作業中のフォルダでエラーになることがあります。

**処理内容は自由にカスタマイズ**
「ここに各ブックに対する処理を書く」の部分には、実際にやりたい処理を書きます。

たとえば、
– 各ブックの特定セルを集計用ブックに転記する
– 全シートをPDF化する
– CSV形式で保存し直す

といった処理ですね。

**開いたブックは必ず閉じる**
処理が終わったら必ず`Close`で閉じましょう。

保存が不要なら`SaveChanges:=False`にします。

閉じ忘れると、メモリを消費したり、次の処理で意図しないブックを参照したりする原因になります。

ファイルの並び順に注意しよう

フォルダ内のファイルを順番に処理するとき、意外と見落としやすいのが**「どの順番で取得されるのか」**という点です。

Dir関数やFileSystemObjectで取得される順番は、環境やファイルシステム、保存状態によって変わることがあります。

「なんとなくファイル名順に見える」こともありますが、業務上「必ずこの順番で処理したい」という場合は、取得された順番にそのまま頼らない方が安全です。

たとえば、「001_売上.xlsx」「002_仕入.xlsx」のように番号順で処理したいなら、いったんファイルパスを配列やリストに入れて、**並べ替えてから処理する**方法が確実です。

ファイル名順に並べ替えて処理する例

以下は、FileSystemObjectで取得したExcelファイルのフルパスを**ArrayList**に入れて、ファイル名順に並べ替えてから順番に処理する例です。

“`vb
Sub ファイル名順に並べ替えて処理()

Dim fso As Object
Dim folder As Object
Dim file As Object
Dim files As Object
Dim targetFolder As String
Dim filePath As Variant
Dim wb As Workbook
Dim ext As String
Dim count As Long

With Application.FileDialog(msoFileDialogFolderPicker)
.Title = “処理対象フォルダを選択してください”
If .Show <> -1 Then Exit Sub
targetFolder = .SelectedItems(1)
End With

Set fso = CreateObject(“Scripting.FileSystemObject”)
Set folder = fso.GetFolder(targetFolder)
Set files = CreateObject(“System.Collections.ArrayList”)

For Each file In folder.Files
ext = LCase(fso.GetExtensionName(file.Name))

If (ext = “xlsx” Or ext = “xlsm” Or ext = “xls”) _
And Left(file.Name, 2) <> “~$” Then
files.Add file.Path
End If
Next file

files.Sort

Application.ScreenUpdating = False
Application.DisplayAlerts = False

For Each filePath In files
count = count + 1
Application.StatusBar = count & “件目を処理中: ” & fso.GetFileName(filePath)

Set wb = Workbooks.Open(CStr(filePath), ReadOnly:=True)

‘ここに順番に実行したい処理を書く
‘例: ThisWorkbook.Worksheets(“集計”).Cells(count + 1, 1).Value = wb.Name

wb.Close SaveChanges:=False
Set wb = Nothing
Next filePath

Application.StatusBar = False
Application.DisplayAlerts = True
Application.ScreenUpdating = True

MsgBox “ファイル名順での処理が完了しました。

End Sub
“`

このコードでは、フルパスを`Sort`しているので、同じフォルダ内であれば実質的にファイル名順で処理されます。

もし「更新日時が古い順」「作成日時が新しい順」「ファイル名に含まれる日付順」など、業務ルールに合わせた順番が必要な場合は、**取得した情報をシートに書き出して並べ替える**方法がわかりやすいです。

ファイル名の付け方のコツ

月次ファイルや日次ファイルでは、ファイル名を**「2026-01.xlsx」のようにゼロ埋めする**と並び順が安定します。

「1月.xlsx」「10月.xlsx」「2月.xlsx」のような名前だと、文字列順では意図しない順序になってしまうので、ファイルの命名ルールも整えておくと処理が安定します。

実務で失敗しないためのエラー対策

フォルダ内の全ファイルを処理するVBAは便利ですが、実務では思わぬトラブルが起こることがあります。

よくあるトラブル

– ファイルが開けない
– 拡張子が想定と違う
– OneDriveやSharePointと同期しているファイルでパスの扱いが変わる
– 他の人がファイルを開いている
– 読み取り専用になっている
– 処理中にファイルが移動される

こういった例外的な状況を想定して、**どのファイルでエラーになったかをログとして残す**設計にしておくと、後から原因を追いやすくなります。

最低限押さえておきたい注意点

✅ フォルダパスの末尾区切りやフルパスの組み立てミスを避ける
✅ Excelの一時ファイル「~$」を処理対象から除外する
✅ 処理順が重要な場合は、取得順に依存せず明示的に並べ替える
✅ 開いたブックは処理後に必ず閉じる
✅ OneDrive、SharePoint、ネットワークドライブでは事前に動作確認する

エラー処理を入れる

エラー処理を入れる場合は、`On Error GoTo`を使って、**終了処理を必ず通す**ようにします。

`ScreenUpdating`や`DisplayAlerts`、`StatusBar`を変更したままエラーで止まると、Excelの表示や操作感が元に戻らないことがあります。

そのため、エラーが発生しても最後に設定を戻す構造にしておくと安心です。

“`vb
Sub エラー対策付きで順番に処理()

On Error GoTo ErrHandler

Application.ScreenUpdating = False
Application.DisplayAlerts = False

‘ここにファイル取得とループ処理を書く

ExitHandler:
Application.StatusBar = False
Application.DisplayAlerts = True
Application.ScreenUpdating = True
Exit Sub

ErrHandler:
MsgBox “エラーが発生しました。

” & vbCrLf & _
“番号: ” & Err.Number & vbCrLf & _
“内容: ” & Err.Description, vbExclamation
Resume ExitHandler

End Sub
“`

さらに応用するなら:一覧化してから処理する

もっと安全に処理したいなら、**取得したファイル名を一覧表として残してから処理する**方法もおすすめです。

先にファイル名、フルパス、拡張子、更新日時をシートに書き出しておけば、処理対象を目で確認できます。

処理済みフラグやエラーメッセージの列を追加すれば、どのファイルまで正常に終わったかも管理できます。

大量ファイルを扱う業務では、いきなり全件処理するよりも、**まず一覧化して、条件を確認してから実行する**方が安全です。

まとめ

Excel VBAで特定のフォルダ内にある全ファイル名を取得して、順番に処理するには、次のポイントを押さえましょう。

– **短く書きたいなら → Dir関数**
– **実務で拡張しやすく書きたいなら → FileSystemObject**

ただし、「取得できた順番で処理する」ことと「業務上必要な順番で処理する」ことは同じではありません。

処理順が重要なら、ファイル名や更新日時などの基準を明確にして、並べ替えてから処理する設計にしましょう。

ファイル名取得、拡張子判定、並べ替え、エラー処理まで押さえておけば、**複数ブックの集計、CSV変換、PDF出力**など、さまざまな定型作業を安定して自動化できます。

ぜひ実務で活用してみてください!

広告