所以我有两个工作表。第一个是“ Upsert”,第二个是“ Compare”。
我将每周进行一次比较,因此每次要比较的项目数也不同时,行数也会有所不同。
这两个工作表都有一个带有项目ID(唯一)的C列。我想让宏在“ Upsert”电子表格的列C中找到一个项目ID,如果它在“ Compare”电子表格的C列中找到了相同的项目ID,然后比较整个行以确保所有内容匹配“比较”电子表格(两个工作表上的列顺序相同,希望对您有所帮助)。如果我们正在比较的该行中的任何单元格都不匹配,请在“ Upsert”电子表格中突出显示黄色。每个工作表中有38列。
如果可能的话,也没有以上的优先级: 如果“比较”电子表格中没有找到“ upsert”电子表格中的项目ID,请突出显示这些ID。另外,如果在“比较”电子表格中找到的项目ID在“ upsert”电子表格中找不到,请在“比较”电子表格中突出显示。
请让我知道是否有问题。
答案 0 :(得分:0)
这应该可以解决问题。将代码粘贴到Module
中,应该可以正常使用。
如果在Upsert
上存在一个项目ID ,而在Compare
上不存在:项目ID将在Upsert
上突出显示为红色
如果两个表上都存在一个 Project ID ,则将比较38列(从A开始并向外移动)。如果列不匹配,则相关单元格将在Upsert
上突出显示黄色。如果您的列跨度增加,则需要在38
循环中调整For i
。
我没有包括您的最后一个询问(如果它存在于Compare
上而不是Upsert
上,请在Compare
上以黄色突出显示)。您应该能够使用下面的代码和互联网来弄清楚这一点。
Option Explicit
Sub Compare()
Dim Upsert As Worksheet: Set Upsert = ThisWorkbook.Sheets("Upsert")
Dim Compare As Worksheet: Set Compare = ThisWorkbook.Sheets("Compare")
Dim ProjectIDs As Range: Set ProjectIDs = Upsert.Range("K2:K" & Upsert.Range("K" & Upsert.Rows.Count).End(xlUp).Row)
Dim SearchRange As Range: Set SearchRange = Compare.Range("K:K")
Dim Project As Range, Found As Range, i As Long
Application.ScreenUpdating = False
For Each Project In ProjectIDs
Set Found = SearchRange.Find(Project, Lookat:=xlWhole)
If Not Found Is Nothing Then 'If Project ID is found
For i = 1 To 38 'Compare Columns
If Upsert.Cells(Project.Row, i).Value2 <> Compare.Cells(Found.Row, i).Value2 Then
Upsert.Cells(Project.Row, i).Interior.Color = vbYellow
End If
Next i 'Next Column Comparison
Else 'If a project ID is not found
Project.Interior.Color = vbRed
End If
Next Project
Application.ScreenUpdating = True
MsgBox "Please show an attempt next time", vbCritical
End Sub
运行时间:少于一秒(2,000行)
这可能是通过将列值加载到数组中并通过数组比较(按项)来进行数组处理而加快的。我不知道您期望拥有多少行,这些行最终将决定该行的速度。如果这对您来说很慢,我将提供数组比较而不是逐个单元比较。