【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」部分を自分のフォルダパスに変更するだけで使用できます。
- 取得したファイル名は改行で区切られてメッセージボックスに表示される
- ファイルが存在する間、ループする
- ファイルが見つからないときはメッセージボックスが表示される
エラーハンドリングも含んでいるため、安全に実行できます。
複数拡張子を対象とした応用コード
エクセル業務では、
エクセルファイルと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の導入は必須事項である!といっても過言ではありません。
マクロを導入するメリット
マクロを導入する最大のメリットは、作業時間の短縮と品質の向上を同時に実現できることです。
人間が時間をかけて行う単純作業をコンピュータが正確かつ高速に処理することができます。
たとえば、手作業で1時間かかっていたデータ整理が、マクロなら数秒で完了し、さらに計算ミスや入力間違いも完全に防げます。
また、一度作成したマクロは何度でも使い回せるため、長期的な業務効率化投資としても非常に価値があります。
結果として、マクロ導入は時間コストの削減と業務品質の向上という二重のメリットをもたらします。
VBA学習の始め方
VBA学習の最も効果的な始め方は、実際の業務課題から出発することです。
目的が明確な学習は記憶定着率が高く、モチベーションも維持しやすいのは間違いありません。
たとえば、毎週行っているデータ集計作業を自動化することを目標に設定し、必要な機能から順番に覚えていけば実践的なスキルがすぐに身につきます。
基本的な変数の使い方から始まり、ループ処理、条件分岐、配列など、段階的にレベルアップしていくことで、確実にVBAをマスターできます。
関連記事「VBA初心者必見!マクロの作り方」では、コードを書く画面の開き方や書いたコードの実行方法が図やサンプルコードを使って紹介されています。
マクロの開発を外注依頼する
業務内容に合わせた効率化マクロを導入したいけど、VBAコードを開発する時間がない。。。どうやってプログラムを組めばいいかわからない。。。
このような方は、マクロ開発を外注に依頼しちゃいましょう。
外注依頼することで本業に集中しながら高品質なマクロを即座に導入することができます。
ちなみに、マメBlogでもエクセルマクロ開発代行サービスを承っています。
開発内容の確認、VBAコードの設定、動作確認後の調整、など全ての工程を私(マメ父ちゃん)が行っているので、
費用が安い!スピード納期!!
でやらせてもらっています。
ほとんど独学で身に付けたVBAスキルなので、内容によっては開発できないこともあるのでご了承ください。
ご相談、見積もり依頼は完全無料ですので気になる方は下記のリンクよりお問合せ下さい。
効率化マクロを導入してエクセル業務の効率をアップさせましょう。