例文を使って繰り返し業務を時短

【マクロ・VBA】アクティブシートと右隣のシート間で異なるデータに色を付ける

エクセル、マクロ、VBAでシート間のデータをマッチさせてカラーで表示する VBA

両シート記入・シート間マッチング・異なる値に色を付ける

このVBAコードは、2つのシートのデータを比較し、異なる値があればセルに色をつけるマクロです。

Sub シートを比較して違う値に色をつける()

Dim ws1 As Worksheet
Dim ws2 As Worksheet
Dim myList_1 As Variant
Dim myList_2 As Variant
Dim i As Long
Dim j As Long


 Set ws1 = ActiveSheet
 Set ws2 = ActiveSheet.Next

 '各シートのA~C列のデータを配列に格納
 ws1.Select
 myList_1 = ws1.Range("A1", Range("A" & Rows.Count).End(xlUp)).Resize(, 3).Value

 ws2.Select
 myList_2 = ws2.Range("A1", Range("A" & Rows.Count).End(xlUp)).Resize(, 3).Value

 'ActiveSheetに色つける
 For i = 1 To UBound(myList_1)
    '3列ループ
     For j = 1 To 3
        '2つのシートの値が異なる場合、セルに色をつける
         If myList_1(i, j) <> myList_2(i, j) Then
           'エラーが発生した場合は、異なる値なのでセルに色をつける
            On Error Resume Next
            ws1.Cells(i, j).Interior.Color = 65535
         End If
     Next j
 Next i

 'ActiveSheet.Nextに色つける
 For i = 1 To UBound(myList_2)
    For j = 1 To 3
        If myList_1(i, j) <> myList_2(i, j) Then
           On Error Resume Next
           ws2.Cells(i, j).Interior.Color = 65535
        End If
    Next j
 Next i

Set ws1 = Nothing
Set ws2 = Nothing

MsgBox "完了"
End Sub

説明

  • 変数 ws1ws2 を定義し、それぞれシートオブジェクトを格納します。
  • 現在アクティブなシートを ws1 に格納し、その隣のシートを ws2 に格納します。
  • ws1ws2 の A 列から C 列までのデータを配列 myList_1myList_2 に格納します。
  • 配列 myList_1myList_2 をループ処理し、異なる値があればそれぞれのシートの対応するセルに色をつけます。
  • シートオブジェクトを解放します。
  • 処理が終了したことをユーザーに通知するためのメッセージボックスを表示します。

明示的にシート名とセル範囲を指定し、配列を使用して処理速度を向上させたコードです。

Sub シートを比較して違う値に色をつける2()

Dim ws1 As Worksheet
Dim ws2 As Worksheet
Dim myList_1 As Variant
Dim myList_2 As Variant
Dim i As Long
Dim j As Long

Set ws1 = ThisWorkbook.Worksheets("Sheet1")
Set ws2 = ThisWorkbook.Worksheets("Sheet2")

'各シートのA~C列のデータを配列に格納
myList_1 = ws1.Range("A1:C" & ws1.Cells(ws1.Rows.Count, "A").End(xlUp).Row).Value
myList_2 = ws2.Range("A1:C" & ws2.Cells(ws2.Rows.Count, "A").End(xlUp).Row).Value

'Sheet1に色つける
For i = 1 To UBound(myList_1)
For j = 1 To 3
If myList_1(i, j) <> myList_2(i, j) Then
ws1.Cells(i, j).Interior.Color = 65535
End If
Next j
Next i

'Sheet2に色つける
For i = 1 To UBound(myList_2)
For j = 1 To 3
If myList_1(i, j) <> myList_2(i, j) Then
ws2.Cells(i, j).Interior.Color = 65535
End If
Next j
Next i

Set ws1 = Nothing
Set ws2 = Nothing

MsgBox "完了"

End Sub

解説

このコードでは、シート名を “Sheet1” と “Sheet2” に明示的にシート名を指定しています。また、Range オブジェクトの範囲指定方法も変更されています。Range オブジェクトを使用して、範囲を直接指定するのではなく、Cells メソッドを使用して、範囲の上限と下限を取得しています。これにより、範囲の開始セルと終了セルを指定する必要がなく、処理対象の範囲を自動的に決定することができます。また、コードの安定性が向上します。さらに、配列を使用することで、セルを参照するたびに Excel オブジェクトモデルへのアクセスが不要になり、処理速度が向上します。

また、On Error Resume Next ステートメントはエラーを無視するために使用されていましたが、このステートメントはバグの原因となる可能性があるため、除去しています。これにより、エラーが発生した場合にはセルに色がつくようになります。

ダミーデータのダウンロード

コメント

タイトルとURLをコピーしました