技术咨询:对比两个数值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会更高效。步骤如下:
- 打开Excel,按
Alt+F11打开VBA编辑器; - 右键点击左侧的工作表名称,选择「插入」→「模块」;
- 把下面的代码粘贴进去,修改对应的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
- 按
F5运行代码,或者回到Excel里给代码加个按钮方便点击。
补充说明:
- 代码里的字典会自动去重,如果需要保留重复出现的数值(比如Range1里有两个5,要都显示在独有里),可以把字典换成数组来存储所有元素,再逐一对比;
- 代码里加了非空和数值判断,会跳过空单元格和非数值内容。
内容的提问来源于stack exchange,提问作者Max Bridge




