Excel vba - 比较两个范围并查找非匹配项

时间:2011-10-12 11:40:36

标签: excel compare

我有两张Excel表格,其中一张表格包含一个用户列表。而另一个列表包含相同的数据,只有多次列出相同的用户。现在,我需要一些方法来比较第二个列表和第一个列表,并删除包含在第一个列表中找不到的用户的行。

第一个列表如下所示:

  • Paul Mccartney
  • John Lennon
  • George Harrison
  • Ringo Starr

第二个列表可能如下所示:

  • Paul Mccartney
  • Paul Mccartney
  • Paul Mccartney
  • John Lennon
  • John Lennon
  • John Lennon
  • George Harrison
  • George Harrison
  • George Harrison
  • Ringo Starr
  • Ringo Starr
  • Ringo Starr
  • 林戈之星
  • 林戈之星
  • 林戈之星

因此,比较这两个列表,您会看到名称Ringo Star不在第一个列表中,我想删除这些行。我尝试了几个循环,但我不能让它工作。我想我可以将这些项添加到某种类型的数组中,并通过函数运行它。但是,没有那么多代码,有没有一种简单的方法可以做到这一点?

3 个答案:

答案 0 :(得分:3)

这一次,你可以使用一个集合。

以下是基于您之前文件的尝试:

Option Explicit

Sub test()
Dim i As Long
Dim arrSum As Variant, arrUsers As Variant
Dim cUnique As New Collection

'Put the name range from "Summary" in an array
With ThisWorkbook.Sheets("Summary")
    arrSum = .Range("A2", .Range("A" & Rows.Count).End(xlUp))
End With

'"Convert" the array to a collection (unique items)
For i = 1 To UBound(arrSum, 1)
    On Error Resume Next
    cUnique.Add arrSum(i, 1), CStr(arrSum(i, 1))
Next i

'Get the users array
With ThisWorkbook.Sheets("Users")
    arrUsers = .Range("A2", .Range("A" & Rows.Count).End(xlUp))
End With

'Check if the value exists in the Users sheet
For i = 1 To cUnique.Count
    'if can't find the value in the users range, delete the rows
    If Application.WorksheetFunction.VLookup(cUnique(i), arrUsers, 1, False) = "#N/A" Then
        With ThisWorkbook.Sheets("Summary").Cells
            .AutoFilter Field:=1, Criteria1:=cUnique(i)
            .Range("A2", .Range("A" & Rows.Count).End(xlUp)).EntireRow.Delete
        End With
    End If
Next i
'removes AutoFilter if one remains
ThisWorkbook.Sheets("Summary").AutoFilterMode = False
End Sub

答案 1 :(得分:2)

您可以使用简单的MATCH公式来检测任何不匹配,然后使用AutoFilter

删除它们

如果您的第一个列表位于Sheet 1 A列中,那么您在Sheet 2 A列中的第二个列表然后放入Sheet 2的B1中 = ISNA(MATCH(A1,Sheet 1中!A:A,0)) 并复制

返回TRUE,第二个列表与第一个列表不匹配。然后,您可以使用autofilter

删除这些TRUE行

请注意,您也可以使用 = COUNTIF(Sheet 1中!A:A,A1)= 0 用于识别不匹配的相同效果(为真)

xl2010 pic显示在这里

enter image description here [VBA已添加]

Sub QuickKill()
    Dim ws1 As Worksheet
    Dim ws2 As Worksheet
    Dim rng1 As Range
    Set ws1 = Sheets(1)
    Set ws2 = Sheets(2)
    ws2.Columns(2).Insert
    Set rng1 = ws2.Range(ws2.[a1], ws2.Cells(Rows.Count, "A").End(xlUp))
    Rows(1).Insert
    With rng1.Offset(0, 1)
        .FormulaR1C1 = "=COUNTIF('" & ws1.Name & "'!C1,RC[-1])=0"
        .AutoFilter Field:=1, Criteria1:="TRUE"
        .EntireRow.Delete
        .EntireColumn.Delete
    End With
End Sub

答案 2 :(得分:1)

this question。使用该技术,您可以轻松查询SELECT * FROM [Sheet2$] WHERE columnX NOT IN (SELECT columnY FROM [Sheet1$]