masatoz’s blog

プログラミングのメモ、日常の記録

VBAでExcelワークシートの間違い探しをする(差分ハイライト)

事務仕事でよくなんかのチェックリストをエクセルで作りますよね。
で、チェック項目が完了したり、内容の変更があったりして、どんどん更新されていくわけです。
が、更新箇所を人力で探すのは大変です。
これをVBAで片付けちゃおう。


やり方:
1.ワークシートA、A´を比較
2.ワークシートA、A´でセルを一つずつ比較する
3.二つのセルの中身が異なれば、新しい方のセルを好きな色で塗りつぶす(今回は黄色)

Sub 変更箇所チェック()

'   作業ワークシート(シートはお好みで選択する)
    Dim wksOld As Worksheet
    Dim wksNew As Worksheet
'   仮に古いシートが左端(インデックス=1)、新しいシートがその右となり(インデックス=2)にあるとする。
    Set wksOld = ActiveWorkbook.Sheets(1)
    Set wksNew = ActiveWorkbook.Sheets(2)

'   セル参照用のレンジ変数
    Dim r As Range
    Dim rngOld As Range
    Set rngOld = wksOld.UsedRange

'   古いワークシートのセルを一個ずつループ
    For Each r In rngOld
        DoEvents
        
        Dim OldStr As String
        OldStr = r.Value' 古いシートの比較対象セルの中身
        If Len(OldStr) > 0 Then

            'Newシートで比較するセルの行列番号を取得し、
            'Oldシートにある同じ位置のセルを参照する
            Dim row As Long, col As Long
            row = r.row
            col = r.column
           
            Dim rngNew As Range
            Set rngNew = wksNew.Cells(row, col)
            Dim NewStr As String
            NewStr = rngNew.Value'新しいワークシートの比較対象セルの中身

            'StrComp関数で2つのセルの内容が等しいかをチェック
            '等しいときは返値が0になる
            '参考サイト:http://www.239-programing.com/excel-vba/func/func02E.html
            If strcomp(OldStr, NewStr, vbTextCompare) <> 0 Then
                rngNew.Interior.Color = 65535'黄色の定数
            End If
        End If
    Next r

'   後片付け
    Set wksNew = Nothing
    Set wksOld = Nothing
    Set rngOld = Nothing
    Set rngNew = Nothing

End Sub

注意:比較するワークシートのどちらかで列や行がずれてると、セルの位置が変わって関係ないセルと比較してしまい、失敗します。