【簡単エクセル/Excel VBA マクロ】複数ファイルを順次処理する|Dir関数/FileSystemObject|アプリ事例 #007



いつもありがとうございます!
ノンプログラマー向けの「Excel VBA マクロ 解説シリーズ」へようこそ。
本稿では、「複数のファイルを順次処理する」アプリの紹介をいたします。
複数のファイルに記録されている情報を横断的に集計したり、複数のファイルに情報を書き加える必要があるときはありませんか?このような作業は、実際の業務でよくあることです。例えば、各店舗の売上データの集計、顧客ごとの請求書の一括処理、または従業員ごとの週報や業務計画の管理などが挙げられます。
こうした場合、複数のファイルをひとつひとつ開いて操作するのは、大変な労力がかかります。しかし、VBAを使えば、このような作業を自動化することができます。例えば、フォルダ内のすべての売上データを一括で読み取り、集計結果を新しいシートにまとめたり、請求書のテンプレートに顧客データを埋め込んで自動生成することも可能です。このように、繰り返し行う定型作業を効率化できるため、時間と労力を大幅に削減することができます。
さらに、人間が作業する場合にありがちな転記ミスを防ぐことができます。これにより、大幅な時間短縮だけでなく、業務の品質向上にもつながります。
VBAで自分に合ったアプリを作成し、仕事量は半分に、成果は2倍にしていきましょう。初心者でも理解しやすいように、分かりやすく解説していきます。ぜひご覧ください!
VBAで「複数ファイルを順次処理する」2つの方法

VBAでフォルダ内のファイルを順次処理するにはどのようにすればよいのでしょうか?これには大きく分けて2つの方法があります。
1つは、VBAに組み込まれているシンプルなDir関数を使う方法。もう1つは、FileSystemObjectを使う方法です。どちらの方法にも特徴があり、用途に応じて使い分けることができます。特別な事情がなければ、FileSystemObjectを使っておけば問題ありません。
Dir関数
Dir関数は、ファイルやフォルダを検索するためのVBA標準関数です。特定の条件に一致するファイル名やフォルダ名を取得できます。特別な設定は不要で、簡単な操作に適しています。
メリット
- シンプルで速い。
- 特別な設定が不要。すぐに使える。
デメリット
- サブフォルダを探せない。
- 他の情報(ファイルのサイズや作成日など)は取得しにくい。
FileSystemObject
FileSystemObject(FSO)は、VBAでファイルやフォルダを操作するためのオブジェクトです。フォルダ内のファイル一覧取得、サブフォルダ探索、ファイルのコピー・削除など、標準のDir関数では難しい操作を実現できます。利用するには、参照設定で「Microsoft Scripting Runtime」を有効にする必要があります。
メリット
- サブフォルダまで探せる。
- ファイルの詳細情報も簡単に取得できる。
デメリット
- 初めに設定が必要(少し手間)。
- 簡単な処理にはやや大げさ。
今回解説するアプリの仕様

次のようなファイル・フォルダ構成です。
your_folder/
├── 順次処理するファイル/
├── ファイル001.xlsx
├── ファイル002.xlsx
├── ファイル003.xlsx
├── ファイル004.xlsx
├── ファイル005.xlsx
├── ファイル007.xlsx
├── ファイル008.xlsx
├── ファイル009.xlsx
└── ファイル010.xlsx
└── 複数のファイルを順次処理する.xlsm

複数のファイルを順次処理する.xlsm
がVBAコードを記述するファイルです。このファイルが、フォルダ順次処理するファイル
を見に行き、その中にあるファイルをひとつひとつ順次処理してい行きます。順次処理するファイル
の中には、ファイルが10個入っています。各ファイルの中身は空です。何も記載されていません。

Dir関数で「複数ファイルを順次処理する」方法

Dir関数で「複数ファイルを順次処理する」コードと、その実行結果を示します。
コードは次の通りです。
Sub ProcessMultipleFiles()
' 変数宣言
Dim folder_path As String
Dim file_name As String
Dim wb As Workbook
Dim ws As Worksheet
' フォルダのパスを指定
folder_path = ThisWorkbook.Path & "\順次処理するファイル\"
' ファイル名を取得
file_name = Dir(folder_path & "*.xlsx")
' フォルダ内のファイルを順次処理
Do While file_name <> ""
' ファイルを開く
Set wb = Workbooks.Open(folder_path & file_name)
Set ws = wb.Worksheets(1)
' 必要な処理をここに記述
ws.Cells(1, 1).Value = "Processed"
' ファイルを保存して閉じる
wb.Close SaveChanges:=True
' 次のファイル名を取得
file_name = Dir()
Loop
MsgBox "処理が完了しました!"
End Sub
コード実行結果は次の通りです。全ファイルに「Processed」の文字が書き込まれています。



解説していきます!
' 変数宣言
Dim folder_path As String
Dim file_name As String
Dim wb As Workbook
Dim ws As Worksheet
ここでは、コード内で使用する変数が宣言されています。変数は Dim 変数名 As データ型
の構文で宣言します。これにより、各変数は As
以降で指定したデータ型のデータを格納できるようになります。
なお、各データ型の意味は下表の通りです。
データ型 | 種類 | 意味 |
String |
文字列型 | 文字列を扱うデータ型です。ファイルパスや名前などのテキスト情報を格納します。 |
Workbook |
オブジェクト型 | Excelのワークブック(ファイル)を表すデータ型です。操作対象のファイルを管理します。 |
Worksheet |
オブジェクト型 | Excelのワークシートを表すデータ型です。操作対象のシートを管理します。 |
' フォルダのパスを指定
folder_path = ThisWorkbook.Path & "\順次処理するファイル\"
ここでは、順次処理するファイルが保存されているフォルダのパスを設定しています。ThisWorkbook.Path
は、このコードを実行しているExcelファイル(自分自身)の保存場所を意味します。この保存場所に順次処理するファイル
をつなげることで、フォルダの完全なパスを動的に作成しています。
' ファイル名を取得
file_name = Dir(folder_path & "*.xlsx")
ここでは、Dir関数を使用して順次処理するファイル
フォルダ内の最初のファイル名を取得しています。
' フォルダ内のファイルを順次処理
Do While file_name <> ""
' ファイルを開く
Set wb = Workbooks.Open(folder_path & file_name)
Set ws = wb.Worksheets(1)
' 必要な処理をここに記述
ws.Cells(1, 1).Value = "Processed"
' ファイルを保存して閉じる
wb.Close SaveChanges:=True
' 次のファイル名を取得
file_name = Dir()
Loop
ここでは、順次処理するファイル
フォルダ内のファイルをひとつずつ処理する繰り返し処理を実行しています。
Do While file_name <> ""
で、Dir
関数から取得したファイル名が空文字列でない限り処理を継続する仕組みになっています。
繰り返し処理の中では、まず対象ファイルを開くと同時にSet wb
に格納し、Set ws
にその1番目のシートを格納しています。
次に、ws.Cells(1, 1).Value = "Processed"
の部分で、ワークシートのCell(1,1)
(A1)に「Processed」という文字列を書き込んでいます。この部分はカスタマイズ可能で、具体的な業務内容に応じて処理内容を変更できます。
処理が完了したら、wb.Close SaveChanges:=True
でファイルを保存して閉じます。
最後に、file_name = Dir()
を呼び出して次のファイル名を取得し、これを繰り返します。
MsgBox "処理が完了しました!"
ここでは、処理がすべて完了したことをメッセージボックスで表示しています。ユーザーに処理の終了を知らせるためのものです。

以上で、Dir関数使用した方法の解説は終了です。ありがとうございました!
FileSystemObjectで「複数ファイルを順次処理する」方法

FileSystemObjectで「複数ファイルを順次処理する」コードと、その実行結果を示します。
Sub ProcessMultipleFilesWithFSO()
' 使用ライブラリ:
' - Microsoft Scripting Runtime
' 変数宣言
Dim folder_path As String
Dim fso As FileSystemObject
Dim Folder As Folder
Dim File As File
Dim wb As Workbook
' フォルダのパスを指定
folder_path = ThisWorkbook.Path & "\順次処理するファイル\"
' FileSystemObjectを作成
Set fso = New FileSystemObject
Set Folder = fso.GetFolder(folder_path)
' フォルダ内のファイルを順次処理
For Each File In Folder.Files
If File.Name Like "*.xlsx" Then
' ファイルを開く
Set wb = Workbooks.Open(File.Path)
Set ws = wb.Worksheets(1)
' 必要な処理をここに記述
ws.Cells(1, 1).Value = "Processed"
' ファイルを保存して閉じる
wb.Close SaveChanges:=True
End If
Next File
MsgBox "処理が完了しました!"
End Sub
コード実行結果は次の通りです。全ファイルに「Processed」の文字が書き込まれています。



解説していきます!
まず、FileSystemObjectを利用するためには、Microsoft Scripting Runtime の参照設定を追加する必要があります。
「ツール」-->「参照設定」と進み、Microsoft Scripting Runtime にチェックを入れ「OK」を押下します。


このひと手間が FileSystemObject を使う際のデメリットであるともいえますが、一度設定してしまえば以降は設定の必要はありません。
' 使用ライブラリ:
' - Microsoft Scripting Runtime
これはコードの一部ではありませんが、この コードを実行するために必要なライブラリをコメントとして記載しています。このMicrosoft Scripting Runtime
を使用することで、FileSystemObject
というオブジェクトを操作することができるようになります。つまり、ファイルやフォルダに関する情報を取得したり操作したりすることができるようになります。
' 変数宣言
Dim folder_path As String
Dim fso As FileSystemObject
Dim Folder As Folder
Dim File As File
Dim wb As Workbook
' フォルダのパスを指定
folder_path = ThisWorkbook.Path & "\順次処理するファイル\"
ここでは、順次処理するファイルが保存されているフォルダのパスを設定しています。ThisWorkbook.Path
は、このコードを実行しているExcelファイル(自分自身)の保存場所を意味します。この保存場所に順次処理するファイル
をつなげることで、フォルダの完全なパスを動的に作成しています。
' FileSystemObjectを作成
Set fso = New FileSystemObject
Set Folder = fso.GetFolder(folder_path)
ここでは、FileSystemObject
を作成し、指定したパスのフォルダを取得しています。fso.GetFolder
を使用することで、フォルダ内のファイルやサブフォルダを操作できるようになります。
' フォルダ内のファイルを順次処理
For Each File In Folder.Files
If File.Name Like "*.xlsx" Then
' ファイルを開く
Set wb = Workbooks.Open(File.Path)
Set ws = wb.Worksheets(1)
' 必要な処理をここに記述
ws.Cells(1, 1).Value = "Processed"
' ファイルを保存して閉じる
wb.Close SaveChanges:=True
End If
Next File
ここでは、順次処理するファイル
フォルダ内のファイルをひとつずつ処理する繰り返し処理を実行しています。
For Each File In Folder.Files
を使用して、指定フォルダ内のすべてのファイルに対して繰り返し処理を行う仕組みです。
繰り返し処理の中では、まず対象ファイルを開くと同時にSet wb
に格納し、Set ws
にその1番目のシートを格納しています。
次に、ws.Cells(1, 1).Value = "Processed"
の部分で、ワークシートのCell(1,1)
(A1)に「Processed」という文字列を書き込んでいます。この部分はカスタマイズ可能で、具体的な業務内容に応じて処理内容を変更できます。
処理が完了したら、wb.Close SaveChanges:=True
でファイルを保存して閉じています。
MsgBox "処理が完了しました!"
ここでは、処理がすべて完了したことをメッセージボックスで表示しています。ユーザーに処理の終了を知らせるためのものです。

以上で、FileSystemObjectを使用した方法の解説は終了です!ありがとうございました!
関連記事
本稿と関連の深い記事です。もしよろしければ、合わせてご活用ください。
- 【簡単エクセル/Excel VBA マクロ】解説シリーズ目次 | みんなの実用学(jitsuyogaku.com)
- 【簡単エクセル/Excel VBA マクロ】Excel VBA マクロの全体像 | みんなの実用学 (jitsuyogaku.com)
VBAプログラミングスキルアップのための参考情報
ここでは参考図書を紹介いたしますが、これらに限らず自分に合うものを選ぶことが重要だと考えております。皆様の、より一層のご成功を心よりお祈りしております。
VBAプログラミングのスキルアップ
学習用としてもハンドブックとしても役立つ便利な書籍がこちらです。価格はやや高めですが、その内容は非常に充実しています。相応のスキルを身に付けるためには、こうしたしっかりとした書籍を一冊持っておくと良いでしょう。
入門書に関しては、どの書籍も大きな違いはありません。あまり迷うことに時間をかけるよりは、手頃なものを一冊選んでみると良いでしょう。VBAの入門書は数多く出版されていますので、興味がある方はぜひチェックしてみてください。
甲乙つけがたい場合、私はインプレス社の「いちばんやさしい」シリーズを選ぶことが多いです。
\チェックしてみよう/
\チェックしてみよう/
\チェックしてみよう/
VBAのプログラミング能力を客観的に証明したい場合には「VBAエキスパート試験」があります。この試験はVBAの知識を公式に認定するものです。VBAの総合的な能力獲得を目指す方に適しています。以下の公式テキストが販売されております。
プログラミングの一般教養
「独学プログラマー」というプログラミングの魅力を解説した書籍があります。これはVBAではなくPythonを題材としていますが、プログラミングの基本的な知識や思考法、仕事の進め方まで幅広く学べます。
こちらの記事でも紹介しております。もしよろしければご覧ください。

おわりに


ご覧いただきありがとうございました!
本稿では、「異なるファイル間でのデータマッチング(照合・突合)」を紹介をいたしました。
お問い合わせやご要望等ございましたら、「お問い合わせ/ご要望」またはコメントにて、ご連絡いただければ幸いでございます。
皆様の人生がより一層素晴らしいものになるよう、少しでもお役に立てれば幸いでございます。
なお、当サイトでは様々な情報を発信しております。もしよろしければ、トップページもご確認いただけると幸いでございます。
この記事を書いた人
- ■人生を追求する凡人■日本一安全で、気の向くままに自分の時間を過ごせる、こだわりのキャンプ場を作るのが夢■光学・機械系エンジニア(歴20年、内マネジメント10年、特許数件権利化)/副業フリーランスエンジニア■読書・文学愛好■人生は時間そのもの。ひとりでも多くの人が「より良い人生にするために時間を使って欲しい」と願い、仕事のスキルの向上、余暇の充実、資産形成を研究。■VBAアプリ開発サービス提供中(業務委託 / VBA使用経験20年)■Python愛好(歴5年)■VBAエキスパート「Excel VBA スタンダード」(上級者向け資格)/ Python 3 エンジニア認定基礎(経済産業省「ITスキル標準(ITSS)」に掲載)