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

アフィリエイト広告を利用しています。
QRコード
【QRコード】PC<-->スマホの切り替えにご利用ください
運営者・ポテ

いつもありがとうございます。

ノンプログラマー向けの「Excel VBA マクロ アプリ事例解説シリーズ」へようこそ。

本稿では、「異なるファイル間でのデータマッチング(照合・突合)」を解説いたします。

Information
  • ノンプログラマー
    プログラミングを専門にしていない人たちのことです。
  • VBAとマクロの違い
    VBAは、Visusal Basic for Application の略で、プログラミング言語のことです。マクロは、VBAを使って作成される「機能」のことです。

「どちらのファイルにデータが不足しているのか確認したい」


「特定の条件で一致する行を取り出したい」

このようなことを経験したことはありませんか? これらは、実際の業務でよくあることですよね。VBAを活用すれば、こうした煩雑な手作業を劇的に効率化することが可能です。

VBAで自分に合ったアプリを作成し、仕事量は半分に、成果は2倍にしていきましょう。初心者でも理解しやすいように、分かりやすく解説していきます。ぜひご覧ください。

なお、本稿で紹介するコードは、AIにプロンプトを入力して生成しています。そちらにご興味がある方は、ぜひこちらもご覧ください!

Information

プロンプト
ChatGPTのようなAIに対して入力する指示や質問のことです。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.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

実行結果は次の通りです。

マクロ実行前のディレクトリ
マクロ実行前のフォルダ
マクロ実行後のディレクトリ
マクロ実行後のフォルダ
マクロ実行前のファイルA.xlsx
マクロ実行前のファイルB.xlsx
マクロ実行後のファイルA.xlsx
マクロ実行後のファイルB.xlsx
運営者・ポテ

解説していきます。

    ' 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 以降で指定したデータ型のデータを格納できるようになります。

Information

変数
「値」や「オブジェクト」を入れておくための「箱」のようなものです。その名の通り、プログラムの中で状況に応じて保持する内容(値やオブジェクト)を変えることができます。例えば、数値や文字列といった値や、Excelのセル、シート、ワークブックといったオブジェクトなど、さまざまなデータを格納するために使われます。

なお、各データ型の意味は下表の通りです。

データ型 意味
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およびwbbWorkbooks.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).ValueCells(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

ここでは、処理が正常に完了したことを知らせるメッセージを表示しています。

運営者・ポテ

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

おわりに

運営者・ポテ

ご覧いただきありがとうございました。

本稿では、「異なるファイル間でのデータマッチング(照合・突合)」を紹介をいたしました。

お問い合わせやご要望等ございましたら、「お問い合わせ/ご要望」またはコメントにて、ご連絡いただければ幸いでございます。

皆様の人生がより一層素晴らしいものになるよう、少しでもお役に立てれば幸いでございます。

なお、当サイトでは様々な情報を発信しております。もしよろしければ、トップページもご確認いただけると幸いでございます。


関連記事

本稿と関連の深い記事です。もしよろしければ、合わせてご活用ください。

VBAプログラミングスキルアップのための参考情報

ここでは参考図書を紹介いたしますが、これらに限らず自分に合うものを選ぶことが重要だと考えております。皆様の、より一層のご成功を心よりお祈りしております。

VBAプログラミングのスキルアップ

学習用としてもハンドブックとしても役立つ便利な書籍がこちらです。価格はやや高めですが、その内容は非常に充実しています。相応のスキルを身に付けるためには、こうしたしっかりとした書籍を一冊持っておくと良いでしょう。



入門書に関しては、どの書籍も大きな違いはありません。あまり迷うことに時間をかけるよりは、手頃なものを一冊選んでみると良いでしょう。VBAの入門書は数多く出版されていますので、興味がある方はぜひチェックしてみてください。

甲乙つけがたい場合、私はインプレス社の「いちばんやさしい」シリーズを選ぶことが多いです。

\チェックしてみよう/

\チェックしてみよう/

\チェックしてみよう/


VBAのプログラミング能力を客観的に証明したい場合には「VBAエキスパート試験」があります。この試験はVBAの知識を公式に認定するものです。VBAの総合的な能力獲得を目指す方に適しています。以下の公式テキストが販売されております。



プログラミングの一般教養

「独学プログラマー」というプログラミングの魅力を解説した書籍があります。これはVBAではなくPythonを題材としていますが、プログラミングの基本的な知識や思考法、仕事の進め方まで幅広く学べます。


こちらの記事でも紹介しております。もしよろしければご覧ください。

QRコード
【QRコード】PC<-->スマホの切り替えにご利用ください

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です