数据对比!从所有名单中提取出未经核酸检测的名单
函数法
这个问题实际是从一个全集中,取出一个子集的补集。简单来说,就是在所有的名单中,已知了一部分名单,求剩余部分的名单。
=INDEX(A:A,SMALL(IF(COUNTIF(C$2:C$21,A$2:A$21),4^8,ROW($2:$21)),ROW(A1)))&""
1对应的那些名字是已检测过的名单,因为它们在已检测名单中出现过。0对应的那些名字是未经检测过的名单,因为它们在已检测名单中没有出现过。
countif两个区域的顺序一定要搞清楚,是在已检测名单中统计所有名单上每个人的个数。
vba代码法
Sub 未检测名单()
Dim d As Object
Dim arr, brr, i, j, n, crr()
Set d = CreateObject("scripting.dictionary")
'创建字典对象,赋给对象变量d
arr = Range("c2", Cells(Rows.Count, "c").End(xlUp))
'将C2到C列最后一个非空单元格赋给数组变量arr
For i = 1 To UBound(arr)
d(arr(i, 1)) = ""
'将arr的元素(C列名单)循环装入字典
Next i
brr = Range("a2", Cells(Rows.Count, "a").End(xlUp))
'将A2到A列最后一个非空单元格赋给数组变量brr
ReDim Preserve crr(1 To UBound(brr), 1 To 1)
'重定义结果数组crr的大小,使其和brr大小一样
For j = 1 To UBound(brr)
If Not d.Exists(brr(j, 1)) Then
'如果brr的元素(A列名单)在字典中不存在,则...
n = n + 1
'未检测人数累加1
crr(n, 1) = brr(j, 1)
'将brr的当前元素写入crr相应的位置
End If
Next j
Range("f2:f9999").ClearContents
'清空f2:f9999的内容
If n > 0 Then Range("f2").Resize(n) = crr
'如果未经检测人数大于0,则将crr输出到F列
Set d = Nothing
'释放字典
End Sub
https://pan.baidu.com/s/1gMrgYkkyjcRsh43Pk9MnTQ
赞 (0)