両シート記入・シート間マッチング・異なる値に色を付ける
この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
説明
- 変数
ws1
とws2
を定義し、それぞれシートオブジェクトを格納します。 - 現在アクティブなシートを
ws1
に格納し、その隣のシートをws2
に格納します。 ws1
とws2
の A 列から C 列までのデータを配列myList_1
とmyList_2
に格納します。- 配列
myList_1
とmyList_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 ステートメントはエラーを無視するために使用されていましたが、このステートメントはバグの原因となる可能性があるため、除去しています。これにより、エラーが発生した場合にはセルに色がつくようになります。
コメント