Excel如何基于下划线分隔的相同值提取多单元格字符并格式化拼接
实现方案
所有需求都可以实现,以下是不同场景下的具体实现方法:
纯公式方案(适用于Excel 365/2021及以上版本)
你当前使用的=LEFT(A2,FIND("_",A2)-1)已经可以正确提取下划线前的分组值,在此基础上直接用函数拼接同组内容即可。
- 基础逗号分隔效果
在对应结果列输入以下公式,会自动匹配所有和当前行分组值一致的条目,截掉分组前缀后用逗号拼接:=TEXTJOIN(",",TRUE,FILTER(RIGHT(A:A,LEN(A:A)-FIND("_",A:A)),LEFT(A:A,FIND("_",A:A)-1)=B2))
实现效果参考:
- 带&符号美化效果
如果需要在最后两个条目之间用&连接,可以用LET函数简化计算逻辑,自动将最后一个逗号替换为&:
=LET( group_res,TEXTJOIN(",",TRUE,FILTER(RIGHT(A:A,LEN(A:A)-FIND("_",A:A)),LEFT(A:A,FIND("_",A:A)-1)=B2)), item_count,LEN(group_res)-LEN(SUBSTITUTE(group_res,",",""))+1, IF(item_count=1,group_res,SUBSTITUTE(group_res,","," & ",item_count-1)) )
实现效果参考:
当前已有的提取效果参考:
VBA自定义函数方案(适用于所有Excel版本)
如果你使用的是2019及更早的Excel版本,没有内置TEXTJOIN/FILTER函数,可以用自定义函数实现:
- 按
Alt+F11打开VBA编辑器,右键点击当前工作簿选择「插入」-「模块」 - 将以下代码粘贴到模块中:
Function GroupJoin(sourceRng As Range, groupKey As String, Optional addAmpersand As Boolean = False) As String Dim dataArr, i As Long, resultArr(), itemCount As Long dataArr = sourceRng.Value itemCount = 0 ReDim resultArr(1 To UBound(dataArr)) For i = 1 To UBound(dataArr) If InStr(dataArr(i, 1), "_") > 0 Then If Split(dataArr(i, 1), "_")(0) = groupKey Then itemCount = itemCount + 1 resultArr(itemCount) = Mid(dataArr(i, 1), InStr(dataArr(i, 1), "_") + 1) End If End If Next ReDim Preserve resultArr(1 To itemCount) If addAmpersand And itemCount > 1 Then ReDim Preserve resultArr(1 To itemCount - 1) GroupJoin = Join(resultArr, ", ") & " & " & Mid(dataArr(i - 1, 1), InStr(dataArr(i - 1, 1), "_") + 1) Else GroupJoin = Join(resultArr, ", ") End If End Function
- 使用方法:
- 要基础逗号分隔效果,单元格输入:
=GroupJoin(A:A,B2,FALSE) - 要带&美化效果,单元格输入:
=GroupJoin(A:A,B2,TRUE)
零代码Power Query方案
如果不想写公式或代码,也可以用内置的Power Query功能实现:
- 选中A列数据,点击「数据」选项卡-「从表格/区域」将数据导入Power Query编辑器
- 选中数据列,点击「拆分列」-「按分隔符」,选择下划线,拆分为前后2列
- 以拆分后的第一列(分组列)为分组依据,对第二列(内容列)执行「分组依据」操作,聚合方式选「合并行」,分隔符设置为逗号
- 需要美化效果的话新增自定义列,判断合并后内容的逗号数量,将最后一个逗号替换为&后,将结果上载回工作表即可。
内容的提问来源于stack exchange,提问作者gargilang
相关产品推荐
相关产品推荐

