Vba 基于common'比较两个ExcelSheet中的不常见单元格;id';字段(C列)

Vba 基于common'比较两个ExcelSheet中的不常见单元格;id';字段(C列),vba,excel,Vba,Excel,所以我有两张工作表。第一个是“向上插入”,第二个是“比较” 我将每周做一次比较,所以每次比较的项目数量不同时,行数都会不同 这两个工作表都有一个带有项目ID(唯一)的C列。我想让宏在“Upsert”电子表格的C列中找到一个项目ID,如果它在“比较”电子表格的C列中找到了相同的项目ID,则比较整行,以确保所有内容都与“比较”电子表格匹配(两张表上的列顺序相同,希望能有所帮助)。如果我们要比较的行中有任何单元格不匹配,请在“Upsert”电子表格中突出显示黄色。每个工作表中有38列 不是上述的重大优

所以我有两张工作表。第一个是“向上插入”,第二个是“比较”

我将每周做一次比较,所以每次比较的项目数量不同时,行数都会不同

这两个工作表都有一个带有项目ID(唯一)的C列。我想让宏在“Upsert”电子表格的C列中找到一个项目ID,如果它在“比较”电子表格的C列中找到了相同的项目ID,则比较整行,以确保所有内容都与“比较”电子表格匹配(两张表上的列顺序相同,希望能有所帮助)。如果我们要比较的行中有任何单元格不匹配,请在“Upsert”电子表格中突出显示黄色。每个工作表中有38列

不是上述的重大优先事项,但如果可能: 如果在“upsert”电子表格中有在“compare”电子表格中找不到的项目ID,请突出显示这些ID。此外,如果在“比较”电子表格中找到的项目ID在“upsert”电子表格中找不到,请在“比较”电子表格中突出显示


如果有问题,请告诉我。

这应该可以解决问题。将代码粘贴到
模块中
,并应按原样工作


如果项目ID存在于
Upsert
上,而不存在于
Compare
:项目ID将在
Upsert
上高亮显示红色

如果两张图纸上都有项目ID,将比较38列(从a开始向外移动)。如果列不匹配,相关单元格将在
Upsert
上亮显黄色。如果列跨度增加,则需要调整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
选项显式
子比较()
将Upsert设置为工作表:SETUPSERT=ThisWorkbook.Sheets(“Upsert”)
将比较设置为工作表:设置比较=此工作簿。工作表(“比较”)
将项目的尺寸标注为范围:设置项目=Upsert.Range(“K2:K”和Upsert.Range(“K”和Upsert.Rows.Count).结束(xlUp).Row)
将搜索范围设置为范围:设置搜索范围=比较范围(“K:K”)
Dim项目作为范围,发现作为范围,i作为长度
Application.ScreenUpdating=False
对于Projectds中的每个项目
Set Found=SearchRange.Find(项目,注视:=xlother)
如果未找到,则为“如果找到项目ID”
对于i=1到38'的比较列
如果向上插入.Cells(Project.Row,i).Value2比较.Cells(find.Row,i).Value2,则
Upsert.Cells(Project.Row,i).Interior.Color=vbYellow
如果结束
下一个i’下一列比较
如果找不到项目ID,则为Else
Project.Interior.Color=vbRed
如果结束
下一个项目
Application.ScreenUpdating=True
MsgBox“请下次显示尝试”,vbCritical
端接头
运行时间:对于2000行,不到一秒


通过在数组中加载列值并逐个数组进行比较(按项),这可能会加快速度。我不知道您希望有多少行,这将最终决定此操作的速度。如果这对您来说比较慢,我将进行数组比较,而不是逐单元比较,这是我提供的

非常感谢你!我想知道:我意识到它是K列而不是C列:(.我可以在有C的地方简单地使用K吗?我还想澄清你的I=1到34。34是用来做什么的?最后,如果我的列数从38变为38,那可以吗?K列(见上面的评论)不会更改,但我以后可能会添加更多列进行比较…@urdearboyHey@urdearboy,因此我需要使用的列是k(第11列)。例如,我需要它表示k中的项目id 1440(两个工作表)。如果k列中的两个表中都有1440(可能是不同的行),则比较整行(第A(1)列)尽管列#38.突出显示上插入的差异:)谢谢你!!!!!我真是太感谢你了!!!我在这件事上绞尽脑汁已经很久了,你让这件事变得如此简单!!!!只是为了确认如果6个月后我需要比较更多的列,我会扩展代码中的38?如果出于任何原因K列需要更改为J(我对此表示怀疑,但以防万一)我可以编辑代码中“K”的位置吗?@urdearboyYup。它将比较前38列(相当于
A
列和
AL
)。如果您将此扩展到另外两列,则会将38列更改为40列。