Excel VBA 逆引き集 | 差分の統合

Excel VBA
スポンサーリンク

差分の統合

「新規・削除・変更をそれぞれ別シートに出したけど、最終的に“統合した一覧”が欲しい」——差分を一つの表にまとめるテンプレです。初心者でも理解しやすいように、コード例をかみ砕いて説明します。


差分統合の考え方

  • 前提: すでに「新規」「削除」「変更」の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で高速化。
タイトルとURLをコピーしました