比较 excel 中的 2 个工作表并使用 vba 宏显示不同的结果和摘要

问题描述 投票:0回答:1

嗨,我在 Excel 中有一个疑问,如何比较 Excel 中的两个工作表并显示汇总结果,如果有任何值存在差异,则显示工作表名称

sheet1: eid | name |sal 
        1   |  ab  |100
        2   |de    |300

Sheet2: eid|name |sal
        1  |ab |100
        2 |ra   |300
        3 |df   |400

基于以上2张 需要汇总报告:sheet1 count 2 Sheet2 计数 3 de 存在于sheet1 中,不存在于sheet2 中 id 3行存在于sheet2中但不存在于sheet1中

您能告诉我如何编写 VBA 脚本来在 Excel 中完成此任务吗?

excel vba macros
1个回答
0
投票
Option Explicit

Sub Demo()
    Dim objDic1 As Object, objDic2 As Object, rngData As Range
    Dim i As Long, sKey, aKey
    Dim arrData
    Dim iR As Long: iR = 0
    Set objDic1 = CreateObject("scripting.dictionary")
    Set objDic2 = CreateObject("scripting.dictionary")
    ' Load data from Sheet1
    Set rngData = Sheets("Sheet1").Range("A1").CurrentRegion
    arrData = rngData.Value
    For i = LBound(arrData) + 1 To UBound(arrData)
        sKey = arrData(i, 1) & "|" & arrData(i, 2) & "|" & arrData(i, 3)
        objDic1(sKey) = ""
    Next i
    ' Load data from Sheet2
    Set rngData = Sheets("Sheet2").Range("A1").CurrentRegion
    arrData = rngData.Value
    For i = LBound(arrData) + 1 To UBound(arrData)
        sKey = arrData(i, 1) & "|" & arrData(i, 2) & "|" & arrData(i, 3)
        objDic2(sKey) = ""
    Next i
    ReDim arrRes(objDic1.Count + objDic2.Count + 3, UBound(arrData, 2))
    arrRes(0, 0) = "eid"
    arrRes(0, 1) = "name"
    arrRes(0, 2) = "sal"
    arrRes(0, 3) = "Note"
    ' Comparing data
    For Each sKey In objDic1.keys
        If Not objDic2.exists(sKey) Then
            aKey = Split(sKey, "|")
            iR = iR + 1
            For i = 0 To UBound(aKey)
                arrRes(iR, i) = aKey(i)
            Next
            arrRes(iR, 3) = "Not in Sheet2"
        End If
    Next
    For Each sKey In objDic2.keys
        If Not objDic1.exists(sKey) Then
            aKey = Split(sKey, "|")
            iR = iR + 1
            For i = 0 To UBound(aKey)
                arrRes(iR, i) = aKey(i)
            Next
            arrRes(iR, 3) = "Not in Sheet1"
        End If
    Next
    ' Row count for each sheet
    arrRes(iR + 2, 0) = "SheetName"
    arrRes(iR + 2, 1) = "RowCount"
    arrRes(iR + 3, 0) = "Sheet1"
    arrRes(iR + 3, 1) = objDic1.Count
    arrRes(iR + 4, 0) = "Sheet2"
    arrRes(iR + 4, 1) = objDic2.Count
    ' Write output to sheet
    Sheets.Add
    Range("A1").Resize(iR + 5, 4).Value = arrRes
End Sub

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.