20250822_【VBA】スパとふゆの0からはじめるExcelマクロ(5日目)

【Excel VBA】5日目は「シート比較」に挑戦!スパとふゆの0からはじめるExcelマクロ実況レポート 🍝❄

Excelで2つのシートのデータを見比べて、どこが違うのかを目で探すのは本当に大変ですよね。一箇所見落としただけで大きなミスにつながる可能性もあり、データの突き合わせ作業は時間も神経も使うものです。

もし、この面倒な作業をボタン一つで自動化できたらどうでしょうか?

この記事では、VBAコミュニティ「Excel-Fun.xls*」が開催する初心者向け勉強会「スパとふゆの0からはじめるExcelマクロ」の5日目の様子をレポートします。この記事を読めば、2つのシートの違いを自動で発見し、異なる部分のセルに色を付けてくれる便利なマクロの作り方がわかります。

目次

📅 イベント概要:スパとふゆの0からはじめるExcelマクロ

このイベントは、VBA初心者の「ふゆさん」が講師の「和風スパゲティさん」に教わりながら、ゼロからマクロを学んでいく様子をドキュメンタリー形式で配信する勉強会です。参加者も一緒に学び、成長できる企画となっています。

登場人物

開催情報 毎週金曜日の22時から開催しています。初心者の方でも気軽に参加できる温かい雰囲気の勉強会です。

あわせて読みたい
20250815_【VBA】スパとふゆの0からはじめるExcelマクロ(4日目) https://www.youtube.com/watch?v=_ud_PAYeS5o&list=PLF7umZQFDaaDtrOPIlNx8tPVAgWEe1A5i&index=4 【ExcelVBA】全シートを一括処理!条件分岐で特定のシートだ...

📝 5日目の課題:シート同士を比較せよ!

今回の学習ゴールは、「2つのシートを比較して、値が違うセルの背景を赤く塗る」という、非常に実用的なマクロの作成です。

このマクロを作る上で中心的な学習ポイントとなるのが「二重ループ(For文の入れ子構造)」です。行と列を順番にチェックしていく処理の基本となる、重要なテクニックを学びます。

ステップアップで進化するコード

この勉強会の面白いところは、最初から完璧なコードを目指すのではなく、まず簡単なものから作り、問題点を見つけて改善していく「プロセス」を体験できる点にあります。今回も、Lv.1からLv.3へと段階的にコードを進化させていきました。

🔹 Lv.1:まずは決め打ちで比較

まず和風スパゲティさんは、比較処理の基本を理解するために、Cells(1, 1)のように特定の1セルだけを比較するコードから始めました。

Sub シートを比較する_比較セル固定Ver()
    
    If Worksheets(1).Cells(1, 1).Value <> Worksheets(2).Cells(1, 1).Value Then
        Worksheets(1).Cells(1, 1).Interior.Color = RGB(255, 0, 0)
        Worksheets(2).Cells(1, 1).Interior.Color = RGB(255, 0, 0)
    End If
    
End Sub
Sub シートを比較する_行列ループ数固定Ver()
    
    Dim 行 As Long
    Dim 列 As Long
    
    For 行 = 1 To 10000
    
        For 列 = 1 To 10000
    
            If Worksheets(1).Cells(行, 列).Value <> Worksheets(2).Cells(行, 列).Value Then
                Worksheets(1).Cells(行, 列).Interior.Color = RGB(255, 0, 0)
                Worksheets(2).Cells(行, 列).Interior.Color = RGB(255, 0, 0)
            End If
    
        Next
    
    Next
    
End Sub

ふゆさんがこれを実行し、確かに1セルだけは比較できることを確認。この基本形が理解できた上で、「でも、これでは表全体をチェックできないですよね?」という当然の疑問に繋がっていきます。この課題を次のステップで解決していきます。

🔹 Lv.2:UsedRangeでスマートに(今回のハイライト✨)

Lv.1の「範囲が固定されている」という問題を解決する鍵が、Excelがデータ入力などで使用している範囲を自動で取得してくれる便利な機能「UsedRange」です。これを使うことで、比較するデータの行数や列数が変わっても、マクロを修正することなく対応できるようになります。

和風スパゲティさんのアドバイスは、「プログラミングは上から順に書き下すのではなく、まず中心となる処理(内側)から作り、それを変数やループ(外側)で拡張していくイメージを持つと整理しやすいです」というもの。まさにそのプロセスを辿り、UsedRangeと二重ループを組み合わせた完成形がこちらです。

Sub シートを比較する_行列ループ可変Ver()
    
    Dim 行 As Long
    Dim 列 As Long
    
    Dim 最終行 As Long
    Dim 最終列 As Long
    
    最終行 = Worksheets(1).UsedRange.Rows.Count
    最終列 = Worksheets(1).UsedRange.Columns.Count
    
    For 行 = 1 To 最終行
    
        For 列 = 1 To 最終列
    
            If Worksheets(1).Cells(行, 列).Value <> Worksheets(2).Cells(行, 列).Value Then
                Worksheets(1).Cells(行, 列).Interior.Color = RGB(255, 0, 0)
                Worksheets(2).Cells(行, 列).Interior.Color = RGB(255, 0, 0)
            End If
    
        Next
    
    Next
    
End Sub

【重要!元に戻せないマクロの鉄則】 ここで和風スパゲティさんから重要な注意点が。「マクロの最大の欠点は元に戻るが使えません」。一度マクロでセルに色を塗ってしまうと、Ctrl+Zで元に戻すことはできません。だからこそ、テストを繰り返す開発段階では、状態をリセットする補助マクロを作っておくのがプロの習慣なのだそうです。

Sub 背景色を初期化する()
    
    Worksheets(1).UsedRange.Interior.ColorIndex = 0
    Worksheets(2).UsedRange.Interior.ColorIndex = 0
    
End Sub

このマクロがあれば、何度でもテスト実行とリセットを繰り返せるので、開発が格段に楽になります。

🔹 Lv.3:見た目も大事?(Value vs NumberFormatLocal)

Lv.2のコードでセルの値の比較は完璧になりました。ここで、ふゆさんから鋭い質問が飛び出します。「値が同じでも、カンマ区切りの有無のような書式の違いはどうなるのでしょうか?」

この実務でよくある課題に応えるため、和風スパゲティさんが紹介したのが、セルの表示形式を取得するNumberFormatLocalプロパティです。

しかし、これをIf文に組み込む際に、勉強会ならではの学びの瞬間が訪れました。当初、値の違い「And」表示形式の違い、という条件式を試したところ、うまく機能しません。

それもそのはず。和風スパゲティさんが解説します。「これだと『値』と『表示形式』の両方が違う場合しか赤くなりません。私たちがやりたいのは、どちらか一方でも違っていたら赤くすることなので、AndではなくOrを使うのが正解です」。

この試行錯誤を経て完成した、より精度の高い比較マクロがこちらです。

Sub シートを比較する_値AND表示形式_行列ループ可変Ver()
    
    Dim 行 As Long
    Dim 列 As Long
    
    Dim 最終行 As Long
    Dim 最終列 As Long
    
    最終行 = Worksheets(1).UsedRange.Rows.Count
    最終列 = Worksheets(1).UsedRange.Columns.Count
    
    For 行 = 1 To 最終行
    
        For 列 = 1 To 最終列
    
            If Worksheets(1).Cells(行, 列).Value <> Worksheets(2).Cells(行, 列).Value _
            And Worksheets(1).Cells(行, 列).NumberFormatLocal <> Worksheets(2).Cells(行, 列).NumberFormatLocal Then
                Worksheets(1).Cells(行, 列).Interior.Color = RGB(255, 0, 0)
                Worksheets(2).Cells(行, 列).Interior.Color = RGB(255, 0, 0)
            End If
    
        Next
    
    Next
    
End Sub
Sub シートを比較する_値OR表示形式_行列ループ可変Ver()
    
    Dim 行 As Long
    Dim 列 As Long
    
    Dim 最終行 As Long
    Dim 最終列 As Long
    
    最終行 = Worksheets(1).UsedRange.Rows.Count
    最終列 = Worksheets(1).UsedRange.Columns.Count
    
    For 行 = 1 To 最終行
    
        For 列 = 1 To 最終列
    
            If Worksheets(1).Cells(行, 列).Value <> Worksheets(2).Cells(行, 列).Value _
            Or Worksheets(1).Cells(行, 列).NumberFormatLocal <> Worksheets(2).Cells(行, 列).NumberFormatLocal Then
                Worksheets(1).Cells(行, 列).Interior.Color = RGB(255, 0, 0)
                Worksheets(2).Cells(行, 列).Interior.Color = RGB(255, 0, 0)
            End If
    
        Next
    
    Next
    
End Sub

このように、生徒の疑問からコードが進化し、論理演算子AndOrの使い分けという重要な概念まで学べる、非常に内容の濃いステップアップとなりました。

📣 あなたも参加しませんか?

この記事を読んで「面白そう!」「VBAを基本から学んでみたい」「一緒に勉強する仲間がほしい」と感じた方は、ぜひコミュニティ「Excel-Fun.xls*」に参加してみませんか?

初心者の方を心から歓迎する雰囲気で、たくさんの仲間があなたを待っています。一緒にExcelの世界を楽しみましょう!

🔗 関連リンク集

まとめ

今回は、実務で非常に役立つ「シート比較マクロ」を、簡単なコードから始めて徐々に改良していくステップバイステップ方式で作成しました。UsedRangeと二重ループの組み合わせは、多くの場面で応用できる強力なテクニックです。

今回作成したファイルは、それ自体が便利な「差分チェックツール」になります。和風スパゲティさんも「このファイルさえあれば、今後はシート1と2を空にして、比較したいデータを貼り付けて実行ボタンを押すだけで、誰でも簡単に差分チェックができますよ」と太鼓判。ぜひご自身の業務でも活用してみてください。

最後までお読みいただき、ありがとうございました。 また来週も金曜22時にお会いしましょう!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次