You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

技术咨询:对比两个数值Range,将相似及独有数值复制至第三个Range

嘿,这个需求我之前帮同事处理过,分两种方案给你,看你更习惯用公式还是VBA来实现:

方法一:用Excel公式实现(无需编程)

这种方法适合不想碰代码的朋友,直接用内置公式就能搞定,假设你的两个数值区域分别是A2:A10(Range1)和C2:C10(Range2),目标输出区域从E2开始:

  • 提取交集(两个Range都有的数值)
    E2单元格输入公式:

    =FILTER(A2:A10,COUNTIF(C2:C10,A2:A10)>0)
    

    如果你的Excel版本比较旧(没有FILTER函数),可以用数组公式(输入后按Ctrl+Shift+Enter确认):

    =INDEX(A2:A10,SMALL(IF(COUNTIF(C2:C10,A2:A10)>0,ROW(A2:A10)-ROW(A2)+1),ROWS(E$2:E2)))
    

    下拉公式直到出现#NUM!,就是所有交集数值了。

  • 提取Range1独有的数值
    G2单元格输入公式:

    =FILTER(A2:A10,COUNTIF(C2:C10,A2:A10)=0)
    

    旧版Excel用数组公式:

    =INDEX(A2:A10,SMALL(IF(COUNTIF(C2:C10,A2:A10)=0,ROW(A2:A10)-ROW(A2)+1),ROWS(G$2:G2)))
    
  • 提取Range2独有的数值
    I2单元格输入公式:

    =FILTER(C2:C10,COUNTIF(A2:A10,C2:C10)=0)
    

    旧版Excel用数组公式:

    =INDEX(C2:C10,SMALL(IF(COUNTIF(A2:A10,C2:C10)=0,ROW(C2:C10)-ROW(C2)+1),ROWS(I$2:I2)))
    

注意: 如果需要把结果合并到同一个列里,比如先放交集,再放Range1独有,最后放Range2独有,可以用TEXTJOIN配合FILTER,或者手动复制粘贴结果到目标区域。

方法二:用VBA代码实现(适合批量/自动化)

如果需要经常处理这类需求,或者数据量很大,用VBA会更高效。步骤如下:

  1. 打开Excel,按Alt+F11打开VBA编辑器;
  2. 右键点击左侧的工作表名称,选择「插入」→「模块」;
  3. 把下面的代码粘贴进去,修改对应的Range地址:
Sub CompareRangesAndCopy()
    Dim rng1 As Range, rng2 As Range, targetRng As Range
    Dim dict1 As Object, dict2 As Object
    Dim cell As Range
    Dim outputRow As Long
    
    ' ********** 修改这里的区域地址为你实际的Range **********
    Set rng1 = ThisWorkbook.Sheets("Sheet1").Range("A2:A10") ' 第一个数值Range
    Set rng2 = ThisWorkbook.Sheets("Sheet1").Range("C2:C10") ' 第二个数值Range
    Set targetRng = ThisWorkbook.Sheets("Sheet1").Range("E2") ' 结果输出的起始位置
    
    ' 创建字典用于存储数值(自动去重)
    Set dict1 = CreateObject("Scripting.Dictionary")
    Set dict2 = CreateObject("Scripting.Dictionary")
    
    ' 遍历Range1,把数值存入字典1
    For Each cell In rng1
        If Not IsEmpty(cell.Value) And IsNumeric(cell.Value) Then
            dict1(cell.Value) = True
        End If
    Next cell
    
    ' 遍历Range2,把数值存入字典2
    For Each cell In rng2
        If Not IsEmpty(cell.Value) And IsNumeric(cell.Value) Then
            dict2(cell.Value) = True
        End If
    Next cell
    
    outputRow = 0
    
    ' 写入「交集」标题和内容
    targetRng.Offset(outputRow, 0).Value = "交集"
    outputRow = outputRow + 1
    For Each key In dict1.Keys
        If dict2.Exists(key) Then
            targetRng.Offset(outputRow, 0).Value = key
            outputRow = outputRow + 1
        End If
    Next key
    
    ' 写入「Range1 独有」标题和内容
    targetRng.Offset(outputRow, 0).Value = "Range1 独有"
    outputRow = outputRow + 1
    For Each key In dict1.Keys
        If Not dict2.Exists(key) Then
            targetRng.Offset(outputRow, 0).Value = key
            outputRow = outputRow + 1
        End If
    Next key
    
    ' 写入「Range2 独有」标题和内容
    targetRng.Offset(outputRow, 0).Value = "Range2 独有"
    outputRow = outputRow + 1
    For Each key In dict2.Keys
        If Not dict1.Exists(key) Then
            targetRng.Offset(outputRow, 0).Value = key
            outputRow = outputRow + 1
        End If
    Next key
    
    MsgBox "对比完成!结果已写入指定区域。", vbInformation
End Sub
  1. F5运行代码,或者回到Excel里给代码加个按钮方便点击。

补充说明:

  • 代码里的字典会自动去重,如果需要保留重复出现的数值(比如Range1里有两个5,要都显示在独有里),可以把字典换成数组来存储所有元素,再逐一对比;
  • 代码里加了非空和数值判断,会跳过空单元格和非数值内容。

内容的提问来源于stack exchange,提问作者Max Bridge

火山引擎 最新活动