You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

使用说明:

  1. 修改代码里的工作表名称("Sheet1")和数据范围(list1、list2的Range)为你的实际情况。
  2. 运行宏,结果会自动写入D-F列,直接得到你要的三列结构。

两种方法都能实现需求,公式法适合临时处理,VBA适合长期重复使用。

内容的提问来源于stack exchange,提问作者Joseph Gagnon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 13:33:16