所以我有两个工作表。第一个是"Upsert",第二个是"Compare"。
我每周都会做这个比较,所以每次的行数都会不同,也就是说要比较的项目数量会不同。
这两个工作表都有一个带有项目ID(唯一(的C列。我想做的是,宏在"Upsert"电子表格的C列中找到一个项目ID,如果它在"Compare"电子表格中的C列找到相同的项目ID,然后比较整行,以确保所有内容都与"Compare(比较("电子表格相匹配(两张表上的列顺序相同,希望这会有所帮助(。如果我们正在比较的行中的任何单元格不匹配,请在"Upsert"电子表格中突出显示黄色。每个工作表有38列。
不是上述的重大优先事项,但如果可能的话:如果"upstart"电子表格中存在"compare"电子表格未找到的项目ID,请突出显示这些ID。此外,如果在"比较"电子表格中找到的项目ID在"追加"电子表格上找不到,请在"比较"电子表格中突出显示。
如果有问题,请告诉我。
这样就可以了。将代码粘贴到Module
中,并应按原样工作。
如果Upsert
上存在项目ID而Compare
上不存在:项目ID将在Upsert
上突出显示红色
如果两张图纸上都存在项目ID,则将比较38列(从a开始并向外移动(。如果列不匹配,则有问题的单元格将在Upsert
上突出显示黄色。如果列跨度增加,则需要调整For i
循环中的38
。
我没有包括您的最后一个请求(如果它存在于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
运行时间:对于2000行,不到一秒钟
这可能会通过在数组中加载列值并进行逐数组比较(按项(来加快速度。我不知道你期望有多少行,这将最终决定这一过程的速度。如果这对你来说很慢,我会进行数组比较,而不是逐单元格比较,这就是我所提供的。