比较两张数据并突出显示不匹配的差异

时间:2016-07-13 18:59:47

标签: excel vba macros google-sheets compare

我已经检查了其他问题中给出的答案,但由于我是excel vba宏的新手,我真的找不到使用提供的解决方案解决问题的方法。

编辑:我无法自己编写代码。我在一个月前开始使用宏,从不同的帖子复制和粘贴,并根据需要进行编辑,通常需要修复许多错误。这非常令人沮丧,但我认为这个问题太大了,无法自己完成。

提前感谢您的帮助和分享知识。

我有两张excel表:

  1. 包含不同的列,我需要检查其中的三列以匹配值
  2. 两者中的条目数(行数)可能不同(长度不同)
  3. 值可能已排序,也可能未排序
  4. 对于行A中的每个值,宏应检查行B和C中的值,并与sheet2进行比较,并将相同的例程作为工作表2中的参考值与工作表1进行比较。
  5. 行A是数字,B是数字,C是文本
  6. 示例:

    第1页

        A         B            C        D        E  
    1  Code     Revision     Status  
    2  102        0            C  
    3  102        1            A  
    4   89        0            A  
    5  216        0            C  
    6  216        1            B  
    7  216        2            A  
    8  217        0            B  
    

    第2页

        A         B            C        D        E
    1  Code     Revision     Status  
    2  102        0            A  
    3  102        1            A  
    4   89        0            A  
    5   90        0            A  
    6  216        0            C  
    7  216        1            B  
    8  216        2            A  
    9   16        0            A  
    

    宏运行后,Sheet 1和Sheet 2中的结果应为:

    1. 工作表2中A列中缺少的所有值在工作表1中都应以其背景着色,例如红色。
    2. 工作表1中A列中缺少的所有值在工作表2中都应以其背景着色,例如红色。
    3. 同样,对于A列中两个工作表中匹配的值,每张工作表中缺少的“修订版”(B列)应以与之前的第1点和第2点相同的方式突出显示
    4. 最后,对于两个工作表中同时匹配“代码”和“修订版”(A列和B列)的行,如果“状态”(C列)不匹配,请在工作表1中突出显示。
    5. 结果会使以下单元格变红:

      表1:

      • C2
      • A8

      表2:

      • A5
      • A9

      再次感谢。

1 个答案:

答案 0 :(得分:0)

好的,我可以设法准备这些或多或少做我想要的代码,并进行一些修改以加速测试:

它检查两张表中的一组列表(3列),并验证此帖中先前所述的所有条件是否匹配。

如果发生匹配,它会在E列中添加一个值为“Ok”的新值。

这与Excel工作表中的条件格式相结合,突出显示匹配值为A,B和C的行。

代码似乎有效并且可能会采取一些改进措施,但由于我必须处理数千行,我担心这会花费太长时间。

是否有更有效的方法,而不是遍历所有行?

这是代码:

Sub Compare()

' Declare all the variables needed
  Dim rng1 As Range, rng2 As Range, rngName As Range, i As Integer, j As Integer

Dim varCode1 As Integer
Dim varRevision1 As Integer
Dim varStatus1 As String

Dim varCode2 As Integer
Dim varRevision2 As Integer
Dim varStatus2 As String

' Process second sheet
 For i = 2 To Sheets("Sheet2").Range("A" & Rows.Count).End(xlUp).Row
    Set rng1 = Sheets("Sheet2").Range("A" & i)
    varCode2 = Sheets("Sheet2").Range("A" & i).Value
    varRevision2 = Sheets("Sheet2").Range("B" & i).Value
    varStatus2 = Sheets("Sheet2").Range("C" & i).Value
    ' MsgBox "Code " & varCode2 & ", Rev. " & varRevision2 & ", Status " & varStatus2
    For j = 2 To Sheets("Sheet1").Range("A" & Rows.Count).End(xlUp).Row
        Set rng2 = Sheets("Sheet1").Range("A" & j)
        If rng1.Value = rng2.Value Then
        varCode1 = rng2.Copy
        varRevision1 = Sheets("Sheet1").Range("B" & j).Value
        varStatus1 = Sheets("Sheet1").Range("C" & j).Value
        ' This will just write 'Ok' in cells with matches between column A and B

        If varRevision1 = varRevision2 And varStatus1 = varStatus2 Then
            Worksheets("Sheet2").Range("E" & i).Value = "Ok"
        End If

        End If

        Set rng2 = Nothing
    Next j
    Set rng1 = Nothing
Next i

' Process first sheet
For i = 2 To Sheets("Sheet1").Range("A" & Rows.Count).End(xlUp).Row
    Set rng1 = Sheets("Sheet1").Range("A" & i)
    varCode1 = Sheets("Sheet1").Range("A" & i).Value
    varRevision1 = Sheets("Sheet1").Range("B" & i).Value
    varStatus1 = Sheets("Sheet1").Range("C" & i).Value
    ' MsgBox "Code " & varCode2 & ", Rev. " & varRevision2 & ", Status " & varStatus2
    For j = 2 To Sheets("Sheet2").Range("A" & Rows.Count).End(xlUp).Row
        Set rng2 = Sheets("Sheet2").Range("A" & j)
        If rng1.Value = rng2.Value Then
        varCode2 = rng2.Copy
        varRevision2 = Sheets("Sheet2").Range("B" & j).Value
        varStatus2 = Sheets("Sheet2").Range("C" & j).Value
        ' This will just write 'Ok' in cells with matches between column A and B

        If varRevision2 = varRevision1 And varStatus2 = varStatus1 Then
            Worksheets("Sheet1").Range("E" & i).Value = "Ok"
        End If

        End If

        Set rng2 = Nothing
    Next j
    Set rng1 = Nothing
Next i


End Sub