【问题标题】:VBA - Compare two sheets and results paste on new sheetVBA - 比较两张工作表并将结果粘贴到新工作表上
【发布时间】:2019-03-28 12:51:06
【问题描述】:

我有两张“2019 Project Detail”和“2019 Project Detail SOURCE”,结构相同,因为“2019 Project Detail SOURCE”是“2019 Project Detail”的副本。然后我想检查这两张纸之间是否有任何区别。如果有人更改了“2019 年项目详细信息”表上的任何数字/任何内容。如果是这样,则突出显示它们并将更改单元格的引用粘贴到第三张“结果”(即“2019 项目详细信息!AD4”)上。

我有突出显示更改的代码,但我不知道如何将更改粘贴到“结果”表上。

代码:

Sub CompareAndHighlightDifferences()

Dim w1 As Worksheet, w2 As Worksheet, w3 As Worksheet

Set w1 = Sheets("2019 Project Detail")
Set w2 = Sheets("2019 Project Detail SOURCE")
Set w3 = Sheets("Results")

With w1
    For Each cel In .UsedRange
        If cel.Value <> w2.Cells(cel.Row, cel.Column).Value Then cel.Interior.Color = vbBlue

    Next cel
End With

End Sub

请给我一些建议好吗?

非常感谢!

【问题讨论】:

  • "Pate the reference" 是什么意思?将地址写入ws3?
  • 您的意思是,如果单元格 AD4 不同,您希望“AD4”出现在结果中吗?它应该出现在 AD4 单元格中吗?
  • 在您的IF 条件下,添加:w3.cells(&lt;row number&gt;, &lt;column number&gt;).value = cel.value
  • @FunThomas - 我的意思是将更改单元格的地址放入 ws3(即 A 列)。
  • @SJR - 没错,就在结果表上,它应该出现在 A 列中(最好是从 A1 列到 Axxx)。

标签: excel vba


【解决方案1】:

这段代码会将所有更改记录到 w3 中:

Dim row As Long
row = 1

With w1
    For Each cel In .UsedRange
        If cel.Value <> w2.Cells(cel.row, cel.Column).Value Then
            cel.Interior.Color = vbBlue
            w3.Cells(row, 1) = cel.Address
            w3.Cells(row, 2) = cel.Value
            w3.Cells(row, 3) = w2.Cells(cel.row, cel.Column).Value
            row = row + 1
        End If
    Next cel
End With

【讨论】:

  • 虽然这会起作用(我假设它会起作用,因为我还没有测试过 :)),但不建议使用单元格。 Have a look at this
  • @Zac:我知道,我知道。只是想回答这个问题。如果您开始优化此处发布的所有 VBA 代码,您将终生拥有一份(无薪)工作。顺便说一句:如果工作表不是那么大,那么运行时间就很少(对于 150x100 的单元格,它在不到 1 秒的时间内就准备好了,而且代码简单易懂。
【解决方案2】:

可能,其中一个选项将有助于比较更改。 选项 1 将在“结果”工作表的同一单元格中显示两个工作表中的值。选项 2 可以列出不同单元格的名称。

Sub CompareAndHighlightDifferences()
Dim w1 As Worksheet, w2 As Worksheet, w3 As Worksheet
Set w1 = Sheets("Sheet1")
Set w2 = Sheets("Sheet2")
Set w3 = Sheets("Sheet3")
For Each cel In w1.UsedRange
    If cel.Value <> w2.Cells(cel.Row, cel.Column).Value Then
        cel.Interior.Color = vbBlue
        'Option 1
        'w3.Cells(cel.Row, cel.Column).Value = w1.Name & " value: " & cel.Value & " / " & _
        'w2.Name & " value: " & w2.Cells(cel.Row, cel.Column).Value

        'Option 2
        lLastRow = Cells(Rows.Count, 1).End(xlUp).Row
        w3.Cells(lLastRow + 1, 1).Value = Split(cel.Address(True, False), "$")(0) & cel.Row
    End If
Next cel
End Sub

【讨论】:

  • 我建议不要在 FOR 循环中使用:lLastRow = Cells(Rows.Count, 1).End(xlUp).Row。获取循环外的最后一行,并在您进入循环后将其递增。这样可以减少资源消耗。此外,声明所有变量.. 使用 Option Explicit 会有所帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多