用函数VLOOKUP+筛选可以解决。也可以用万能的vba来实现。
现举例用vba解决。
基本思路:创建字典B,将B列数据存放到字典B中.遍历数据A列,如果字典B中不存在就追加到C列中。遍历结束,则C列数据即为A-B的结果。
表格初始数据如图:
第一步:创建宏,并编制代码如下:
Sub 数据排除()
Dim mys As String
Dim I, J As Integer
Dim b As Object
mys = "数据排除"
Set b = CreateObject("Scripting.Dictionary")
Sheets(mys).Select
I = 2
Do While Cells(I, 2) <> "" '将名单放入字典
m_key = Cells(I, 2)
M_ITEM = I - 1
If Not b.Exists(m_key) Then
b.Add m_key, M_ITEM
End If
I = I + 1
Loop
J = 2 '记录C列写入数据的最新行号
I = 2
Do While Cells(I, 1) <> "" '将A列数据排除B列后存入C列
m_key = Cells(I, 1)
If Not b.Exists(m_key) Then
Cells(J, 3) = m_key
J = J + 1
End If
I = I + 1
Loop
End Sub
运行该宏后,结果如图:
亲,如果数据几万行,就不太适合用公式了,以下是VBA代码。附件已上传。
Sub bcf()
Dim d, Aarr, Barr, Carr
Dim i, n As Long
Set d = CreateObject("Scripting.Dictionary")
Aarr = Range("A1:A" & Range("A" & Rows.Count).End(xlUp).Row)
Barr = Range("B1:B" & Range("B" & Rows.Count).End(xlUp).Row)
Carr = Range("C1:C" & Range("A" & Rows.Count).End(xlUp).Row)
For i = 1 To UBound(Aarr)
d(Aarr(i, 1)) = 1
Next
For i = 1 To UBound(Barr)
If d.exists(Barr(i, 1)) Then d(Barr(i, 1)) = 0
Next
For i = 1 To UBound(Aarr)
If d(Aarr(i, 1)) = 1 Then n = n + 1: Carr(n, 1) = Aarr(i, 1)
Next
Range("C:C").ClearContents
Range("C1:C" & UBound(Carr)) = Carr
End Sub
假设B列数据有10000行,那么C1输入公式
=IF(COUNTIF($B$1:$B$10000,A1),"",A1)
然后向下填充,所有B没有A有的都显示出来了。
然后复制C列,原地选择性粘贴为“数值”.
C1=INDEX(A:A,SMALL(IF(ISERROR(MATCH(A:A,B:B,)),ROW(A:A),2^17),ROW()))&""
数组公式,输完按Ctrl+Shift+Enter结束
如果数据太多,用VBA吧。把数据给我
在C1写入公式:=IF(COUNTIF(A:A,B1)=0,A1,""),选C1下拉。