比较两张

时间:2017-08-14 07:51:37

标签: excel vba excel-vba

我有两张纸,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

EDIT So here you could see that the row, 149 where the column A containing the ID must be in column B whereas it is in column A, also the column  with data should actually be in column I . This is happening only with this particular row. I though the data is wrong and deleted the whole data but still with the new data in this particular row the problem exist. The data in the Shee P exist in the corresponding columns

3 个答案:

答案 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”) )。

您不需要通配符等。