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

Excel匹配拼接公式求助:两列匹配后保留分隔符后内容

嗨,我来帮你搞定这个Excel的匹配提取需求!根据你给出的示例,我整理了几种不同的解决方案,你可以根据自己的Excel版本和操作习惯来选:

方案1:Excel 365/2021 动态数组公式(一步到位)

如果你用的是支持动态数组的Excel版本,直接在C1单元格输入下面的公式就能得到结果:

=TEXTJOIN("、",TRUE,FILTER(TEXTSPLIT(A1,"、"),ISNUMBER(XMATCH(LEFT(TEXTSPLIT(A1,"、"),FIND(";",TEXTSPLIT(A1,"、"))-1),TEXTSPLIT(B1,"、")))))

公式拆解:

  • TEXTSPLIT(A1,"、"):把A1里的内容按顿号拆分成独立的条目数组
  • LEFT(...,FIND(";",...)-1):提取每个条目里分号前的数字部分
  • TEXTSPLIT(B1,"、"):把B1里的数字按顿号拆分成数组
  • XMATCH(...):检查A列的数字是否在B列的数字列表中,存在则返回位置,不存在返回错误
  • ISNUMBER(...):把XMATCH的结果转成TRUE/FALSE(匹配为TRUE)
  • FILTER(...):筛选出A列中符合匹配条件的完整条目
  • TEXTJOIN("、",TRUE,...):把筛选后的条目用顿号连接起来,自动忽略空值

方案2:旧版Excel(2019及更早)的公式方案(需辅助列)

如果你的Excel不支持动态数组,可以用辅助列来实现:

  1. 拆分A列条目到D列:在D1单元格输入下面的数组公式,按Ctrl+Shift+Enter确认,然后下拉填充直到出现空值:
=TRIM(MID(SUBSTITUTE(A1,"、",REPT(" ",LEN(A1))),ROW(INDIRECT("1:"&LEN(A1)-LEN(SUBSTITUTE(A1,"、",""))+1))*LEN(A1)-LEN(A1)+1,LEN(A1)))
  1. 提取数字部分到E列:在E1输入公式,下拉填充:
=LEFT(D1,FIND(";",D1)-1)
  1. 判断是否匹配到B列:在F1输入数组公式,按Ctrl+Shift+Enter确认,下拉填充:
=ISNUMBER(MATCH(E1,TRIM(MID(SUBSTITUTE($B$1,"、",REPT(" ",LEN($B$1))),ROW(INDIRECT("1:"&LEN($B$1)-LEN(SUBSTITUTE($B$1,"、",""))+1))*LEN($B$1)-LEN($B$1)+1,LEN($B$1))),0))
  1. 合并匹配结果到C列:在C1输入公式(如果没有TEXTJOIN,可改用PHONETIC函数,注意PHONETIC对纯文本友好):
=TEXTJOIN("、",TRUE,IF(F:F=TRUE,D:D,""))

方案3:VBA宏方案(适合批量处理)

如果你需要处理多行数据,或者不想折腾公式,可以用VBA宏来自动完成:

  1. Alt+F11打开VBA编辑器,右键点击左侧的工作簿名称,选择「插入」→「模块」
  2. 粘贴下面的代码:
Sub ExtractMatchedItemsForRows()
    Dim lastRow As Integer
    Dim aItems As Variant, bItems As Variant
    Dim i As Integer, j As Integer, row As Integer
    Dim matchedItems As String
    
    ' 获取A列最后一行的行号
    lastRow = Cells(Rows.Count, "A").End(xlUp).Row
    
    ' 遍历每一行数据
    For row = 1 To lastRow
        ' 跳过空行
        If Range("A" & row).Value <> "" And Range("B" & row).Value <> "" Then
            ' 拆分A、B列的内容为数组
            aItems = Split(Range("A" & row).Value, "、")
            bItems = Split(Range("B" & row).Value, "、")
            
            matchedItems = ""
            
            ' 检查每个A列条目是否匹配B列的数字
            For i = LBound(aItems) To UBound(aItems)
                ' 提取分号前的数字部分
                Dim numPart As String
                numPart = Left(aItems(i), InStr(aItems(i), ";") - 1)
                
                ' 遍历B列的数字
                For j = LBound(bItems) To UBound(bItems)
                    If Trim(numPart) = Trim(bItems(j)) Then
                        ' 匹配成功则添加到结果字符串
                        If matchedItems <> "" Then
                            matchedItems = matchedItems & "、" & aItems(i)
                        Else
                            matchedItems = aItems(i)
                        End If
                        Exit For ' 找到匹配就跳出内层循环,提高效率
                    End If
                Next j
            Next i
            
            ' 将结果写入C列对应行
            Range("C" & row).Value = matchedItems
        End If
    Next row
End Sub
  1. 回到Excel界面,按Alt+F8,选择ExtractMatchedItemsForRows宏,点击「执行」即可批量处理所有行。

方案4:Power Query(获取和转换数据)方案(适合大数据量)

如果你的数据量比较大,Power Query是更高效的选择:

  1. 选中A和B列的数据区域,点击「数据」选项卡→「从表格/范围」,勾选「我的表格有标题」(如果没有标题可以不勾选,之后重命名列)
  2. 在Power Query编辑器中:
    • 选中A列,点击「转换」→「拆分列」→「按分隔符」,输入「、」,选择「拆分为行」
    • 同样对B列执行拆分列→按分隔符→拆分为行,然后右键B列→「删除重复项」
    • 选中拆分后的A列,再次点击「拆分列」→「按分隔符」,输入「;」,拆分为两列,命名为「数字」和「代码」
  3. 点击「主页」→「合并查询」→「合并为新查询」,选择当前查询和B列的查询,匹配条件选「数字」等于B列的内容,连接类型选「内部」(只保留匹配项)
  4. 删除多余的列,保留原来的A列拆分条目(或重新合并「数字」和「代码」列,用「;」连接)
  5. 点击「转换」→「分组依据」,分组依据选原来的索引列,新列名设为「匹配结果」,操作选「所有行」,然后展开「匹配结果」里的条目列,用「、」连接
  6. 最后点击「关闭并上载」,结果就会加载到Excel中,就是你要的C列内容。

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

火山引擎 最新活动