【簡単エクセル/Excel VBA マクロ】異なるファイル間でのデータマッチング(照合・突合)|アプリ事例 #006



いつもありがとうございます。
ノンプログラマー向けの「Excel VBA マクロ アプリ事例解説シリーズ」へようこそ。
本稿では、「異なるファイル間でのデータマッチング(照合・突合)」を解説いたします。
「どちらのファイルにデータが不足しているのか確認したい」
「特定の条件で一致する行を取り出したい」
このようなことを経験したことはありませんか? これらは、実際の業務でよくあることですよね。VBAを活用すれば、こうした煩雑な手作業を劇的に効率化することが可能です。
VBAで自分に合ったアプリを作成し、仕事量は半分に、成果は2倍にしていきましょう。初心者でも理解しやすいように、分かりやすく解説していきます。ぜひご覧ください。
なお、本稿で紹介するコードは、AIにプロンプトを入力して生成しています。そちらにご興味がある方は、ぜひこちらもご覧ください!
VBAで「異なるファイル間でのデータマッチング(照合・突合)」を行う方法

シナリオ
以下のようなファイル・フォルダ構成です。
your_folder/
├── ファイルA.xlsx
├── ファイルB.xlsx
└── データを照合する.xlsm
データを照合する.xlsm
がVBAコードを記述するファイルです。このデータを照合する.xlsm
が、ファイルA.xlsx
と ファイルB.xlsx
を見に行き、データを照合します。
ファイルA.xlsx
と ファイルB.xlsx
のシートの中身は以下のようになっています。


ファイルA.xlsx
と ファイルB.xlsx
の各セルのデータをひとつずつ順番に見ていき、ファイルAに存在しているデータがファイルBにも存在していれば「マッチ」とします。
コードの実装

上述のシナリオを実現するコードと、その実行結果を示します。
Sub CompareAndHighlight()
' Contents ファイルAとファイルBの列1を総当たりで比較し、一致データを
' 赤色に変更して新しいファイルに保存する
' Version 1.0.0
' Last Update 2024/12/07
' Since 2024/12/07
' 変数宣言
Dim fa_path As String ' ファイルAのパス
Dim fb_path As String ' ファイルBのパス
Dim fa_wb As Workbook ' ファイルAのワークブック
Dim fb_wb As Workbook ' ファイルBのワークブック
Dim fa_ws1 As Worksheet ' ファイルAのワークシート(1)
Dim fb_ws1 As Worksheet ' ファイルBのワークシート(1)
Dim fa_last_row As Long ' ファイルAの最終行
Dim fb_last_row As Long ' ファイルBの最終行
Dim fa_row_idx As Long ' ファイルAのループ用インデックス
Dim fb_row_idx As Long ' ファイルBのループ用インデックス
' ファイルのパスを取得
fa_path = ThisWorkbook.Path & "\ファイルA.xlsx"
fb_path = ThisWorkbook.Path & "\ファイルB.xlsx"
' ファイルの存在確認
If Dir(fa_path) = "" Then
MsgBox "ファイルAが見つかりません。処理を中断します。", vbExclamation
Exit Sub
End If
If Dir(fb_path) = "" Then
MsgBox "ファイルBが見つかりません。処理を中断します。", vbExclamation
Exit Sub
End If
' ファイルを開く
Set fa_wb = Workbooks.Open(fa_path)
Set fb_wb = Workbooks.Open(fb_path)
' ワークシートを取得
Set fa_ws1 = fa_wb.Worksheets(1)
Set fb_ws1 = fb_wb.Worksheets(1)
' 最終行を取得
fa_last_row = fa_ws1.Cells(fa_ws1.Rows.Count, 1).End(xlUp).Row
fb_last_row = fb_ws1.Cells(fb_ws1.Rows.Count, 1).End(xlUp).Row
' 総当たりでデータを比較
' ファイルAのデータを1行ずつループ
For fa_row_idx = 1 To fa_last_row
' ファイルBのデータを1行ずつループ
For fb_row_idx = 1 To fb_last_row
' 比較対象のセルの値が一致する場合
If fa_ws1.Cells(fa_row_idx, 1).Value = fb_ws1.Cells(fb_row_idx, 1).Value Then
' テキストを赤に変更
fa_ws1.Cells(fa_row_idx, 1).Font.Color = vbRed
fb_ws1.Cells(fb_row_idx, 1).Font.Color = vbRed
End If
Next fb_row_idx
Next fa_row_idx
' 新しいファイルとして保存
fa_wb.SaveAs ThisWorkbook.Path & "\ファイルA_照合後.xlsx"
fb_wb.SaveAs ThisWorkbook.Path & "\ファイルB_照合後.xlsx"
' ファイルを閉じる
fa_wb.Close SaveChanges:=False
fb_wb.Close SaveChanges:=False
' 処理完了メッセージ
MsgBox "処理が完了しました。", vbInformation
End Sub
実行結果は次の通りです。







解説していきます。
' Contents ファイルAとファイルBの列1を総当たりで比較し、一致データを
' 赤色に変更して新しいファイルに保存する
' Version 1.0.0
' Last Update 2024/12/07
' Since 2024/12/07
これは、コードの概要を示すコメントです。処理内容、バージョン情報、最終更新日を記載しており、コード管理に役立ちます。単なるコメントですので、VBAでの処理には何も影響しません。
' 変数宣言
Dim fa_path As String ' ファイルAのパス
Dim fb_path As String ' ファイルBのパス
Dim fa_wb As Workbook ' ファイルAのワークブック
Dim fb_wb As Workbook ' ファイルBのワークブック
Dim fa_ws1 As Worksheet ' ファイルAのワークシート(1)
Dim fb_ws1 As Worksheet ' ファイルBのワークシート(1)
Dim fa_last_row As Long ' ファイルAの最終行
Dim fb_last_row As Long ' ファイルBの最終行
Dim fa_row_idx As Long ' ファイルAのループ用インデックス
Dim fb_row_idx As Long ' ファイルBのループ用インデックス
ここでは、コード内で使用する変数が宣言されています。変数は Dim 変数名 As データ型
の構文で宣言します。これにより、各変数は As
以降で指定したデータ型のデータを格納できるようになります。
なお、各データ型の意味は下表の通りです。
データ型 | 意味 |
---|---|
String | 文字列を扱うデータ型です。ファイルパスや名前などのテキスト情報を格納します。 |
Workbook | Excelのワークブック(ファイル)を表すオブジェクト型です。操作対象のファイルを管理します。 |
Worksheet | Excelのワークシート(1つのシート)を表すオブジェクト型です。シート内のデータや構造を管理します。 |
Long | 数値を扱うデータ型です。-2,147,483,648 から 2,147,483,647 までの範囲の整数を格納できます。 |
' ファイルのパスを取得
fa_path = ThisWorkbook.Path & "\ファイルA.xlsx"
fb_path = ThisWorkbook.Path & "\ファイルB.xlsx"
ここでは、比較対象となるファイルAとファイルBのパスを設定しています。ThisWorkbook.Path
は現在のファイル(データを照合する.xlsm
)のパスを指します。そこに比較対象となるファイル名を追加して、パスとしています。
' ファイルの存在確認
If Dir(fa_path) = "" Then
MsgBox "ファイルAが見つかりません。処理を中断します。", vbExclamation
Exit Sub
End If
If Dir(fb_path) = "" Then
MsgBox "ファイルBが見つかりません。処理を中断します。", vbExclamation
Exit Sub
End If
ここでは、ファイルAとファイルBの存在を確認しています。Dir
関数を使用して指定したパスにファイルが存在するかを判定し、存在しない場合はメッセージボックスを表示して処理を中断します。Dir
関数は、指定したパスにファイルまたはフォルダが存在する場合、その名前を返します。存在しない場合は空文字列(""
)を返すため、ファイルの存在チェックが可能です。
' ファイルを開く
Set fa_wb = Workbooks.Open(fa_path)
Set fb_wb = Workbooks.Open(fb_path)
ここでは、指定されたパスからファイルAとファイルBを開き、それぞれをワークブックオブジェクトに割り当てています。なお、Set
キーワードは、オブジェクト型の変数に値を代入する際に使用します。文字列や数値など、オブジェクト以外の値を代入する場合には Set
は不要です。この場合、wba
およびwbb
は Workbooks.Open
が返すワークブックオブジェクトを格納する変数であるため、Set
を使って代入しています。
' ワークシートを取得
Set fa_ws1 = fa_wb.Worksheets(1)
Set fb_ws1 = fb_wb.Worksheets(1)
ここでは、開いたファイルAとファイルBの最初のシートを取得し、それぞれをワークシートオブジェクトに割り当てています。ここでも、同様にset
キーワードが必要になります。
' 最終行を取得
fa_last_row = fa_ws1.Cells(fa_ws1.Rows.Count, 1).End(xlUp).Row
fb_last_row = fb_ws1.Cells(fb_ws1.Rows.Count, 1).End(xlUp).Row
ここでは、それぞれのシートの最終行を取得しています。Rows.Count
は、シートの最大行数(通常は1,048,576行)を返し、その列の最下行を指定しています。次に、End(xlUp)
を使うことで、指定された列の末尾から上方向にデータが入力されている最後のセルを見つけます。さらに、.Row
を使用して、そのセルの行番号を取得します。この結果、データが入力されている最終行の行番号を変数に格納することができます。
' 総当たりでデータを比較
' ファイルAのデータを1行ずつループ
For fa_row_idx = 1 To fa_last_row
' ファイルBのデータを1行ずつループ
For fb_row_idx = 1 To fb_last_row
' 比較対象のセルの値が一致する場合
If fa_ws1.Cells(fa_row_idx, 1).Value = fb_ws1.Cells(fb_row_idx, 1).Value Then
' テキストを赤に変更
fa_ws1.Cells(fa_row_idx, 1).Font.Color = vbRed
fb_ws1.Cells(fb_row_idx, 1).Font.Color = vbRed
End If
Next fb_row_idx
Next fa_row_idx
ここでは、ファイルAとファイルBの列1を総当たりで比較しています。外側のFor
ループでファイルAの各行を順番に処理し、内側のFor
ループでその行をファイルBの全行と比較しています。つまり、ファイルAの1行目のデータとファイルBの全行を比較した後、次にファイルAの2行目とファイルBの全行を比較する、という流れです。
各繰り返し処理の中で、セルの値(Cells(row_idx_a, 1).Value
とCells(row_idx_b, 1).Value
)を比較し、一致した場合は該当セルの文字色を赤色(vbRed
)に変更します。これにより、一致するデータを視覚的に識別できるようになります。
ただし、この方法はデータの行数が多い場合は、比較の回数が増えるため処理時間が長くなることがあります。そのため、大規模なデータを扱う場合には、配列を使用するのが良いでしょう。配列に関しては、こちらの記事で解説していますので、合わせてご活用ください。
' 新しいファイルとして保存
fa_wb.SaveAs ThisWorkbook.Path & "\ファイルA_照合後.xlsx"
fb_wb.SaveAs ThisWorkbook.Path & "\ファイルB_照合後.xlsx"
ここでは、照合結果を反映したファイルを、新しいファイルとして保存しています。元のファイルを上書きしないようにしています。
' ファイルを閉じる
fa_wb.Close SaveChanges:=False
fb_wb.Close SaveChanges:=False
ここでは、処理が完了した後、開いたファイルを閉じています。SaveChanges:=False
により、変更を保存せずに閉じています。
' 処理完了メッセージ
MsgBox "処理が完了しました。", vbInformation
ここでは、処理が正常に完了したことを知らせるメッセージを表示しています。

以上で、解説は終了です。ありがとうございました。
おわりに


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