差分の統合
「新規・削除・変更をそれぞれ別シートに出したけど、最終的に“統合した一覧”が欲しい」——差分を一つの表にまとめるテンプレです。初心者でも理解しやすいように、コード例をかみ砕いて説明します。
差分統合の考え方
- 前提: すでに「新規」「削除」「変更」の3シートに差分が出ている。
- 統合: それぞれの差分を1つのシートにまとめ、差分種別を列に追加。
- メリット: 一覧でフィルタやソートができ、レポートや承認フローに便利。
共通ユーティリティ(速度・安全)
Option Explicit
Private Sub SpeedOn()
Application.ScreenUpdating = False
Application.EnableEvents = False
Application.Calculation = xlCalculationManual
End Sub
Private Sub SpeedOff()
Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = True
Application.ScreenUpdating = True
End Sub
Private Function EnsureSheet(ByVal name As String, Optional ByVal clear As Boolean = True) As Worksheet
Dim ws As Worksheet
On Error Resume Next
Set ws = Worksheets(name)
On Error GoTo 0
If ws Is Nothing Then
Set ws = Worksheets.Add(After:=Worksheets(Worksheets.Count))
ws.Name = name
End If
If clear Then ws.Cells.Clear
Set EnsureSheet = ws
End Function
VB基本テンプレ:差分統合シートを作成
Sub MergeDiffSheets()
SpeedOn
'差分シートを前提に
Dim wsNew As Worksheet: Set wsNew = Worksheets("新規(Bのみ)")
Dim wsDel As Worksheet: Set wsDel = Worksheets("削除(Aのみ)")
Dim wsChg As Worksheet: Set wsChg = Worksheets("変更差分")
'統合シート
Dim wsOut As Worksheet: Set wsOut = EnsureSheet("差分統合", True)
wsOut.Range("A1:F1").Value = Array("差分種別", "コード", "項目", "旧値", "新値", "差分")
Dim rOut As Long: rOut = 2
'新規
Dim lastNew As Long: lastNew = wsNew.Cells(wsNew.Rows.Count, 1).End(xlUp).Row
Dim i As Long
For i = 2 To lastNew
wsOut.Cells(rOut, 1).Value = "新規"
wsOut.Cells(rOut, 2).Value = wsNew.Cells(i, 1).Value
wsOut.Cells(rOut, 3).Value = "行全体"
wsOut.Cells(rOut, 4).Value = "" '旧値なし
wsOut.Cells(rOut, 5).Value = wsNew.Cells(i, 2).Value
wsOut.Cells(rOut, 6).Value = "" '差分なし
rOut = rOut + 1
Next
'削除
Dim lastDel As Long: lastDel = wsDel.Cells(wsDel.Rows.Count, 1).End(xlUp).Row
For i = 2 To lastDel
wsOut.Cells(rOut, 1).Value = "削除"
wsOut.Cells(rOut, 2).Value = wsDel.Cells(i, 1).Value
wsOut.Cells(rOut, 3).Value = "行全体"
wsOut.Cells(rOut, 4).Value = wsDel.Cells(i, 2).Value
wsOut.Cells(rOut, 5).Value = "" '新値なし
wsOut.Cells(rOut, 6).Value = "" '差分なし
rOut = rOut + 1
Next
'変更
Dim lastChg As Long: lastChg = wsChg.Cells(wsChg.Rows.Count, 1).End(xlUp).Row
For i = 2 To lastChg
wsOut.Cells(rOut, 1).Value = "変更"
wsOut.Cells(rOut, 2).Value = wsChg.Cells(i, 1).Value
wsOut.Cells(rOut, 3).Value = wsChg.Cells(i, 2).Value
wsOut.Cells(rOut, 4).Value = wsChg.Cells(i, 3).Value
wsOut.Cells(rOut, 5).Value = wsChg.Cells(i, 4).Value
wsOut.Cells(rOut, 6).Value = wsChg.Cells(i, 5).Value
rOut = rOut + 1
Next
wsOut.Columns.AutoFit
SpeedOff
MsgBox "差分統合完了: 件数=" & rOut - 2
End Sub
VB例題で練習
'例1:新規・削除・変更の差分を統合シートにまとめる
Sub Example_MergeDiff()
MergeDiffSheets
End Sub
VB初心者向けポイント
- 差分種別列: 「新規」「削除」「変更」を明示するとフィルタで絞り込みやすい。
- 旧値・新値: 変更は両方残す。新規は旧値なし、削除は新値なし。
- 差分列: 数値なら差分(新−旧)を出すと便利。
実務の落とし穴と対策
- シート名が違うとエラー → 必ず統合前にシート名を確認。
- 列構成が違うとズレる → 出力列を固定して「差分種別」「コード」「項目」「旧値」「新値」「差分」に揃える。
- 大量行で遅い → SpeedOn/Offで高速化。
