Excel VBA – 比较两个范围,并find不匹配
我有两张Excel工作表,其中一张由用户列表组成。 另一个列表包含相同的数据,只有同一个用户多次列出。 现在,我需要一些方法来比较第一个列表和第二个列表,并删除包含在第一个列表中找不到的用户的行。
第一个列表如下所示:
- 保罗·麦卡特尼
- 约翰列侬
- 乔治·哈里森
- Ringo Starr
第二个列表可能是这样的:
- 保罗·麦卡特尼
- 保罗·麦卡特尼
- 保罗·麦卡特尼
- 约翰列侬
- 约翰列侬
- 约翰列侬
- 乔治·哈里森
- 乔治·哈里森
- 乔治·哈里森
- Ringo Starr
- Ringo Starr
- Ringo Starr
- Ringo Star
- Ringo Star
- Ringo Star
所以,比较这两个列表,你会发现名称Ringo Star不在第一个列表中,我想删除这些行。 我已经尝试了几个循环,但我不能完全得到这个工作。 我想我可以将这些项目添加到某种数组,并通过函数来运行它。 但有没有这么简单的方法做这个代码?
这一次,你可以使用一个集合。
这里是基于你以前的文件的尝试:
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
您可以使用简单的MATCH公式来检测任何不匹配,然后使用AutoFilter删除它们
如果您的第一个列表在Sheet 1 Column A中,则您在Sheet 2 Column A中的第二个列表,然后在Sheet 2的B1中放入= ISNA(MATCH(A1,Sheet1!A:A,0))并复制
这在第二个列表不能与第一个匹配的情况下返回TRUE。 然后,您可以使用自动筛选function删除这些TRUE行
请注意,对于相同的效果,您也可以使用= COUNTIF(Sheet1!A:A,A1)= 0来标识不匹配(如TRUE)
这里显示的xl2010图片
[添加了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
看到这个问题 。 使用该技术,您可以轻松地查询SELECT * FROM [Sheet2$] WHERE columnX NOT IN (SELECT columnY FROM [Sheet1$]