ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > E文精选 > 综合应用 > 如何比较两列数据的重叠和差异?

如何比较两列数据的重叠和差异?

作者:绿色风 分类: 时间:2022-08-17 浏览:273
楼主
wcymiss
Q:有两列数据,如何分别找出A列有B列无、B列有A列无以及两列都有的数据?
A:方法一、自定义序列
     步骤:1、工具-选项-自定义序列里,将A列数据导入,然后对B列数据进行排序,“选项-自定义排序次序”里选择刚自定义的序列“A列”。
             2、工具-选项-自定义序列里,将刚排序好的B列数据导入,然后对A列数据进行排序,“选项-自定义排序次序”里选择刚自定义的序列“B列”。
             3、此时A、B两列上半部分相同数据即为两列都有的数据,下半部分不同的,分别为A列有B列无、B列有A列无的数据,复制粘贴到需要的地方即可。
            注意:自定义序列最大只能适合255条数据。


两列比较.rar
2楼
wcymiss
方法二、高级筛选。
           步骤,在F2输入公式:
  1. =countif(b:b,a2)=0
,然后数据-筛选-高级筛选,如下图填入相关内容:

 

按确定后,C列数据即为A列有B列无的数据。
同上类似操作,公式改为:
  1. =COUNTIF(A:A,B2)=0
,可得B列有A列无的数据。
公式改为:
  1. =COUNTIF(A:A,B2)
,可得两列都有的数据。
3楼
wcymiss
方法三:普通公式
C2公式:
  1. =IF(COUNTIF(B:B,A2),"",A2)
  1. =IF(ISNA(VLOOKUP(A2,B:B,1,)),A2,"")
然后下拉。
D2公式:
  1. =IF(COUNTIF(A:A,B2),"",B2)
  1. =IF(ISNA(VLOOKUP(B2,A:A,1,)),B2,"")
然后下拉。
E2公式:
  1. =IF(COUNTIF(B:B,A2),A2,"")
  1. =IF(ISNA(VLOOKUP(A2,B:B,1,)),"",A2)
然后下拉。

求两列差异的普通公式比较多,但公式结果都包含了空单元格,需要结合自动筛选删除空单元格才能得到所需数据。
4楼
wcymiss
方法四:数组公式,需要按三键回车然后下拉。

C2公式:
  1. =INDEX(A:A,SMALL(IF(COUNTIF(B$2:B$105,A$2:A$187),4^8,ROW($2:$187)),ROW(A1)))&""

D2公式:
  1. =INDEX(B:B,SMALL(IF(COUNTIF(A$2:A$187,B$2:B$105),4^8,ROW($2:$105)),ROW(A1)))&""

E2公式:
  1. =INDEX(B:B,SMALL(IF(COUNTIF(A$2:A$187,B$2:B$105),ROW($2:$105),4^8),ROW(A1)))&""


数组公式产生的结果和普通公式相比,没有空行,不需要进一步处理。但数组公式只适合数据量比较少的情况。数据量大的话数组公式运行相当缓慢,不建议使用。
5楼
wcymiss
方法五:vba代码

  1. Sub A列有B列无()
  2.     Dim d, arr, brr, i&, r1&, r2&, j&, crr()
  3.     Set d = CreateObject("scripting.dictionary")
  4.     r1 = ActiveSheet.Cells(Rows.Count, 1).End(3).Row '取得A列最后数据单元格行号
  5.     r2 = ActiveSheet.Cells(Rows.Count, 2).End(3).Row '取得B列最后数据单元格行号
  6.     arr = Range("a2:a" & r1) '将A列数据导入数组
  7.     brr = Range("b2:b" & r2) '将B列数据导入数组
  8.     For i = 1 To UBound(brr)
  9.         d(brr(i, 1)) = i '将B列输入装入字典
  10.     Next
  11.     For i = 1 To UBound(arr)
  12.         If Not d.exists(arr(i, 1)) Then '如果A列的数据在字典中不存在(也就是在B列中不存在),则
  13.             j = j + 1 '增加数组crr个数
  14.             ReDim Preserve crr(1 To 1, 1 To j) '重定义crr数组
  15.             crr(1, j) = arr(i, 1) '将A字典中不存在数据,存入数组crr
  16.         End If
  17.     Next
  18.     ActiveSheet.Range("c2").Resize(Rows.Count - 1, 1).ClearContents '清除C列
  19.     ActiveSheet.Range("c2").Resize(j, 1) = Application.Transpose(crr) '将数组crr拷贝至C列
  20.     Set d = Nothing
  21. End Sub
  22. Sub B列有A列无()
  23.     Dim d, arr, brr, i&, r1&, r2&, j&, crr()
  24.     Set d = CreateObject("scripting.dictionary")
  25.     r1 = ActiveSheet.Cells(Rows.Count, 1).End(3).Row
  26.     r2 = ActiveSheet.Cells(Rows.Count, 2).End(3).Row
  27.     arr = Range("a2:a" & r1)
  28.     brr = Range("b2:b" & r2)
  29.     For i = 1 To UBound(arr)
  30.         d(arr(i, 1)) = i
  31.     Next
  32.     For i = 1 To UBound(brr)
  33.         If Not d.exists(brr(i, 1)) Then
  34.             j = j + 1
  35.             ReDim Preserve crr(1 To 1, 1 To j)
  36.             crr(1, j) = brr(i, 1)
  37.         End If
  38.     Next
  39.     ActiveSheet.Range("d2").Resize(Rows.Count - 1, 1).ClearContents
  40.     ActiveSheet.Range("d2").Resize(j, 1) = Application.Transpose(crr)
  41.     Set d = Nothing
  42. End Sub
  43. Sub 两列都有()
  44.     Dim d, arr, brr, i&, r1&, r2&, j&, crr()
  45.     Set d = CreateObject("scripting.dictionary")
  46.     r1 = ActiveSheet.Cells(Rows.Count, 1).End(3).Row
  47.     r2 = ActiveSheet.Cells(Rows.Count, 2).End(3).Row
  48.     arr = Range("a2:a" & r1)
  49.     brr = Range("b2:b" & r2)
  50.     For i = 1 To UBound(arr)
  51.         d(arr(i, 1)) = i
  52.     Next
  53.     For i = 1 To UBound(brr)
  54.         If d.exists(brr(i, 1)) Then
  55.             j = j + 1
  56.             ReDim Preserve crr(1 To 1, 1 To j)
  57.             crr(1, j) = brr(i, 1)
  58.         End If
  59.     Next
  60.     ActiveSheet.Range("e2").Resize(Rows.Count - 1, 1).ClearContents
  61.     ActiveSheet.Range("e2").Resize(j, 1) = Application.Transpose(crr)
  62.     Set d = Nothing
  63. End Sub


vba的字典十分高效,此法适合对大量数据进行比对。
6楼
wcymiss
方法六:sql法

步骤:1、数据-导入外部数据-导入数据,然后选择本工作簿的本工作表,确定后,在弹出的“导入数据”窗口里,“数据的放置位置”选择C1,点击“编辑查询”,在命令文本中输入语句:

  1. select A列 as A列有B列无 from [方法六$a1:a187] where A列 not in(select B列 from [方法六$b1:b105])

2、同上操作,“数据的放置位置”选择D1后,点击“编辑查询”,在命令文本中输入语句:

  1. select B列 as B列有A列无 from [方法六$b1:b105] where B列 not in(select A列 from [方法六$a1:a187])

3、同上操作,“数据的放置位置”选择E1后,点击“编辑查询”,在命令文本中输入语句:

  1. select A列 as 两列都有 from [方法六$a1:a187] where A列 in (select B列 from [方法六$b1:b105])
7楼
huishi
收下了,谢谢,LZ辛苦了
8楼
eliane_lei
谢谢分享!
9楼
洛小乐719
好复杂呀。看不懂。
10楼
海洋之星
学习,学习

免责声明

有感于原ExcelTip.Net留存知识的价值及部分知识具有的时间限定性因素, 经与ExcelTip.Net站长Apolloh商议并征得其同意, 现将原属ExcelTip.Net的知识帖采集资料于本站点进行展示, 供有需要的人士查询使用,也慰缅曾经的论坛时代。 所示各个帖子的原作者如对版权有异议, 可与本人沟通提出,或于本站点留言,我们会尽快处理。 在此,感谢ExcelTip.Net站长Apolloh的支持,感谢本站点所有人**绿色风(QQ:79664738)**的支持与奉献,特此鸣谢!
------本人网名**KevinChengCW(QQ:1210618015)**原ExcelTip.Net总版主之一

评论列表
sitemap