VLOOKUP删除不匹配参考值的值

我试图把SourceSheet.Range(“C2:C”&LastRowSource)中保存的所有值交叉引用到ReferenceSheet.Range(“F7:F”&LastRowReference)中的所有值中。 如果它们不在该范围内,那么我想删除C列中保存该值的整个行。 问题:
1.它返回错误“无法获取WorksheetFunction类的Vlookup属性”。 即使没有这个错误,我也不能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 

这看起来很接近。 第一个问题,你应该总是在反向删除行/列时循环。 接下来,我更喜欢使用.Find()而不是工作表函数。 循环并试图在参考表的F列中findRange("C" & i)的值。 它通过设置variables“FindString”(我改变了一个范围)到Range.Find() (它返回一个范围)。 如果没有find该值,“FindString”将不起作用,If语句的计算结果为true,整个行将从源表中删除。

  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)中的第一个“列”,并将该单元格的行索引写入到SourceArray的第二个“列”。 然后将ReferenceSheet中列F的所有值写入一个名为ReferenceArray的一维数组中。 然后通过反向循环SourceArray()(因为我们向前写了数组,我们要向后循环,所以我们先删除最高数字行),并将其与ReferenceArray()中的每个值进行比较。 如果find该值,则将标志(flg)设置为true,并退出内部循环。 如果flg = True,那么我们什么都不做(find该值),否则,我们删除与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