Excel中为唯一水果列添加对应去重动物列表的实现方法
Excel中为唯一水果列添加对应去重动物列表的实现方法
嗨,我来给你分享几种实用的解决办法,优先满足你不想用VBA的需求,实在需要的话也给你准备了简单的脚本方案~
方法一:用Excel 365/2021自带函数(无VBA,最便捷)
如果你的Excel是365或者2021版本,直接用TEXTJOIN+UNIQUE+FILTER组合公式就能搞定,步骤超简单:
- 假设你的原始数据在A2:B7区域(A列是Fruit,B列是Animal),唯一水果表在D2:D4区域(D列是Fruit)
- 在E2单元格(对应第一个水果的Animals列)输入公式:
=TEXTJOIN(", ", TRUE, UNIQUE(FILTER($B$2:$B$7, $A$2:$A$7=D2))) - 输入完按回车,然后下拉填充E列剩下的单元格就好啦!
公式拆解:
FILTER($B$2:$B$7, $A$2:$A$7=D2):先把当前水果对应的所有动物筛选出来UNIQUE(...):给筛选出来的动物去重TEXTJOIN(", ", TRUE, ...):用逗号加空格把去重后的动物连成一串,TRUE用来忽略空值
方法二:用Power Query(兼容旧版Excel,无VBA)
要是你用的是旧版Excel(没有上面的新函数),Power Query是个绝佳选择,操作可视化,还能重复使用:
- 选中你的原始数据区域,点击「数据」选项卡→「从表格/区域」(Excel 2016及以后版本;旧版找「获取和转换数据」里的「自表格」),弹出的对话框勾选「我的表格有标题」,进入Power Query编辑器
- 在编辑器里选中Fruit列,点击「转换」选项卡→「分组依据」:
- 分组列选「Fruit」
- 新列名填「Animals」
- 操作选「所有行」,然后点击确定
- 此时Animals列是嵌套表,点击列名右侧的展开箭头,选择「提取值」,分隔符选「, 」(逗号加空格),确定
- 现在表格已经是水果对应去重后的动物列表了,点击「主页」→「关闭并上载」,选择上载到你想要的位置(比如替换原来的唯一水果表,或者新工作表)
方法三:VBA脚本(万不得已时用)
如果上面两种方法都不适用,给你准备了个简单的VBA脚本,操作步骤:
- 按
Alt+F11打开VBA编辑器 - 右键你的工作簿→「插入」→「模块」,把下面的代码粘贴进去
- 回到Excel界面,按
Alt+F8选择GetUniqueAnimals宏执行即可
Sub GetUniqueAnimals() Dim ws As Worksheet Dim lastRow As Long, i As Long, j As Long Dim fruitDict As Object Set fruitDict = CreateObject("Scripting.Dictionary") ' 改成你实际的工作表,比如Set ws = ThisWorkbook.Worksheets("Sheet1") Set ws = ThisWorkbook.ActiveSheet lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row ' 遍历原始数据,用字典存每个水果的唯一动物 For i = 2 To lastRow Dim currentFruit As String, currentAnimal As String currentFruit = ws.Cells(i, "A").Value currentAnimal = ws.Cells(i, "B").Value If Not fruitDict.Exists(currentFruit) Then fruitDict(currentFruit) = currentAnimal Else ' 检查动物是否已存在,避免重复添加 If InStr(1, fruitDict(currentFruit), currentAnimal, vbTextCompare) = 0 Then fruitDict(currentFruit) = fruitDict(currentFruit) & ", " & currentAnimal End If End If Next i ' 将结果写入目标列(假设目标水果列在D列,结果写在E列) lastRow = ws.Cells(ws.Rows.Count, "D").End(xlUp).Row For i = 2 To lastRow currentFruit = ws.Cells(i, "D").Value If fruitDict.Exists(currentFruit) Then ws.Cells(i, "E").Value = fruitDict(currentFruit) End If Next i End Sub
备注:内容来源于stack exchange,提问作者Charles
相关产品推荐
相关产品推荐

