错误,比较两张纸
我有两张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
编辑
虽然我看不到代码会在一行中失败的确切原因,但我已经冒昧地重写代码,以至less摆脱“select”,这是容易出错的。 这个代码应该比原来的更坚固,可能有助于解决这个问题。
你在做两个特定列之间的比较吗? 然后,您可以将UsedRange.Find
replace为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)。
你不需要通配符等