結果をサクッというと、まず fileName = Dir(FOLDER_PATH & "*.xlsx") で最初のファイル名を取得し、次からは fileName = Dir() で順番に取り出してください。
Dir 関数は、1つのフォルダ内のファイル名取得・ワイルドカード検索・ファイル存在チェックに向いています。サブフォルダまで探す処理や、別の Dir 検索をネストする処理は、FileSystemObject を使う方が安全です。
Excel VBAで「指定したフォルダ内のファイル名をセルに出したい」「拡張子が .xlsx のファイルだけ処理したい」「ファイルが存在するか確認したい」ときは、まず Dir 関数を使うのが定番です。
結論から言うと、1つのフォルダ内でファイル名を取得する、ワイルドカードで絞り込む、ファイル存在チェックをする だけなら Dir 関数で十分です。
一方で、サブフォルダまで再帰的に探す、フォルダをネストして順番に処理する、ファイルの更新日時やサイズもまとめて扱う 場合は、FileSystemObject を使った方が安全です。

この記事では、現場でそのまま使えるコードを先に出し、その後で Dir() の意味、戻り値、ワイルドカード、attributes、注意点、FileSystemObjectとの使い分けまでまとめます。
検証・記述の前提は、Windows版ExcelのVBAです。VBA関数の仕様は2026年5月23日に Microsoft LearnのDir関数リファレンス で確認しています。実際に使うときは、サンプル内のフォルダパスを自分の環境に置き換えてください。
【 この記事の概要 】
| よく使う度 | |
| 難しさ | |
| 覚えておくと安心度 |
この記事の探し方
| 今やりたいこと | 確認する場所 |
|---|---|
| まず動くコードをコピーしたい | フォルダ内のExcelファイル名を取得する最短コード |
*.xlsx や Report_*.csv のように絞り込みたい | ワイルドカードでファイル名や拡張子を絞り込む |
Dir() の2回目以降の意味が分からない | Dir()の2回目以降と戻り値の意味 |
| フォルダ内のファイル名を一覧にしたい | フォルダ内のファイル名を取得して順番に処理する実務例 |
| ファイルがあるかどうか判定したい | ファイル存在チェックとフォルダ存在チェックを行う |
| サブフォルダまで検索したい | Dir関数はネスト・再帰処理できない |
VBA Dir関数でワイルドカード検索する基本コード
最初に、フォルダ内のExcelファイル名をシートに一覧表示するコードを載せます。 C:\サンプル\ の中から .xlsx ファイルだけを探し、Sheet1 のA列にファイル名を出力します。
Option Explicit
Sub ListXlsxFilesByDir()
Const FOLDER_PATH As String = "C:\サンプル\"
Dim ws As Worksheet
Dim fileName As String
Dim nextRow As Long
Set ws = ThisWorkbook.Worksheets("Sheet1")
ws.Range("A:A").ClearContents
ws.Range("A1").Value = "ファイル名"
nextRow = 2
fileName = Dir(FOLDER_PATH & "*.xlsx")
Do While fileName <> ""
ws.Cells(nextRow, 1).Value = fileName
nextRow = nextRow + 1
fileName = Dir()
Loop
End Subこのコードで変更する場所は、基本的に2つです。
| 変更する場所 | 例 | 意味 |
|---|---|---|
FOLDER_PATH | "C:\サンプル\" | ファイルを探すフォルダ |
"*.xlsx" | "*.csv"、"Report_*.xlsx" | 取得したいファイル名の条件 |
Dir(FOLDER_PATH & "*.xlsx") が最初の検索です。条件に一致した最初のファイル名が返ります。
次のファイル名を取るときは、引数なしで Dir() と書きます。ここが初心者の方がつまずきやすいポイントです。

フォルダ内のExcelファイル名を取得する最短コード
「とにかく最初の1件だけ分かればよい」という場合は、ループを使わずに書けます。
Option Explicit
Sub GetFirstXlsxFileName()
Const FOLDER_PATH As String = "C:\サンプル\"
Dim fileName As String
fileName = Dir(FOLDER_PATH & "*.xlsx")
If fileName <> "" Then
Worksheets("Sheet1").Range("A1").Value = fileName
Else
Worksheets("Sheet1").Range("A1").Value = "該当ファイルなし"
End If
End Sub
Dir 関数は、条件に一致するファイルが見つからないときに空文字 "" を返します。
そのため、If fileName <> "" Then と判定すれば、ファイルが見つかった場合だけ処理できます。

ワイルドカードでファイル名や拡張子を絞り込む
Dir 関数でよく使うワイルドカードは、* と ? です。
| ワイルドカード | 意味 | 例 |
|---|---|---|
* | 0文字以上の任意の文字 | *.xlsx、売上*.csv |
? | 任意の1文字 | ????.txt |

実務でよく使う指定例は次のとおりです。
| 書き方 | 取得できるファイルの例 | 使いどころ |
|---|---|---|
*.xlsx | 売上.xlsx、集計.xlsx | Excelブックだけ取得したい |
*.xls* | 売上.xlsx、マクロ.xlsm | xlsx、xlsmなどExcel系をまとめて拾いたい |
Report_*.csv | Report_202604.csv | 先頭の文字が決まっている |
*2026*.xlsx | 売上_2026_集計.xlsx | ファイル名の途中に日付や年度が入る |
????.txt | data.txt | 文字数が決まっている |
拡張子を指定してファイルを取得するコードは、先ほどの基本コードの Dir の条件を変えるだけです。
Option Explicit
Sub ListCsvFiles()
Const FOLDER_PATH As String = "C:\サンプル\"
Dim fileName As String
Dim nextRow As Long
nextRow = 2
fileName = Dir(FOLDER_PATH & "*.csv")
Do While fileName <> ""
Worksheets("Sheet1").Cells(nextRow, 1).Value = fileName
nextRow = nextRow + 1
fileName = Dir()
Loop
End Sub
"*.csv" の部分を変えれば、Excelファイル、テキストファイル、特定の接頭語を持つファイルなどを絞り込めます。
実務では「拡張子で絞る」「先頭の文字で絞る」「日付を含むファイルだけ拾う」という使い方が多いため、ワイルドカードはDir関数で最初に押さえたいポイントです。

Dir()の2回目以降と戻り値の意味
Dir 関数は、1回目と2回目以降で書き方が変わります。
| 呼び出し | 書き方 | 役割 |
|---|---|---|
| 1回目 | Dir("C:\サンプル\*.xlsx") | 検索条件を指定して、最初の一致を返す |
| 2回目以降 | Dir() | 同じ条件で、次の一致を返す |
| 一致がなくなった後 | Dir() の戻り値が "" | ループ終了の合図 |

重要なのは、Dir 関数が「前回の検索条件」を内部で覚えていることです。
だから2回目以降は、次のように引数なしで書けます。
fileName = Dir(FOLDER_PATH & "*.xlsx")
Do While fileName <> ""
Debug.Print fileName
fileName = Dir()
Loop
逆に、ループの最後で fileName = Dir() を書き忘れると、同じファイル名のままループが進まず、無限ループに近い状態になります。 Do While fileName <> "" と fileName = Dir() はセットで覚えてください。
Dir関数の構文・属性・パス指定を理解する
Dir 関数の構文はシンプルです。

Microsoft LearnのDir関数リファレンス では、Dir は指定したパターンや属性に一致するファイル名、ディレクトリ名、フォルダ名などを返す関数として説明されています。
| 引数 | 省略 | 説明 |
|---|---|---|
pathname | 可 | 探したいファイル名、フォルダ名、パス、ワイルドカードを指定する |
attributes | 可 | 読み取り専用、隠しファイル、フォルダなどの属性を指定する |
Dir関数の構文と引数
pathname には、ファイル名だけでも、フォルダパス込みでも指定できます。
'カレントフォルダから探す
Debug.Print Dir("*.xlsx")
'指定フォルダから探す
Debug.Print Dir("C:\サンプル\*.xlsx")
通常は、フォルダパス込みで指定する方が安全です。
ファイル名だけで指定すると、VBAのカレントフォルダに依存するため、想定外の場所を探してしまうことがあります。
また、Dir 関数の戻り値は「ファイル名だけ」です。フルパスではありません。
Dim folderPath As String
Dim fileName As String
Dim fullPath As String
folderPath = "C:\サンプル\"
fileName = Dir(folderPath & "*.xlsx")
If fileName <> "" Then
fullPath = folderPath & fileName
Debug.Print fullPath
End If
ファイルを開く、リンクを作る、別フォルダへコピーする場合は、folderPath & fileName のように自分で結合します。
attributesで隠しファイルやフォルダを取得する
attributes を指定すると、通常ファイル以外も取得できます。
| 定数 | 値 | 主な用途 |
|---|---|---|
vbNormal | 0 | 属性のない通常ファイル |
vbReadOnly | 1 | 読み取り専用ファイルも含める |
vbHidden | 2 | 隠しファイルも含める |
vbSystem | 4 | システムファイルも含める |
vbDirectory | 16 | フォルダも含める |
vbAlias | 64 | Macintoshのエイリアス用 |
複数の属性を含めたい場合は、Or でつなぎます。
fileName = Dir("C:\サンプル\*.*", vbHidden Or vbReadOnly)
ただし、vbDirectory を指定すると「フォルダだけ」が返るわけではありません。通常ファイルも混ざることがあります。
フォルダかどうかを厳密に判定したい場合は、GetAttr で vbDirectory 属性を確認します。
If (GetAttr("C:\サンプル\集計") And vbDirectory) = vbDirectory Then
Debug.Print "フォルダです"
End Ifフォルダパスの最後のバックスラッシュに注意する
Dir 関数でフォルダパスとファイル名を結合するときは、フォルダパスの最後に \ が必要です。
'OK
fileName = Dir("C:\サンプル\" & "*.xlsx")
'NGになりやすい
fileName = Dir("C:\サンプル" & "*.xlsx")
2つ目は、結果的に C:\サンプル*.xlsx のような文字列になってしまいます。
これでは「サンプルフォルダ内のxlsx」ではなく、「Cドライブ直下でサンプルから始まるxlsx」のような意味になり、意図した検索になりません。

必要であれば、フォルダパスの最後に \ を補う関数を作っておくと安心です。
Private Function AddTrailingBackslash(ByVal folderPath As String) As String
If Len(folderPath) = 0 Then
AddTrailingBackslash = ""
ElseIf Right$(folderPath, 1) = "\" Then
AddTrailingBackslash = folderPath
Else
AddTrailingBackslash = folderPath & "\"
End If
End Function使う側は次のように書けます。
Dim folderPath As String
folderPath = AddTrailingBackslash("C:\サンプル")
Debug.Print Dir(folderPath & "*.xlsx")
VBAのコード上では \ と表示されますが、環境やフォントによっては円マークのように見えることがあります。意味は同じパス区切りです。


フォルダ内のファイル名を取得して順番に処理する実務例
ここからは、現行記事でも扱っている使用例を残しつつ、実務で使いやすい形に整理します。
サンプルでは、次のようなフォルダにファイルが入っている前提です。

実務コードの選び方
ここでは、フォルダ内のファイル名を取得する処理を、目的別に分けて確認します。
最初は「ファイル名を1件だけ取る」「一覧にする」「条件で絞る」「順番に開く」の4方向で考えると選びやすいです。
| やりたいこと | 確認するコード | 主に使う書き方 |
|---|---|---|
| 最初に見つかったファイル名だけ取得したい | 使用例1: 最初のファイル名を取得する | Dir(folderPath & "*.*") |
| フォルダ内の通常ファイルをすべて一覧にしたい | 使用例2: すべての通常ファイル名を取得する | Dir() でループ |
| 隠しファイルや読み取り専用ファイルも含めたい | 使用例3: 属性付きで取得する | vbHidden Or vbReadOnly |
| 拡張子を指定して取得したい | 使用例4: 拡張子で絞り込む | Dir(folderPath & "*.xlsx") |
| Excelファイルを順番に開いて処理したい | 使用例5: Excelファイルを順番に開く | Workbooks.Open folderPath & fileName |
| 一覧をクリックして開けるようにしたい | ハイパーリンク付きのファイル一覧を作る | Hyperlinks.Add |
| ファイルやフォルダがあるか確認したい | ファイル存在チェックとフォルダ存在チェックを行う | Len(Dir(...)) > 0 |
使用例1: 指定したフォルダの最初のファイル名を取得する
Option Explicit
Sub GetFirstFileName()
Const FOLDER_PATH As String = "C:\サンプル\"
Dim fileName As String
fileName = Dir(FOLDER_PATH & "*.*")
If fileName <> "" Then
Worksheets("Sheet1").Range("A1").Value = fileName
Else
Worksheets("Sheet1").Range("A1").Value = "ファイルが見つかりません"
End If
End Sub
最初の1件だけ必要な場合は、この書き方で十分です。
ただし、取得順は必ずしも自分が見ているエクスプローラーの並び順と同じとは限りません。順番が重要な場合は、いったん配列に入れて並べ替える設計にします。
使用例2: フォルダ内のすべての通常ファイル名を取得する
Option Explicit
Sub ListAllNormalFiles()
Const FOLDER_PATH As String = "C:\サンプル\"
Dim ws As Worksheet
Dim fileName As String
Dim nextRow As Long
Set ws = ThisWorkbook.Worksheets("Sheet1")
ws.Range("A:B").ClearContents
ws.Range("A1").Value = "ファイル名"
ws.Range("B1").Value = "フルパス"
nextRow = 2
fileName = Dir(FOLDER_PATH & "*.*")
Do While fileName <> ""
ws.Cells(nextRow, 1).Value = fileName
ws.Cells(nextRow, 2).Value = FOLDER_PATH & fileName
nextRow = nextRow + 1
fileName = Dir()
Loop
End Sub
Dir() をループの最後に書くことで、次のファイル名へ進みます。
A列にはファイル名、B列にはフルパスを出しているため、後続処理でファイルを開くときにも使いやすくなります。

使用例3: 隠しファイルや読み取り専用ファイルも含めて取得する
Option Explicit
Sub ListFilesWithAttributes()
Const FOLDER_PATH As String = "C:\サンプル\"
Dim fileName As String
Dim nextRow As Long
nextRow = 2
fileName = Dir(FOLDER_PATH & "*.*", vbHidden Or vbReadOnly)
Do While fileName <> ""
Worksheets("Sheet1").Cells(nextRow, 1).Value = fileName
nextRow = nextRow + 1
fileName = Dir()
Loop
End Sub
通常の Dir(FOLDER_PATH & "*.*") では、隠しファイルなどが意図どおりに拾えないことがあります。
隠しファイルや読み取り専用ファイルも対象にするなら、attributes に vbHidden Or vbReadOnly のように指定します。

使用例4: 拡張子を指定してファイルを取得する
拡張子指定は、ワイルドカードの代表例です。
Option Explicit
Sub ListXlsmFiles()
Const FOLDER_PATH As String = "C:\サンプル\"
Dim fileName As String
Dim nextRow As Long
nextRow = 2
fileName = Dir(FOLDER_PATH & "*.xlsm")
Do While fileName <> ""
Worksheets("Sheet1").Cells(nextRow, 1).Value = fileName
nextRow = nextRow + 1
fileName = Dir()
Loop
End Sub
*.xlsm にすればマクロ有効ブックだけ、*.csv にすればCSVだけを取得できます。 *.xls* のように書くと、.xls、.xlsx、.xlsm などをまとめて拾えます。
使用例5: フォルダ内のExcelファイルを順番に開く
ファイル名を取得するだけでなく、取得したファイルを順番に開いて処理することもできます。
Option Explicit
Sub OpenAllXlsxFiles()
Const FOLDER_PATH As String = "C:\サンプル\"
Dim fileName As String
Dim wb As Workbook
fileName = Dir(FOLDER_PATH & "*.xlsx")
Do While fileName <> ""
Set wb = Workbooks.Open(FOLDER_PATH & fileName)
'ここにブックごとの処理を書く
Debug.Print wb.Name
wb.Close SaveChanges:=False
fileName = Dir()
Loop
End Sub
このコードは、対象フォルダ内の .xlsx ファイルを1つずつ開き、処理後に保存せず閉じます。
実務で使うときは、'ここにブックごとの処理を書く の部分に、転記、集計、印刷、PDF化などの処理を入れます。
注意点として、開いたブックに変更を加える場合は SaveChanges:=False のままでよいか必ず確認してください。保存が必要な処理では、保存先や上書き条件を別途設計します。
Dir関数だけでなく、複数ブック処理やファイル操作まで理解したい方は、VBA講座も確認しておくと迷いにくいです
この記事のコードだけでも、フォルダ内のファイル名取得や存在チェックは試せます。ただ、Dir() のループ、Workbooks.Open、複数Excelファイルの集計、エラー処理までまとめて身につけたい場合は、動画講座で実際の操作画面を見ながら学ぶと理解しやすくなります。
※価格・割引・返金条件・講座内容は変わる場合があります。購入前にUdemy上で最新情報をご確認ください。
ハイパーリンク付きのファイル一覧を作る
ファイル名を一覧にするだけでなく、セルをクリックして対象ファイルを開けるようにしたい場合は、Hyperlinks.Add を使います。
Excelの Hyperlinks.Add は、指定したセルや図形にリンクを追加するメソッドです。引数は Microsoft LearnのHyperlinks.Addメソッド でも確認できます。
Option Explicit
Sub ListFilesWithHyperlinks()
Const FOLDER_PATH As String = "C:\サンプル\"
Dim ws As Worksheet
Dim fileName As String
Dim nextRow As Long
Dim fullPath As String
Set ws = ThisWorkbook.Worksheets("Sheet1")
ws.Range("A:B").ClearContents
ws.Range("A1").Value = "ファイル名"
ws.Range("B1").Value = "フルパス"
nextRow = 2
fileName = Dir(FOLDER_PATH & "*.*", vbHidden Or vbReadOnly)
Do While fileName <> ""
fullPath = FOLDER_PATH & fileName
ws.Hyperlinks.Add _
Anchor:=ws.Cells(nextRow, 1), _
Address:=fullPath, _
TextToDisplay:=fileName
ws.Cells(nextRow, 2).Value = fullPath
nextRow = nextRow + 1
fileName = Dir()
Loop
End Sub
この形にしておくと、フォルダ内のファイル一覧をExcel上で管理できます。
現場では、月次ファイルの確認、提出物の一覧化、添付資料のリンク集作成などで使いやすいです。

ファイル存在チェックとフォルダ存在チェックを行う
Dir 関数は、ファイル存在チェックにも使えます。
Option Explicit
Public Function FileExistsByDir(ByVal targetPath As String) As Boolean
FileExistsByDir = (Len(Dir(targetPath)) > 0)
End Function使い方は次のとおりです。
Sub CheckFileSample()
If FileExistsByDir("C:\サンプル\売上.xlsx") Then
MsgBox "ファイルがあります"
Else
MsgBox "ファイルがありません"
End If
End Sub
フォルダ存在チェックも Dir(folderPath, vbDirectory) で書けますが、厳密には通常ファイルも返る可能性があるため、GetAttr で判定する方が安全です。
Option Explicit
Public Function FolderExistsByGetAttr(ByVal folderPath As String) As Boolean
On Error GoTo NotFound
FolderExistsByGetAttr = ((GetAttr(folderPath) And vbDirectory) = vbDirectory)
Exit Function
NotFound:
FolderExistsByGetAttr = False
End Function
ファイルだけなら Dir、フォルダを厳密に判定したいなら GetAttr または FileSystemObject と覚えると、誤判定を減らせます。
Dir関数でできないこと・FAQ・次に読む記事
Dir 関数は便利ですが、万能ではありません。
特に重要なのが、Dir関数はネストや再帰処理に向かない という点です。
この場合は対策としてFileSystemObjectを使用しましょう。
Dir関数はネスト・再帰処理できない
Microsoft LearnのDir関数リファレンスでも、Dir 関数を再帰的に呼び出すことはできないと説明されています。
理由は、Dir 関数が内部に持つ検索状態が1つだけだからです。
たとえば、外側の Dir でフォルダ一覧を回している途中に、内側で別の Dir(path) を始めると、外側の検索状態が上書きされます。
'このようなネストは避ける
folderName = Dir("C:\サンプル\*", vbDirectory)
Do While folderName <> ""
If folderName <> "." And folderName <> ".." Then
If (GetAttr("C:\サンプル\" & folderName) And vbDirectory) = vbDirectory Then
fileName = Dir("C:\サンプル\" & folderName & "\*.xlsx")
Do While fileName <> ""
Debug.Print fileName
fileName = Dir()
Loop
End If
End If
'ここで外側のDir検索状態が崩れている可能性がある
folderName = Dir()
Loop
このように、外側と内側で同時に Dir を使う処理は壊れやすくなります。
「フォルダの中のサブフォルダまで順番に見たい」「階層をたどりたい」という場合は、Dir で無理に書かず、FileSystemObjectに切り替えた方が安全です。

サブフォルダまで検索するならFileSystemObjectを使う
FileSystemObject は、ファイルシステムへアクセスするためのオブジェクトです。
Microsoft LearnのFileSystemObjectオブジェクト では、FileExists、FolderExists、GetFolder、GetFileName など、ファイルやフォルダを扱うメソッドが整理されています。
サブフォルダまで再帰的にファイルを一覧化するなら、次のように書きます。
Option Explicit
Sub ListFilesRecursiveByFso()
Const ROOT_FOLDER As String = "C:\サンプル"
Dim fso As Object
Dim rootFolder As Object
Dim ws As Worksheet
Dim nextRow As Long
Set fso = CreateObject("Scripting.FileSystemObject")
Set rootFolder = fso.GetFolder(ROOT_FOLDER)
Set ws = ThisWorkbook.Worksheets("Sheet1")
ws.Range("A:C").ClearContents
ws.Range("A1").Value = "ファイル名"
ws.Range("B1").Value = "フルパス"
ws.Range("C1").Value = "親フォルダ"
nextRow = 2
WriteFilesInFolder rootFolder, ws, nextRow
End Sub
Private Sub WriteFilesInFolder(ByVal targetFolder As Object, _
ByVal ws As Worksheet, _
ByRef nextRow As Long)
Dim fileItem As Object
Dim subFolder As Object
For Each fileItem In targetFolder.Files
ws.Cells(nextRow, 1).Value = fileItem.Name
ws.Cells(nextRow, 2).Value = fileItem.Path
ws.Cells(nextRow, 3).Value = targetFolder.Path
nextRow = nextRow + 1
Next fileItem
For Each subFolder In targetFolder.SubFolders
WriteFilesInFolder subFolder, ws, nextRow
Next subFolder
End Sub
このコードでは、参照設定なしで使えるように CreateObject("Scripting.FileSystemObject") を使っています。
サブフォルダの中にさらにサブフォルダがある場合も、WriteFilesInFolder が自分自身を呼び出して階層を下っていきます。
Dir でできることを無理に広げるより、次の基準で切り替える方が読みやすく、壊れにくいです。
Dir関数・FileSystemObject・Shellの使い分け
| 方法 | 向いていること | 苦手なこと |
|---|---|---|
Dir 関数 | 単一フォルダ内のファイル名取得、ワイルドカード検索、簡単な存在チェック | ネスト、再帰処理、詳細なファイル情報取得 |
FileSystemObject | サブフォルダ再帰、ファイルサイズや更新日時の取得、フォルダ存在チェック | Dir よりコード量が増える |
Shell | エクスプローラーでフォルダを開く、外部アプリを起動する | ファイル一覧の取得や条件検索には向かない |
初心者の方は、まず Dir 関数で「1つのフォルダ内のファイルを順番に処理する」感覚をつかむのがおすすめです。
その後、サブフォルダやファイル情報まで扱いたくなったら、FileSystemObjectへ進むと理解しやすくなります。
Dir関数のよくあるエラー・FAQ・まとめ
最後に、Dir関数でつまずきやすい原因と対策をまとめます。
よくあるエラーと対策
| 症状 | 主な原因 | 対策 |
|---|---|---|
| 何も取得できない | フォルダパスが違う、最後の \ がない、拡張子条件が合っていない | Debug.Print FOLDER_PATH & "*.xlsx" で実際の検索文字列を確認する |
| 同じファイル名のまま進まない | ループ内の最後で fileName = Dir() を書いていない | Do While の最後に必ず Dir() を入れる |
| 途中で外側のループが崩れる | Dir をネストして別の検索を始めている | ネストが必要ならFileSystemObjectへ切り替える |
| フォルダ名も混ざる | vbDirectory で通常ファイルも返る場合がある | GetAttr でフォルダかどうか判定する |
| 隠しファイルが出ない | attributes を指定していない | vbHidden や vbReadOnly を指定する |
| 取得順が思った順番と違う | OSやファイルシステムの並び順に依存する | 配列やコレクションに入れてから並べ替える |
| ファイルを開けない | Dir の戻り値がファイル名だけなのに、フルパスにしていない | folderPath & fileName でフルパスを作る |
困ったときは、まず Debug.Print で「VBAが実際に探しているパス」を確認してください。
Debug.Print FOLDER_PATH & "*.xlsx"
Debug.Print fileName
この2つを出すだけで、パスの結合ミス、拡張子ミス、Dir() の進め忘れに気づきやすくなります。
FAQ
ポイントのおさらい
Dir 関数は、Excel VBAでファイルやフォルダを扱う最初の入口として非常に便利です。
| 覚えること | 要点 |
|---|---|
| ワイルドカード | *.xlsx、Report_*.csv のように条件を絞れる |
| 1回目のDir | Dir(folderPath & "*.xlsx") のように検索条件を指定する |
| 2回目以降のDir | Dir() で次のファイルへ進む |
| 終了条件 | 戻り値が "" になったら一致なし |
| フルパス | Dir の戻り値はファイル名なので、必要なら folderPath & fileName を作る |
| 注意点 | Dirはネスト・再帰処理に向かない |
| 代替手段 | サブフォルダ検索はFileSystemObjectを使う |
まずは、この記事の最初に載せた ListXlsxFilesByDir を自分のフォルダパスに置き換えて動かしてみてください。
そのうえで、拡張子指定、存在チェック、ハイパーリンク付き一覧、FileSystemObjectの再帰処理へ広げると、フォルダ内ファイル処理のかなり多くを自動化できます。
次の段階では、ChatGPTやCursorに「このDir関数のコードを自分のフォルダ構成に合わせて直す」よう依頼すると、実務用のコードへ広げやすくなります。AIでコードを作る場合も、この記事で説明した Dir() の進み方、戻り値、ネスト不可の注意点を理解しておくと、出力されたコードの確認がしやすくなります。
毎日同じフォルダ処理を繰り返している場合は、VBAだけでなくPower AutomateやAIコード生成との使い分けも検討できます。この記事ではDir関数の基本に集中し、より広い自動化手段の比較は別記事で確認できるようにするのが読みやすいです。
ファイル一覧を作ったあとの、提出状況や締切管理に困っていませんか?
Dir関数でファイル一覧を自動で作れるようになると、次に出てくる悩みが「集めたファイルの提出状況や締切をどう管理するか」です。Excelで工程表を毎月作り直している場合は、ローカルで動くガントチャートアプリ Schedika に置き換えると、ファイル一覧作成と進捗管理を分けて扱いやすくなります。
- 外部送信なし
- Excelへ提出しやすい
- ブラウザで起動
※Schedikaは筆者が作成した自社製品です。無料Lite版とStandard版の違い、動作環境、価格はリンク先で確認できます。
VBAの基礎を続けて確認したい場合は、次の記事もあわせて読むとつながりやすいです。
| 次に読みたい内容 | 関連記事 |
|---|---|
| 取得したファイル名を配列に入れて並べ替えたい | VBAの配列を使いこなす |
| ファイルを別名保存したい | VBAでWorkbooks.SaveAsを使う方法 |
| 一覧の最終行を取得したい | VBAで最終行・最終列を取得する方法 |
| Outlook添付やメール送信につなげたい | VBAでOutlookを操作する方法 |
| VBAの記事を一覧で探したい | サイトマップ |

