查找Excel两工作表指定列差异并标记的实现及VBA故障解决
Excel跨工作表区域差异标记问题解决方案
原VBA代码的问题
- 直接对多单元格区域
Range("C3:O102").Value进行等值判断不生效:多单元格区域的Value属性返回的是二维数组,无法直接和单个字符串"-"/"yes"做等值比较,判断条件永远不成立 - 逻辑不符合需求:原代码只要条件成立就会给
AJ3:AJ103整段区域赋值,没有按对应位置的单元格逐一校验差异 - 工作表引用不对应:代码中引用的
Sheet15、Sheet30和实际需要操作的ABC、DEF工作表不匹配,运行时会出现引用错误或者操作对象错误
可行实现方案
方案1:Excel公式实现(无需启用宏,操作更简单)
如果需要行尾统一标记该行存在差异,在DEF工作表的AJ3单元格输入公式:=IF(SUMPRODUCT(--(ABC!C3:O3="-")*--(DEF!C3:O3="yes"))>0,"Discrepancy","")
输入完成后下拉填充到AJ102即可。
如果需要每个差异对应位置单独标记,直接在DEF工作表的C3单元格输入公式=IF(AND(ABC!C3="-",DEF!C3="yes"),"Discrepancy",DEF!C3),然后向右填充到O列,再向下填充到102行即可。
方案2:修正后的VBA代码实现
Sub MarkDiscrepancy() Dim wsABC As Worksheet, wsDEF As Worksheet Dim i As Long, j As Long ' 绑定目标工作表 Set wsABC = ThisWorkbook.Worksheets("ABC") Set wsDEF = ThisWorkbook.Worksheets("DEF") ' 逐行逐列遍历校验C3:O102区域 For i = 3 To 102 wsDEF.Range("AJ" & i).Value = "" For j = 3 To 15 ' 3对应C列,15对应O列 If wsABC.Cells(i, j).Value = "-" And wsDEF.Cells(i, j).Value = "yes" Then ' 如需在差异单元格直接标记,取消下一行注释即可 ' wsDEF.Cells(i, j).Value = "Discrepancy" wsDEF.Range("AJ" & i).Value = "Discrepancy" Exit For ' 该行已找到差异,跳出当前行的列循环提高效率 End If Next j Next i End Sub
内容的提问来源于stack exchange,提问作者MsPatty
相关产品推荐
相关产品推荐

