我有两张Excel表格,其中一张表格包含一个用户列表。而另一个列表包含相同的数据,只有多次列出相同的用户。现在,我需要一些方法来比较第二个列表和第一个列表,并删除包含在第一个列表中找不到的用户的行。
第一个列表如下所示:
第二个列表可能如下所示:
因此,比较这两个列表,您会看到名称Ringo Star不在第一个列表中,我想删除这些行。我尝试了几个循环,但我不能让它工作。我想我可以将这些项添加到某种类型的数组中,并通过函数运行它。但是,没有那么多代码,有没有一种简单的方法可以做到这一点?
答案 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显示在这里
[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$]