使用If、IsError、Then循环比对工作表列并复制差异行求助
解决PRD与CRD工作表行匹配并导出差异行的问题
听起来你在处理两个工作表的行匹配和差异导出时卡壳了,我来帮你捋清楚思路,给你一个能直接运行的VBA解决方案。
核心需求再明确
- 从第2行开始,比对PRD和CRD工作表的A列单元格
- A列匹配时,继续校验对应行的B列
- 以下两种情况需把整行复制到第三个工作表(默认命名为
差异表):- A列单元格完全不匹配
- A列匹配,但B列单元格不一致
完整VBA代码实现
Sub 导出差异行() Dim wsPRD As Worksheet, wsCRD As Worksheet, wsDiff As Worksheet Dim lastRowPRD As Long, lastRowCRD As Long, lastRowDiff As Long Dim i As Long, matchCell As Range Dim isMatched As Boolean ' 绑定工作表对象,注意和你的表名完全一致(区分大小写) Set wsPRD = ThisWorkbook.Worksheets("PRD") Set wsCRD = ThisWorkbook.Worksheets("CRD") ' 自动创建"差异表",不存在就新建,存在则继续使用 On Error Resume Next Set wsDiff = ThisWorkbook.Worksheets("差异表") On Error GoTo 0 If wsDiff Is Nothing Then Set wsDiff = ThisWorkbook.Worksheets.Add(After:=wsCRD) wsDiff.Name = "差异表" ' 复制表头(假设PRD和CRD表头结构一致) wsPRD.Rows(1).Copy wsDiff.Rows(1) End If ' 获取各表数据的最后一行位置 lastRowPRD = wsPRD.Cells(wsPRD.Rows.Count, "A").End(xlUp).Row lastRowCRD = wsCRD.Cells(wsCRD.Rows.Count, "A").End(xlUp).Row lastRowDiff = wsDiff.Cells(wsDiff.Rows.Count, "A").End(xlUp).Row + 1 ' 遍历PRD表的每一行数据 For i = 2 To lastRowPRD isMatched = False ' 在CRD表A列查找匹配值,比嵌套循环效率更高 Set matchCell = wsCRD.Range("A:A").Find( _ What:=wsPRD.Cells(i, "A").Value, _ LookIn:=xlValues, _ LookAt:=xlWhole) If Not matchCell Is Nothing Then isMatched = True ' A列匹配,检查B列是否一致 If wsPRD.Cells(i, "B").Value <> wsCRD.Cells(matchCell.Row, "B").Value Then wsPRD.Rows(i).Copy wsDiff.Rows(lastRowDiff) lastRowDiff = lastRowDiff + 1 End If End If ' CRD表中找不到A列匹配项,直接复制行 If Not isMatched Then wsPRD.Rows(i).Copy wsDiff.Rows(lastRowDiff) lastRowDiff = lastRowDiff + 1 End If Next i ' 额外检查CRD表中存在但PRD表没有的行(如果不需要可以删掉这段) For i = 2 To lastRowCRD isMatched = False Set matchCell = wsPRD.Range("A:A").Find( _ What:=wsCRD.Cells(i, "A").Value, _ LookIn:=xlValues, _ LookAt:=xlWhole) If matchCell Is Nothing Then wsCRD.Rows(i).Copy wsDiff.Rows(lastRowDiff) lastRowDiff = lastRowDiff + 1 End If Next i MsgBox "差异行导出完成!", vbInformation End Sub
代码细节说明
- 工作表初始化:自动检测并创建
差异表,避免手动建表的麻烦 - 高效查找:用
Range.Find替代嵌套循环,数据量大时运行速度会快很多 - 双向校验:不仅检查PRD在CRD中没有的行,还额外补充了CRD独有的行导出(不需要的话直接删除最后一段循环即可)
- 容错处理:表头自动复制,确保差异表和原表结构一致
常见问题排查
- 代码没反应?先检查工作表名称是否和代码里的
"PRD"、"CRD"完全一致,大小写也不能错 - 数据从第3行开始?把代码里的
2改成你的起始行号就行 - 复制行格式乱了?可以把
Copy改成Copy Destination:=wsDiff.Rows(lastRowDiff),直接指定目标位置
内容的提问来源于stack exchange,提问作者Andrew Caprario
相关产品推荐
相关产品推荐

