hiko-blog

VBA業務改善

MENU

KEY列の比較とリスト化

Sub KEY列の比較とリスト化()
    Dim ws1 As Worksheet, ws2 As Worksheet, wsResult As Worksheet
    Dim cell1 As Range, cell2 As Range
    Dim keyColumn As Integer
    Dim notFoundInSheet1 As String, notFoundInSheet2 As String
    Dim resultRow, resultRow2 As Long
    
    ' Sheet1とSheet2を指定
    Set ws1 = Worksheets("Sheet1")
    Set ws2 = Worksheets("Sheet2")
    
    ' 新しいシートを作成
    Set wsResult = Worksheets.Add
    wsResult.Name = "DifferenceList"
    
    ' KEY列の列番号を指定(例: A列なら1)
    keyColumn = 3
    
    ' Sheet1に存在しない値を格納する変数
    notFoundInSheet1 = ""
    
    ' Sheet2に存在しない値を格納する変数
    notFoundInSheet2 = ""
    
    ' 結果シートのヘッダーを設定
    wsResult.Range("A1").Value = "Sheet1 にのみ存在"
    wsResult.Range("B1").Value = "Sheet2 にのみ存在"
    
    ' 結果シートの行数
    resultRow = 2
    resultRow2 = 2
    
    ' Sheet2の各セルについてループ
    For Each cell2 In ws2.UsedRange.Columns(keyColumn).Cells
        Dim foundInSheet1 As Boolean
        foundInSheet1 = False
        
        ' Sheet1で同じKEYを探す
        For Each cell1 In ws1.UsedRange.Columns(keyColumn).Cells
            If cell1.Value = cell2.Value Then
                foundInSheet1 = True
                Exit For
            End If
        Next cell1
        
        ' Sheet1に存在しない場合は差異を赤でハイライト-------------
        If Not foundInSheet1 Then
            cell2.Interior.Color = RGB(255, 0, 0) ' 赤でハイライト
            ' 結果シートに追加
            wsResult.Cells(resultRow, 2).Value = cell2.Value
            resultRow = resultRow + 1
        End If
    Next cell2
    
    ' Sheet1に存在しない値をチェック
    For Each cell1 In ws1.UsedRange.Columns(keyColumn).Cells
        Dim foundInSheet2 As Boolean
        foundInSheet2 = False
        
        ' Sheet2で同じKEYを探す
        For Each cell2 In ws2.UsedRange.Columns(keyColumn).Cells
            If cell1.Value = cell2.Value Then
                foundInSheet2 = True
                Exit For
            End If
        Next cell2
        
        ' Sheet2にも存在しない場合は差異を赤でハイライト-------------
        If Not foundInSheet2 Then
            cell1.Interior.Color = RGB(255, 0, 0) ' 赤でハイライト
            ' 結果シートに追加
            wsResult.Cells(resultRow2, 1).Value = cell1.Value
            resultRow2 = resultRow2 + 1
        End If
    Next cell1
    
    ' 結果を表示
    If resultRow > 2 Then
        MsgBox "Sheet1とSheet2の差異があります。" & vbLf & "リストを確認してください。", vbInformation, "比較結果"
    Else
        MsgBox "Sheet1とSheet2は同じKEYを持っています。", vbInformation, "比較結果"
        ' 不要な結果シートを削除
        Application.DisplayAlerts = False
        wsResult.Delete
        Application.DisplayAlerts = True
    End If
End Sub