VLOOKUP 删除与引用值不匹配的值

VLOOKUP to Delete Values That Don't Match Referenced Values

我正在尝试获取 SourceSheet.Range("C2:C" & LastRowSource) 中保存的所有值,并将它们与 ReferenceSheet.Range("F7:F" & LastRowReference)。如果它们不在该范围内,那么我想删除 C 列中包含该值的整行。问题:
1. returns 错误 "Unable to get the Vlookup property of the WorksheetFunction Class." 2. 即使没有这个错误,我也不能 100% 确定我的代码是否正确或有效。 谢谢!

 Sub FiltrarCalypso()
 Dim Sourcebook As Workbook
 Dim SourceSheet As Worksheet
 Dim Referencebook As Workbook
 Dim ReferenceSheet As Worksheet
 Dim LastRowSource As Long
 Dim LastRowReference As Long
 Dim FindString As String

 Set Sourcebook = Workbooks("Nemail")
 Set SourceSheet = Sourcebook.Worksheets("QP")
 Set Referencebook = Workbooks("Op")
 Set ReferenceSheet = Referencebook.Worksheets("OP")
 LastRowSource = SourceSheet.Cells(Rows.Count, "C").End(xlUp).Row
 LastRowReference = ReferenceSheet.Cells(Rows.Count, "A").End(xlUp).Row

 For i = 2 To LastRowSource
     FindString = Application.WorksheetFunction.VLookup(SourceSheet.Range("C" & i),     ReferenceSheet.Range("F7:F" & LastRowReference), 1, False)
If FindString <> 1 Then
SourceSheet.Range("A" & i & ":z" & i).Delete
Else: End if


 Next i

 End Sub

这看起来很接近。第一期,删除rows/columns的时候一定要反向循环。接下来,我更喜欢使用 .Find() 而不是 worksheet 函数。这将循环并尝试在您的引用 sheet 的 F 列中找到 Range("C" & i) 的值。它通过将变量 "FindString"(我更改为一个范围)设置为 Range.Find()(其中 returns 一个范围)来实现。如果找不到该值,"FindString" 将一无所获,If 语句的计算结果为真,整行将从您的源 sheet.

中删除
 Sub FiltrarCalypso()
 Dim Sourcebook As Workbook
 Dim SourceSheet As Worksheet
 Dim Referencebook As Workbook
 Dim ReferenceSheet As Worksheet
 Dim LastRowSource As Long
 Dim LastRowReference As Long
 Dim FindString As Range

 Application.ScreenUpdating = False

 Set Sourcebook = Workbooks("Nemail")
 Set SourceSheet = Sourcebook.Worksheets("QP")
 Set Referencebook = Workbooks("Op")
 Set ReferenceSheet = Referencebook.Worksheets("OP")
 LastRowSource = SourceSheet.Cells(Rows.Count, "C").End(xlUp).Row
 LastRowReference = ReferenceSheet.Cells(Rows.Count, "A").End(xlUp).Row

 For i = LastRowSource to 2 Step -1 'Step -1 tells this to loop in reverse
     On Error Resume Next
     Set FindString = ReferenceSheet.Range("F:F").Find (SourceSheet.Range("C" & i)

If FindString Is Nothing Then
SourceSheet.Range("A" & i).EntireRow.Delete
End if

Next i

End Sub

编辑:

我相信下面的应该会更快。它将 C 列中每个单元格的值写入二维数组 (SourceArray) 中的第一个 "column",并将该单元格的行索引写入 SourceArray 的第二个 "column"。然后它将 ReferenceSheet 中 F 列的所有值写入一个名为 ReferenceArray 的一维数组。然后它反向循环 SourceArray()(因为我们向前写入数组,所以我们想向后循环,所以我们先删除最大数字的行)并将它与 ReferenceArray() 中的每个值进行比较。如果找到该值,则将标志 (flg) 设置为 true,然后退出我们的内部循环。如果 flg = True,那么我们什么都不做(找到值),否则,我们删除与 SourceArray(i,1) 中的值关联的行。

如果这确实回答了您的问题,请将其标记为已回答!

 Sub FiltrarCalypso()
 Dim Sourcebook As Workbook
 Dim SourceSheet As Worksheet
 Dim Referencebook As Workbook
 Dim ReferenceSheet As Worksheet
 Dim LastRowSource As Long
 Dim LastRowReference As Long
 Dim FindString, C As Range
 Dim SourceArray() as String
 Dim ReferenceArray() as String
 Dim RowArray()
 Dim i, j as integer
 Dim flg as Boolean

 Set Sourcebook = Workbooks("Nemail")
 Set SourceSheet = Sourcebook.Worksheets("QP")
 Set Referencebook = Workbooks("Op")
 Set ReferenceSheet = Referencebook.Worksheets("OP")
 LastRowSource = SourceSheet.Cells(Rows.Count, "C").End(xlUp).Row
 LastRowReference = ReferenceSheet.Cells(Rows.Count, "A").End(xlUp).Row

 Redim SourceArray(0 to LastRowReference - 2,0 to 1)
 Redim ReferenceArray(0 to LastRowSource - 7)

 For i = 0 to Ubound(SourceArray())
   SourceArray(i,0) = SourceSheet.Cells(i+2,3)
   SourceArray(i,1) = SourceSheet.Cells(i+2,3).Row
 Next i

 For i = 0 to Ubound(ReferenceArray())
   ReferenceArray(i,0) = ReferenceSheet.Cells(i+7,6)
 Next i

 For i = Ubound(SourceArray()) to 0 Step -1
   flg = False
   For j = 0 to  Ubound(ReferenceArray())
      If SourceArray(i,0) =  ReferenceArray(i) Then
         flg = True
         Exit For
      End if
   Next j
   If flg = False Then
    SourceSheet.Range("A" & SourceArray(i,1)).EntireRow.Delete
   End if
Next i     



End Sub