我有两张纸,S和P.
我想比较两张纸之间的ID。如果ID与我匹配,则拉出匹配ID的相应详细信息并将其粘贴到sheet3中。
对于此任务,首先我在我的工作表中复制了包含ID的列"数据"。然后我将这个ID与Sheet中的Id进行了比较" P"。比较后,如果ID匹配,那么我将获取Sheet" 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
答案 0 :(得分:1)
虽然我无法看到代码在一行中失败的确切原因,但我已经冒昧地重写您的代码以至少摆脱“选择”,这很容易错误。 此代码应该比原始代码更坚固,并且可能有助于解决此问题。
您是否在两个特定列之间进行比较?然后,您可以将UsedRange.Find
替换为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
答案 1 :(得分:0)
猜猜。你能尝试这样:
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
答案 2 :(得分:0)
@Vityata是正确的,你的问题就在下面。
更改
Sheets("P").UsedRange.Find(Cells(i, 5).Value & "*", LookAt:=xlWhole)
到
Set rng = Sheets("P").Cells(i, 5)
您正在将“rng”变量设置为该行代码中单元格中的值。
然后使用这行代码If Not rng Is Nothing
检查“rng”中是否有值,如果有,则将数据从表格(“P”)移动到表格(“S”) )。
您不需要通配符等。