【VBA】フォルダ内のファイル名を取得するマクロ!VBA初心者でも扱える効率化テクニック
フォルダ内のファイル名を手作業で一つずつコピーするのはめんどくさい。。。
こんな悩みを抱えていませんか?
こんな問題は『フォルダ内のファイル名を取得するVBA』の導入で解決できます。
VBAを使えば、
たった数行のコードでフォルダ内のすべてのファイル名を一瞬で取得する
ことが可能です。
しかも、
特定の拡張子だけを抽出したり、エクセルシートにファイル名をリスト化したり、業務内容に合わせてカスタマイズすることも可能。
この記事では、VBA初心者でもすぐに使えるコピペ可能なサンプルコードを多数掲載。
Dir関数の基本から、FileSystemObjectを使った高度な技術まで、段階的に習得できる構成になっています。
手作業でファイル名を一つずつコピペしている方はVBAを使って自動化しちゃいましょう。
VBAでフォルダ内のファイル名を取得する基本的な方法
VBAでフォルダ内のファイル名を取得するには、
主に「Dir関数」と「FileSystemObject」という2つの方法
があります。
「Dir関数」と「FileSystemObject」を使いこなすことで、
手作業でのファイル管理から解放され業務効率が格段に向上させる
ことが可能です。
Dir関数は初心者にも理解しやすく少ないコード量でファイル名を取得できる
FileSystemObjectはよりコード作成の難易度は高めですが柔軟で複雑な操作が可能できる
という違いがあります。
どちらの方法も適切に使い分けることで、様々なファイル操作のニーズに対応できるようになるでしょう。
Dir関数を使った基本的なファイル名取得
Dir関数はVBAでファイル名を取得する最も基本的で簡単な方法です。
この関数を使えば、
指定したフォルダ内のファイル名を一つずつ順番に取得する
ことができます。
Dir関数は、
最初に呼び出すときにフォルダパスを指定し、その後は引数なしで繰り返し呼び出すことで次のファイル名を順次取得する
という仕組みです。
Dir関数のサンプルコードがこちら
Sub GetFileNames()
Dim fileName As String
fileName = Dir("C:\MyFolder\*.*")
Do While fileName <> ""
Debug.Print fileName
fileName = Dir()
Loop
End Sub
上記のコードは、
「C:\MyFolder」というフォルダ内のすべてのファイル名を取得し、イミディエイトウィンドウに表示する
という意味です。
Dir関数が空文字列を返すまでループを続けることで、フォルダ内のすべてのファイルを処理できます。
関連記事「Dir関数の使い方」では、Dir関数でファイル名を取得する方法が解説されています。
ワイルドカードを使用した特定拡張子の取得
特定の拡張子のファイルだけを取得したい場合は、ワイルドカードを使用します。
ワイルドカードとは、任意の文字列を表現する記号のことで、「*」は任意の文字列、「?」は任意の1文字を表します。
これにより、
「Excelファイルだけ取得したい」「PDFファイルだけ取得したい」など、限定的な条件で絞り込む
ことが可能です。
ワイルドカードを使ったサンプルコードがこちら
Sub GetExcelFiles()
Dim fileName As String
fileName = Dir("C:\MyFolder\*.xlsx")
Do While fileName <> ""
Debug.Print fileName
fileName = Dir()
Loop
End Sub
上記のコードは、
拡張子が「.xlsx」のExcelファイルのみを取得する
という意味です。
3行目の「*.xlsx」を「*.pdf」とすればPDFファイルを取得できます。
ワイルドカードを活用することで、必要なファイルだけを効率的に処理することが可能です。
ファイルパスの指定方法と注意点
ファイルパスの指定では、絶対パスと相対パスの使い分けが重要です。
絶対パスは「C:\Users\UserName\Documents」のように完全なパスを指定する方法
相対パスは現在の作業フォルダからの相対的な位置を指定する方法
また、パスの区切り文字には「\」を使用し、パスの最後に「\」を付ける必要はありません。
Sub PathExample()
Dim folderPath As String
folderPath = "C:\Users\" & Environ("USERNAME") & "\Desktop"
Dim fileName As String
fileName = Dir(folderPath & "\*.*")
Do While fileName <> ""
Debug.Print fileName
fileName = Dir()
Loop
End Sub
上記のコードは、
Environ関数を使用して現在のユーザー名を取得し、デスクトップフォルダのパスを動的に作成する
という意味です。
パス指定時は、フォルダが存在しない場合やアクセス権限がない場合のエラーハンドリングを実装しましょう。
関連記事「エラーを無視する方法」では、不用意なエラーの発生を防ぐテクニックが紹介されています。
実践的なVBAコードサンプル集
実際の業務で「ファイル名を取得するVBA」を活用するには、
基本的な理論だけでなく、すぐに使える実践的なコードが必要
です。
ここからは、
コピー&ペーストで使える基本コードから、複数の拡張子を対象とした応用コード、さらにExcelシートに結果を自動出力するマクロ、など
VBA初心者にもわかりやすい内容でご紹介します。
サンプルコードには解説コメントを付けているので、実際にコードを動かしながら処理内容を確認してみてください。
初心者向け基本コード(コピペ可能)
VBA初心者でもすぐに使える基本的な「ファイル名を取得するVBA」を紹介します。
基本な「名前を取得するVBA」のサンプルコードがこちら
Sub BasicFileList()
' フォルダパスを指定(ここを変更してください)
Dim folderPath As String
folderPath = "C:\MyFolder"
' 変数の宣言
Dim fileName As String
Dim fileList As String
' ファイル名の取得開始
fileName = Dir(folderPath & "\*.*")
' ファイルが存在する間ループ
Do While fileName <> ""
fileList = fileList & fileName & vbCrLf
fileName = Dir()
Loop
' 結果の表示
If fileList <> "" Then
MsgBox "取得したファイル名:" & vbCrLf & fileList
Else
MsgBox "ファイルが見つかりませんでした。"
End If
End Sub
上記のコードは
指定したフォルダ内のすべてのファイル名を取得し、メッセージボックスで表示する
という内容です。
このコードをそのままコピーして、4行目の「folderPath」部分を自分のフォルダパスに変更するだけで使用できます。
- 取得したファイル名は改行で区切られてメッセージボックスに表示される
- ファイルが存在する間、ループする
- ファイルが見つからないときはメッセージボックスが表示される
エラーハンドリングも含んでいるため、安全に実行できます。
関連記事「VBAの作り方」では、
コードを書く場所や実行の方法など、これからVAB学習をスタートする方向けの内容
が紹介されています。
複数拡張子を対象とした応用コード
エクセル業務では、
エクセルファイルとWordファイルの両方を取得したい、エクセルだけ取得したい、など、
状況によって取得対象が異なる場合がありますよね。
こんなときは、「拡張子の違いを認識するVBA」で解決できます。
配列を使って複数の拡張子を指定し、それぞれに対してDir関数を実行する方法が効果的です。
サンプルコードがこちら
Sub MultipleExtensions()
Dim folderPath As String
folderPath = "C:\MyFolder"
' 対象となる拡張子を配列で定義
Dim extensions As Variant
extensions = Array("*.xlsx", "*.docx", "*.pdf", "*.txt")
Dim fileName As String
Dim fileList As String
Dim i As Integer
' 各拡張子に対してファイル検索を実行
For i = 0 To UBound(extensions)
fileName = Dir(folderPath & "\" & extensions(i))
Do While fileName <> ""
fileList = fileList & fileName & " (" & Mid(extensions(i), 3) & ")" & vbCrLf
fileName = Dir()
Loop
Next i
' 結果の表示
If fileList <> "" Then
Debug.Print "取得したファイル名:" & vbCrLf & fileList
Else
MsgBox "指定した拡張子のファイルが見つかりませんでした。"
End If
End Sub
上記ののコードは、
Array関数を使って複数の拡張子を配列として定義し、For文で順次処理する
という内容です。
実行結果がこちら
取得したファイル名をイミディエイト欄に表示しています。
ファイル名の後ろに拡張子を表示することで、どの種類のファイルなのかすぐに判別可能です。
エクセルシートにファイル名を自動出力するマクロ
取得したファイル名をエクセルシートに自動的に出力するマクロは、データの整理や報告書作成に非常に便利です。
ファイル名、ファイルサイズや更新日時をリスト化するサンプルコードがこちら
Sub FileListToExcel()
Dim folderPath As String
folderPath = "C:\MyFolder"
' ワークシートの準備
Dim ws As Worksheet
Set ws = ActiveSheet
ws.Cells.Clear
' ヘッダーの設定
ws.Cells(1, 1).Value = "ファイル名"
ws.Cells(1, 2).Value = "拡張子"
ws.Cells(1, 3).Value = "フルパス"
' ヘッダーの書式設定
ws.Range("A1:C1").Font.Bold = True
ws.Range("A1:C1").Interior.Color = RGB(200, 200, 200)
Dim fileName As String
Dim row As Integer
row = 2
' ファイル名の取得とシートへの出力
fileName = Dir(folderPath & "\*.*")
Do While fileName <> ""
ws.Cells(row, 1).Value = fileName
ws.Cells(row, 2).Value = Right(fileName, Len(fileName) - InStrRev(fileName, ".") + 1)
ws.Cells(row, 3).Value = folderPath & "\" & fileName
row = row + 1
fileName = Dir()
Loop
' 列幅の自動調整
ws.Columns("A:C").AutoFit
MsgBox (row - 2) & "個のファイルをリストアップしました。"
End Sub
上記のコードは
指定したフォルダ内のファイル情報が現在のワークシートに表形式で出力。ヘッダー行の色を変更し、列幅を自動調整する
という内容です。
実行結果がこちら
リスト化した後、取得できたファイル数をメッセージボックスで表示します。
FileSystemObjectを使った高度なファイル操作
FileSystemObjectは、Dir関数よりも高機能で柔軟なファイル操作を可能にするオブジェクトです。
このオブジェクトを使用することで、
サブフォルダを含む再帰的なファイル検索や、ファイルの詳細情報(作成日時、更新日時、サイズなど)の取得が簡単
に実行できます。
Dir関数と比較すると少しコードが複雑になりますが、その分強力な機能を提供するため、本格的なファイル処理システムを構築する際には必須の技術です。
オブジェクト指向プログラミングの概念も学べるため、VBAスキル向上にも役立ちます。
FileSystemObjectの基本的な使い方
FileSystemObjectを使用するには、まずオブジェクトを作成し、そのメソッドやプロパティを使ってファイル操作を行います。
FileSystemObjectはオブジェクト指向の考え方でファイルシステムにアクセスするため、より直感的で読みやすいコードが書けます。
FileSystemObjectを使ったファイル名を取得するVBAのサンプルコードがこちら
Sub FileSystemObjectBasic()
' FileSystemObjectの作成
Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")
' フォルダオブジェクトの取得
Dim folderPath As String
folderPath = "C:\MyFolder"
' フォルダの存在確認
If fso.FolderExists(folderPath) Then
Dim folder As Object
Set folder = fso.GetFolder(folderPath)
' ファイルコレクションの取得
Dim file As Object
Dim fileList As String
For Each file In folder.Files
fileList = fileList & file.Name & vbCrLf
Next file
MsgBox "取得したファイル名:" & vbCrLf & fileList
Else
MsgBox "指定されたフォルダが存在しません: " & folderPath
End If
End Sub
上記のコードは、
CreateObject関数でFileSystemObjectを作成し、GetFolderメソッドでフォルダオブジェクトを取得する
という意味です。
For Each文を使用することで、フォルダ内のすべてのファイルに対して処理を実行できます。
サブフォルダも含めた再帰的取得
大量のファイルが複数のサブフォルダに分散している場合、再帰的にすべてのファイルを取得する機能が必要です。
FileSystemObjectを使用すれば、サブフォルダを含むすべてのファイルを効率的に取得できます。
この技術は、バックアップファイルの一覧作成や重複ファイルの検索などに活用できます。
Sub RecursiveFileSearch()
Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")
Dim rootPath As String
rootPath = "C:\MyFolder"
' 結果を格納する変数
Dim allFiles As String
' 再帰的にファイルを検索
Call SearchFilesRecursively(fso, rootPath, allFiles)
' 結果の表示
If allFiles <> "" Then
MsgBox "取得したファイル一覧:" & vbCrLf & allFiles
Else
MsgBox "ファイルが見つかりませんでした。"
End If
End Sub
' 再帰的にファイルを検索するサブルーチン
Sub SearchFilesRecursively(fso As Object, folderPath As String, ByRef fileList As String)
If fso.FolderExists(folderPath) Then
Dim folder As Object
Set folder = fso.GetFolder(folderPath)
' 現在のフォルダ内のファイルを処理
Dim file As Object
For Each file In folder.Files
fileList = fileList & file.Path & vbCrLf
Next file
' サブフォルダを再帰的に処理
Dim subFolder As Object
For Each subFolder In folder.SubFolders
Call SearchFilesRecursively(fso, subFolder.Path, fileList)
Next subFolder
End If
End Sub
上記のコードは、メインプロシージャとサブルーチンを分けて、再帰的な処理を実現しています。
サブフォルダが見つかるたびに自分自身を呼び出すことで、階層の深いフォルダ構造でもすべてのファイルを取得することが可能。
実行結果がこちら
取得したファイル名をイミディエイトに表示しています。
フォルダの階層が分かれていても問題なくファイル名を取得可能です。
関連記事の中の「サブフォルダまで含めた再帰的ファイル名取得VBA」では、階層毎にに取得したファイル名をエクセルシートにリスト化するサンプルコードが紹介されています。
ファイル情報(更新日・サイズ)も同時取得
ファイル名だけでなく、ファイルサイズや更新日時などの詳細情報も同時に取得することで、より有用なファイル管理システムを構築できます。
FileSystemObjectのFileオブジェクトには、これらの情報にアクセスするプロパティが用意されているため、簡単に詳細情報を取得することが可能です。
ファイルの詳細情報を取得するサンプルコードがこちら
Sub DetailedFileInfo()
Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")
' ワークシートの準備
Dim ws As Worksheet
Set ws = ActiveSheet
ws.Cells.Clear
' ヘッダーの設定
ws.Cells(1, 1).Value = "ファイル名"
ws.Cells(1, 2).Value = "サイズ(KB)"
ws.Cells(1, 3).Value = "更新日時"
ws.Cells(1, 4).Value = "作成日時"
ws.Cells(1, 5).Value = "フルパス"
' ヘッダーの書式設定
ws.Range("A1:E1").Font.Bold = True
ws.Range("A1:E1").Interior.Color = RGB(200, 200, 200)
Dim folderPath As String
folderPath = "C:\MyFolder"
If fso.FolderExists(folderPath) Then
Dim folder As Object
Set folder = fso.GetFolder(folderPath)
Dim file As Object
Dim row As Integer
row = 2
For Each file In folder.Files
ws.Cells(row, 1).Value = file.Name
ws.Cells(row, 2).Value = Round(file.Size / 1024, 2) ' バイトをKBに変換
ws.Cells(row, 3).Value = file.DateLastModified
ws.Cells(row, 4).Value = file.DateCreated
ws.Cells(row, 5).Value = file.Path
row = row + 1
Next file
' 列幅の自動調整
ws.Columns("A:E").AutoFit
MsgBox (row - 2) & "個のファイル情報を取得しました。"
Else
MsgBox "指定されたフォルダが存在しません。"
End If
End Sub
上記のコードは、
ファイルのサイズ、更新日時、作成日時、保存場所、をエクセルシートにリスト化する
という内容です。
ファイルサイズはバイト単位で取得されるため、1024で割ってキロバイト表示。
これらの情報は、古いファイルの特定や容量の大きなファイルの発見に役立ちます。
実行結果がこちら
VBA初心者が『ファイル名を取得するVBA』を導入する方法
VBAなんて扱ったことないけど、業務内容に合わせた『フォルダ内のファイル名を全て取得するVBA』を導入したい!
こんな問題を解決する方法がこちら
- マクロの開発を外注に依頼する
- マクロが設定されたエクセルファイルをダウンロードする
- 参考書やネットでVBAスキルを身に付ける
VBAスキルを身に着ける前は、「マクロ開発の外注」で対応していましたが、
今では自分で効率化マクロをサクッと導入しちゃいます。
完成されたマクロを使ってエクセル業務を処理する
↓
作業効率が2倍以上アップ!!
↓
便利すぎて自分でもマクロを設定したいと考え始める
↓
参考書やネットの情報でVBAスキルを身に付ける
↓
マクロ開発を代行できる程のスキルを習得
VBAは
他のプログラミングに比べて参考書やネットで紹介されている情報量が多いので初心者でも導入しやすい
という特徴があります。
外注した方が楽だけど、費用がかかる。自分で導入すれば費用は0円だけど時間がかかる。。
いずれにせよ、効率化マクロを導入できれば作業効率が飛躍的にアップするのは間違いありません。
あなたに合った方法で導入しちゃいましょう。
マクロ開発を外注に依頼する
マクロ開発を外注に依頼する方法は
VBAを全く扱えない方でもエクセル作業を自動化できる最も簡単な方法
です。
「こんな感じでファイル名をリスト化したい」「取得したファイル名を資料に転記したい」
こんな感じで、実現したい内容を依頼するだけで業務内容に合ったマクロを開発してくれます。

ガッツポーズの人
デメリットは、費用がかかることだけ。
開発内容、依頼先によってかかる費用は大きく異なります。
私が会社員の頃利用していた業者さんは1マクロあたり2万円~3万円の費用がかかりました。

疑問がある人
ちなみに、マメBlogでもエクセルマクロ開発代行サービスを承っています。
開発内容の確認、VBAコードの設定、動作確認後の調整、など全ての工程を私(マメ父ちゃん)が行っているので、
費用が安い!スピード納期!!
でやらせてもらっています。
ほとんど独学で身に付けたVBAスキルなので、内容によっては開発できないこともあるのでご了承ください。
ご相談、見積もり依頼は完全無料ですので気になる方は下記のリンクよりお問合せ下さい。
マクロが設定されたエクセルファイルをダウンロードする
VBA初心者でも『マクロが設定されたエクセルファイルをダウンロード』することで、
すぐに使っているエクセルにマクロを導入することができます。
VBA初心者でも形になっているマクロをゲットできる、費用が安い、
というメリットがあります。
しかし、
想定するマクロを見つけることが難しい、業務内容に合わせるためのアレンジが必要
というデメリットもあります。

ガッツポーズの人
個人ブログやファイルを販売できるサイト「note」や「Tips」ではいろんなマクロの情報が掲載されているので是非参考にしてみてください。
今までマメBlogで受注した効率化マクロを下記のnoteで掲載していますので併せてチェックしてみてください。
参考書やネットでVBAスキルを身に付ける
先程も紹介しましたが、
VBAは他のプログラミングに比べて参考書やネットで紹介されている情報量が多いので初心者でも導入しやすい
プログラミングです。
言い換えると、
情報量が豊富なので自分で勉強できちゃう
ということです。
私のVBAスキルはほとんど独学で身に付けたもので、
考えた処理のほとんどをVBAで表現できるレベルにまで到達した!
と思っています。
私の作ったマクロをプロのプログラマーが見れば、
お前の書くコードはインチキだ!「変数の宣言」とか「引数」を正しく使えよ!!
と感じるはずです。
でも、
私からすればどうでもいい!!!想定した内容を正しく処理できればよくないですか!?
独学であっても『写真を貼り付けるマクロ』『全てのシートをPDF出力するマクロ』『連番を振るマクロ』など、
業務内容に合ったマクロを開発できるようになれます。
独学でVBAスキルを身に付けるコツは、
エラーが発生してもいいからひたすらコードを書く、なんでもいいからエクセル作業をマクロ化してみる
です。
とは言っても、全くの知識0の方は何をすればいいかわからないですよね。
VBA知識0の初心者の方は、参考書『たった1秒で仕事が片づくExcel自動化の教科書【増強完全版】』を読んでみてください。
VBAの知識0の方でもすいすい読み進められる内容になっています。
やさしい内容にも関わらず「え!!VBAを使えばこんなことできるの!?」と感動すると思います。
実際に私はこの参考書を読んでからVBAの勉強を始めました。

ひらめく人
VBAの魅力を発見した後は、
ひたすら自動化したい内容のコードを書くだけ
です。
【VBA ファイル名取得】【VBA ファイル名 リスト化】でネット検索すれば知りたいコードをすぐにゲットできます。
実現したい処理に向かって、「調べる→書いてみる→エラーを改善する→調べる」を繰り返していると
自然といろんなマクロが作れるようになっているはずです。
VBAに興味が湧いてきたという方は今からVBA学習をスタートさせちゃいましょう。