错误,比较两张纸

我有两张S和P

我试图比较两张纸之间的Id。 如果我的ID匹配我拉对应的ID的相应的细节,并粘贴在sheet3。

对于这个任务,首先我复制包含在我的工作表“数据”ID的列。 然后我将这个ID与“P”表中的Id进行比较。 比较后,如果ID匹配,那么我将采用“P”表的完整的行细节。

我正在使用下面的代码。

在我的比较中,我可以看到,只是在我的数据表中的一行149中,我从表P中提取的数据不会根据代码被复制。

如果它们是相似的,我也会用我的工作表“P”进行交叉检查,但是我的工作表“P”中的数据也没有问题。

有人能帮我弄清楚,我的代码有什么问题,为什么特别是在第149行,这发生了。 ?

Sub lookup() Dim lLastrow As Long Dim rng As Range Dim i As Long 'Copy lookup values from sheet1 to sheet3 ThisWorkbook.Sheets("S").Select lLastrow = ActiveSheet.Cells(ActiveSheet.Rows.Count, 1).End(xlUp).Row Range("P5:P" & lLastrow).Copy Destination:=Sheets("Data").Range("E5") Range("G5:G" & lLastrow).Copy Destination:=Sheets("Data").Range("H5") 'Go to the destination sheet Sheets("Data").Select For i = 5 To lLastrow 'Search for the value on sheet2 Set rng = Sheets("P").UsedRange.Find(Cells(i, 5).Value & "*", LookAt:=xlWhole) 'If it is found put its value on the destination sheet If Not rng Is Nothing Then Cells(i, 6).Value = rng.Value Cells(i, 1).Value = rng.Offset(0, 1).Value Cells(i, 2).Value = rng.Offset(0, 2).Value Cells(i, 3).Value = rng.Offset(0, 3).Value Cells(i, 4).Value = rng.Offset(0, 9).Value Cells(i, 9).Value = rng.Offset(0, 10).Value Cells(i, 13).Value = rng.Offset(0, 6).Value Cells(i, 14).Value = rng.Offset(0, 5).Value Cells(i, 15).Value = rng.Offset(0, 4).Value Cells(i, 16).Value = rng.Offset(0, 8).Value End If Next i End Sub 

编辑 所以在这里你可以看到,列A中包含ID的列必须在列B中,而列A中,列中的数据实际上应该在列I中。这只发生在这一行。我虽然数据是错误的,删除了整个数据,但仍然与这个特定的行中的新数据存在的问题。 Shee P中的数据存在于相应的列中

虽然我看不到代码会在一行中失败的确切原因,但我已经冒昧地重写代码,以至less摆脱“select”,这是容易出错的。 这个代码应该比原来的更坚固,可能有助于解决这个问题。

你在做两个特定列之间的比较吗? 然后,您可以将UsedRange.Findreplace为Columns(1).Find

 Sub lookup() Dim lLastrow As Long Dim rng As Range Dim i As Long 'Copy lookup values from sheet1 to sheet3 With Sheets("S") lLastrow = .Cells(.Rows.Count, 1).End(xlUp).Row .Range("P5:P" & lLastrow).Copy Destination:=Sheets("Data").Range("E5") .Range("G5:G" & lLastrow).Copy Destination:=Sheets("Data").Range("H5") End with For i = 5 To lLastrow 'Search for the value on sheet2 With Sheets("P") Set rng = .Columns(1).Find(Sheets("Data").Cells(i, 5).Value & "*", LookAt:=xlWhole) End with 'If it is found put its value on the destination sheet If Not rng Is Nothing Then With Sheets("Data") .Cells(i, 6).Value = rng.Value .Cells(i, 1).Value = rng.Offset(0, 1).Value .Cells(i, 2).Value = rng.Offset(0, 2).Value .Cells(i, 3).Value = rng.Offset(0, 3).Value .Cells(i, 4).Value = rng.Offset(0, 9).Value .Cells(i, 9).Value = rng.Offset(0, 10).Value .Cells(i, 13).Value = rng.Offset(0, 6).Value .Cells(i, 14).Value = rng.Offset(0, 5).Value .Cells(i, 15).Value = rng.Offset(0, 4).Value .Cells(i, 16).Value = rng.Offset(0, 8).Value End with End If Next i End Sub 

只是猜测。 你可以这样试试:

 With Worksheets("P") Set rng = .UsedRange.Find(.Cells(i, 5).Value & "*", LookAt:=xlWhole) end with 

这可能是工作,这可能是错误的结果的原因。 这就是你如何引用VBA中的范围对象 – https://msdn.microsoft.com/en-us/vba/excel-vba/articles/range-object-excel

@Vityata是正确的一个点,你的问题是下面的行。

更改

 Sheets("P").UsedRange.Find(Cells(i, 5).Value & "*", LookAt:=xlWhole) 

 Set rng = Sheets("P").Cells(i, 5) 

您将“rng”variables设置为该行代码中单元格中的值。

然后你使用这一行代码, If Not rng Is Nothing可以检查“rng”中是否有值,如果存在,那么将数据从表(“P”)移到表(S)。

你不需要通配符等