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
我正在尝试获取 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