2つのシートを比較し,各セル内の数値・文字列に差分があればセル背景色を付けます.
罫線や列幅等の影響は受けません.

目次

  1. 使い方
  2. コンフィグ
  3. 使用上の注意
  4. マクロ
    1. VBA
    2. Pythonでの実装

使い方

  1. diff.xlsmをダウンロードします.
  2. 差分をとりたいExcelの表をnewシートとoldシートに貼り付けます.
  3. configシートにあるマクロ実行ボタンを押下してください.

差分があるセルには色がつく

コンフィグ

比較した範囲全体に外枠をつけています.
罫線の機能で枠をつけるため,既存の罫線を破壊してしまいますから,このマクロで納品用のシートを作成するときはconfigシートにある枠囲み設定をTRUEからFALSEにしてください.(その場合でも,一度TRUEのままマクロを走らせて,データを目視しておくべきです.)

コード中,コンフィグに挙げられている変数は変更できます.
最終行と最終列は「0」のままにしておけば,最終セルを自動取得してくれます.
シートへ支給データをペーストするとき,値貼り付けせずに書式ごとペーストした場合は最終セルが非常に遠い位置になり,マクロが重くなると思いますので,このような場合にも適宜数値を変更して使用してください.

使用上の注意

このマクロで差分を検出するのは文字情報だけなので,コピペする際には値貼り付けがよいでしょう.
普通のペーストだと,セルを非表示にするという書式設定もペーストしてしまうので,万一非表示セルに差分が出ていたとき見えません.

比較するのはテキストです.
列幅,セル背景色,罫線,コメント等の影響は受けません.

また,比較している文字情報は入力値ではなく表示値です.
数式や日付がセルに入っている場合,数式そのものやシリアル値ではなく,結果として表示されている値について比較を行います.

マクロ

VBA

マクロのコードは以下の通りです.

Sub 差分セル検出()

' --- 変数宣言 ---

Dim conf_ws As Worksheet: Set conf_ws = Worksheets("config")
Dim new_ws As Worksheet: Set new_ws = Worksheets("new")
Dim old_ws As Worksheet: Set old_ws = Worksheets("old")

Dim start_row As Long
Dim end_row As Long
Dim start_column As Long
Dim end_column As Long

Dim diff_cell_color As Variant
Dim diff_area_border As Boolean

Dim i, j As Long

' --- コンフィグ ---

start_row = conf_ws.Cells(5, 3) ' 開始行(DL時は1)
end_row = conf_ws.Cells(6, 3) ' 最終行(DL時の0だと自動取得)
start_column = conf_ws.Cells(8, 3) ' 開始列(DL時は1)
end_column = conf_ws.Cells(9, 3) ' 最終列(DL時の0だと自動取得)
diff_area_border = conf_ws.Cells(11, 3) ' 差分検出範囲全体を枠で囲うかどうか(DL時はTRUE)
diff_cell_color = RGB(255, 165, 0) ' 差分セルに塗る背景色

' --- 処理 ---

' 最終行・列の自動取得
If end_row < 1 Then
If new_ws.UsedRange.Rows.Count >= old_ws.UsedRange.Rows.Count Then
end_row = new_ws.UsedRange.Rows(new_ws.UsedRange.Rows.Count).Row
Else
end_row = old_ws.UsedRange.Rows(old_ws.UsedRange.Rows.Count).Row
End If
End If

If end_column < 1 Then
If new_ws.UsedRange.Columns.Count >= old_ws.UsedRange.Columns.Count Then
end_column = new_ws.UsedRange.Columns(new_ws.UsedRange.Columns.Count).Column
Else
end_column = old_ws.UsedRange.Columns(old_ws.UsedRange.Columns.Count).Column
End If
End If

' 差分セルに色付け
For i = start_row To end_row
For j = start_column To end_column
If new_ws.Cells(i, j) <> old_ws.Cells(i, j) Then
new_ws.Cells(i, j).Interior.Color = diff_cell_color
End If
Next j
Next i

' 比較範囲全体に外枠
If diff_area_border Then
new_ws.Activate
new_ws.Range(Cells(start_row, start_column), Cells(end_row, end_column)).BorderAround Weight:=xlMedium
End If

MsgBox "マクロを実行しました!"

End Sub

Pythonでの実装

ほとんど同じことをopenpyxlを用いてPythonのスクリプトで実行する場合の例です.
2枚のCSVファイルから差分を検出し,Excelのファイルとして書き出します.

import csv
from openpyxl import Workbook
from openpyxl.styles import PatternFill

wb = Workbook()
new_sheet = wb.active
new_sheet.title = 'new'
wb.create_sheet('old')
old_sheet = wb['old']

with open('new.txt', newline='', encoding="utf-8") as new_csv:
dat = csv.reader(new_csv, delimiter=',', quotechar='"')
for line in dat:
new_sheet.append(line)

with open('old.txt', newline='', encoding="utf-8") as old_csv:
dat = csv.reader(old_csv, delimiter=',', quotechar='"')
for line in dat:
old_sheet.append(line)

r1 = new_sheet.max_row
r0 = old_sheet.max_row
c1 = new_sheet.max_column
c0 = old_sheet.max_column

r = r1 if r1 > r0 else r0
c = c1 if c1 > c0 else c0

fill = PatternFill(patternType='solid', fgColor='00f07f', bgColor='00f07f')

for i in range(1,r+1):
for j in range(1,c+1):
if new_sheet.cell(i,j).value != old_sheet.cell(i,j).value:
new_sheet.cell(i,j).fill = fill

wb.save('diff.xlsx')