You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改Excel VBA脚本实现两工作表差异比对并复制整行到指定页

修改后可直接运行的VBA代码

以下代码完全匹配你现有公式的三列匹配逻辑,支持输出完整16列数据+差异标识列:

Sub GetExcelSheetDiff()
    Dim dictOld As Object, dictNew As Object
    Dim i As Long, lastRow As Long, outputRow As Long
    Dim wsOld As Worksheet, wsNew As Worksheet, wsOutput As Worksheet
    Dim key As String
    
    ' 初始化字典存匹配键
    Set dictOld = CreateObject("Scripting.Dictionary")
    Set dictNew = CreateObject("Scripting.Dictionary")
    ' 绑定工作表
    Set wsOld = ThisWorkbook.Worksheets("Old")
    Set wsNew = ThisWorkbook.Worksheets("New")
    ' 创建/清空差异输出表
    On Error Resume Next
    Set wsOutput = ThisWorkbook.Worksheets("DiffResult")
    If Err.Number <> 0 Then
        Set wsOutput = ThisWorkbook.Worksheets.Add(after:=wsNew)
        wsOutput.Name = "DiffResult"
    End If
    On Error GoTo 0
    wsOutput.Cells.Clear
    outputRow = 1
    ' 写入表头:复制原表前16列表头,第17列加标识
    wsOld.Range(wsOld.Cells(1, "A"), wsOld.Cells(1, "P")).Copy wsOutput.Cells(1, "A")
    wsOutput.Cells(1, "Q") = "差异类型"
    outputRow = outputRow + 1
    
    ' 存储Old表所有匹配键
    lastRow = wsOld.Cells(wsOld.Rows.Count, "H").End(xlUp).Row
    For i = 2 To lastRow ' 若表头行数不同,自行修改起始行号
        key = Join(Array(wsOld.Cells(i, "B"), wsOld.Cells(i, "C"), wsOld.Cells(i, "H")), "|")
        If Not dictOld.Exists(key) Then dictOld.Add key, i
    Next i
    
    ' 存储New表所有匹配键
    lastRow = wsNew.Cells(wsNew.Rows.Count, "H").End(xlUp).Row
    For i = 2 To lastRow
        key = Join(Array(wsNew.Cells(i, "B"), wsNew.Cells(i, "C"), wsNew.Cells(i, "H")), "|")
        If Not dictNew.Exists(key) Then dictNew.Add key, i
    Next i
    
    ' 找removed数据:Old有New没有
    For Each key In dictOld.Keys
        If Not dictNew.Exists(key) Then
            wsOld.Range(wsOld.Cells(dictOld(key), "A"), wsOld.Cells(dictOld(key), "P")).Copy wsOutput.Cells(outputRow, "A")
            wsOutput.Cells(outputRow, "Q") = "removed(删除)"
            outputRow = outputRow + 1
        End If
    Next key
    
    ' 找added数据:New有Old没有
    For Each key In dictNew.Keys
        If Not dictOld.Exists(key) Then
            wsNew.Range(wsNew.Cells(dictNew(key), "A"), wsNew.Cells(dictNew(key), "P")).Copy wsOutput.Cells(outputRow, "A")
            wsOutput.Cells(outputRow, "Q") = "added(新增)"
            outputRow = outputRow + 1
        End If
    Next key
    
    ' 自动调整列宽
    wsOutput.UsedRange.EntireColumn.AutoFit
    MsgBox "差异提取完成,共找到" & outputRow - 2 & "条差异数据", vbInformation
End Sub

使用注意事项

  • 代码默认数据第1行为表头,实际数据从第2行开始,如果你的表结构不同,自行修改For i = 2 To lastRow里的起始行号即可
  • 匹配键默认和你现有公式逻辑一致,取B、C、H三列拼接判断,如果需要调整匹配字段,修改key = Join(Array(wsOld.Cells(i, "B"), wsOld.Cells(i, "C"), wsOld.Cells(i, "H")), "|")里的列标识即可
  • 代码默认完整数据为A到P共16列,如果实际列范围不同,修改对应复制行里的列范围即可

内容的提问来源于stack exchange,提问作者Josh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 16:27:01