如何在Excel中合并两列表并区分独有与共同内容(保持排序)
实现方案
方法一:Excel公式法(无需编程,快速上手)
假设你的列表1在A列(从A2开始,A1为表头“列表1”),列表2在B列(从B2开始,B1为表头“列表2”),按以下步骤操作即可:
步骤1:生成去重排序的全值列表
在D2单元格输入公式,下拉填充直到出现空值:
=SORT(UNIQUE(VSTACK(A2:A9,B2:B10)))
注:A2:A9、B2:B10是示例数据范围,根据你表格的实际行数调整。这个公式会自动合并两个列表、去重并按字母排序,和你示例里的顺序完全一致。
步骤2:填充三列内容
- 列表1列(C列):C2单元格输入公式后下拉:
=IF(COUNTIF(A:A,D2)>0,D2,"") - 列表2列(E列):E2单元格输入公式后下拉:
=IF(COUNTIF(B:B,D2)>0,D2,"") - 共同项列(F列):F2单元格输入公式后下拉:
=IF(AND(COUNTIF(A:A,D2)>0,COUNTIF(B:B,D2)>0),D2,"")
最后可以调整列的顺序,把“共同项”列移到你想要的位置,比如和示例一样放在第三列。
方法二:VBA脚本法(适合批量重复操作)
如果需要频繁处理这类任务,或者数据量很大,用VBA效率更高。按Alt+F11打开VBA编辑器,插入新模块,粘贴以下代码:
Sub MergeLists() Dim list1 As Range, list2 As Range Dim allValues As Collection Dim val As Variant, uniqueVals As Variant Dim i As Integer, ws As Worksheet ' 按你的实际表格修改以下参数 Set ws = ThisWorkbook.Worksheets("Sheet1") Set list1 = ws.Range("A2:A9") ' 列表1数据范围 Set list2 = ws.Range("B2:B10") ' 列表2数据范围 ' 收集所有唯一值 Set allValues = New Collection On Error Resume Next For Each val In list1 If val <> "" Then allValues.Add val, Key:=CStr(val) Next val For Each val In list2 If val <> "" Then allValues.Add val, Key:=CStr(val) Next val On Error GoTo 0 ' 把唯一值转成数组并排序 ReDim uniqueVals(1 To allValues.Count) For i = 1 To allValues.Count uniqueVals(i) = allValues(i) Next i Call SortArray(uniqueVals) ' 写入结果到D-F列 ws.Range("D1:F1") = Array("列表1", "列表2", "共同项") For i = 1 To UBound(uniqueVals) ws.Cells(i + 1, 4) = IIf(IsInRange(uniqueVals(i), list1), uniqueVals(i), "") ws.Cells(i + 1, 5) = IIf(IsInRange(uniqueVals(i), list2), uniqueVals(i), "") ws.Cells(i + 1, 6) = IIf(IsInRange(uniqueVals(i), list1) And IsInRange(uniqueVals(i), list2), uniqueVals(i), "") Next i End Sub ' 辅助函数:检查值是否在目标范围里 Function IsInRange(searchVal As Variant, rng As Range) As Boolean IsInRange = Not rng.Find(searchVal, LookIn:=xlValues, LookAt:=xlWhole) Is Nothing End Function ' 辅助函数:对数组进行排序 Sub SortArray(arr As Variant) Dim i As Integer, j As Integer, temp As Variant For i = LBound(arr) To UBound(arr) - 1 For j = i + 1 To UBound(arr) If arr(i) > arr(j) Then temp = arr(i) arr(i) = arr(j) arr(j) = temp End If Next j Next i End Sub
使用说明:
- 修改代码里的工作表名称(
"Sheet1")和数据范围(list1、list2的Range)为你的实际情况。 - 运行宏,结果会自动写入D-F列,直接得到你要的三列结构。
两种方法都能实现需求,公式法适合临时处理,VBA适合长期重复使用。
内容的提问来源于stack exchange,提问作者Joseph Gagnon
相关产品推荐
相关产品推荐

