【问题标题】:Compare data in two sheets and highlight differences in mismatches比较两张表中的数据并突出显示不匹配的差异
【发布时间】:2016-07-13 18:59:47
【问题描述】:

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

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

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

我有两张 Excel 表格:

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

例子:

表 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 中突出显示。

结果会将以下单元格变为红色:

表 1:

  • C2
  • A8

表 2:

  • A5
  • A9

再次感谢。

【问题讨论】:

  • 你有没有尝试过?请向我们展示您的尝试以及您的具体编程问题是什么。
  • Excel VBA 宏与 Google 电子表格无关。 Choose tags appropriately.
  • 您的编辑不会改变任何东西。将流程分解成更小的部分,让每个部分一次完成一个,然后最终您将拥有一个可以完成所有工作的完整程序。如果您在代码中遇到特定问题,请随时在此处发布,我相信有人会提供帮助。如果您想学习如何在 VBA 中编写代码,请继续努力并尝试。这里的人在这方面有多年的经验,这就是为什么他们知道如何做的这么快。他们很乐意提供帮助,但我们有自己的工作,没有报酬来做你的工作。
  • 好的,我试试。这实际上不是我的工作,但我希望这段代码检查我用于工作的工作表以比较可能的错误。当我能得到任何接近我正在寻找的代码的东西时,我会回帖。
  • 不要吹毛求疵,但事实上这是你的工作;您正在尝试自动化和改进它,这是值得称赞的。你学到的任何东西都将在未来的努力中非常有用,努力工作将是值得的。如果有人给你代码,你不会学到任何东西[或至少不会学到很多东西]。当/如果您确实遇到问题时,请提出一个新问题,因为那时可能不会看到这个问题。

标签: excel vba macros google-sheets compare


【解决方案1】:

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

它检查两张表中的列表集(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

【讨论】:

  • 如果您还有其他问题,您应该提出问题,而不是发布其他问题的答案。话虽如此,请考虑使用此处的方法:stackoverflow.com/questions/14931700/… 来查找值而不是循环。此外,如果您的代码正常工作,您的问题应该继续进行代码审查:codereview.stackexchange.com
  • 我为你的态度和努力鼓掌。当您向他们提供反馈以尝试首先自己弄清楚时,很多人就放弃了。而且您确实找到了解决方案...荣誉。
  • 谢谢。确实,您可以从尝试自己中学到更多。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多