如何在Microsoft 365中对比单元格文本并提取差异至第三列(无需VBA)
无VBA提取两单元格文本差异(Microsoft 365)
问题说明
SUBSTITUTE(A2,B2,"")仅能替换完全匹配的整段文本,无法逐段/逐字符对比两个字符串的差异,因此不符合需求。以下提供两种实现方式:
方法1:逐字符提取差异(适合单字符替换场景)
使用动态数组函数组合,逐个对比两个字符串的字符,提取B中与A不同的字符:
=TEXTJOIN(",",TRUE,IF(MID(B2,SEQUENCE(LEN(B2)),1)<>IFERROR(MID(A2,SEQUENCE(LEN(B2)),1),""),MID(B2,SEQUENCE(LEN(B2)),1),""))
逻辑说明:
SEQUENCE(LEN(B2))生成对应B文本长度的序列,用于逐个提取字符MID(B2,SEQUENCE(LEN(B2)),1)提取B的每个字符IFERROR(MID(A2,SEQUENCE(LEN(B2)),1),"")提取A的每个字符,A长度不足时补空- 对比字符,保留B中与A不同的字符,最后用逗号连接所有差异字符
方法2:提取连续差异块(匹配示例需求)
如果需要将连续的差异内容作为一个整体(如示例中把are作为单个差异块),可以用Power Query实现:
- 选中数据区域(A1:C1表头+数据行),点击「数据」选项卡→「从表格/区域」(勾选「我的表格有标题」)
- 在Power Query编辑器中,添加自定义列,公式为:
let TextA = [Column A], TextB = [Column B], // 找最长公共前缀长度 PreLen = List.Max(List.Transform({1..List.Min({Text.Length(TextA), Text.Length(TextB)})}, (x)=> if Text.Start(TextA,x)=Text.Start(TextB,x) then x else 0)), // 找最长公共后缀长度 SufLen = List.Max(List.Transform({1..List.Min({Text.Length(TextA), Text.Length(TextB)})}, (x)=> if Text.End(TextA,x)=Text.End(TextB,x) then x else 0)), // 提取中间差异 MidDiff = Text.Range(TextB, PreLen, Text.Length(TextB)-PreLen-SufLen), // 提取B额外的尾部内容 ExtraDiff = if Text.Length(TextB) > Text.Length(TextA) then Text.End(TextB, Text.Length(TextB)-(Text.Length(TextA)-SufLen)) else "", // 合并差异 Result = Text.Combine(List.RemoveNulls({MidDiff, ExtraDiff}), ",") in Result
- 点击「关闭并上载」,结果会自动加载到新工作表中,后续数据更新时右键刷新即可。
内容的提问来源于stack exchange,提问作者jajangjaras
相关产品推荐
相关产品推荐

