如何自动对比Excel中相似文本列并识别差异?
如何自动对比Excel中相似文本列并识别差异?
嘿,我来帮你搞定这个Excel文本对比的难题!你说的这种两列有大量相似甚至重复文本,要揪出每行的内容增删、格式差异(粗体、下划线、字体颜色这些),还能忽略特定字符的需求,我之前帮好几个朋友解决过,下面给你几个实用的方案,一步步来:
一、用VBA宏实现精准对比(支持格式识别+自定义忽略字符)
这个方法是最靠谱的,能满足你所有需求——不管是内容差异还是格式差异,还能指定要忽略的字符。操作起来也没那么难,跟着步骤走:
- 打开你的Excel文件,按下
Alt + F11打开VBA编辑器 - 右键点击左侧面板里的工作簿名称,选择「插入」→「模块」
- 把下面的代码粘贴到模块里,你可以根据自己的需求修改两处:
- 把
ignoreChars = Array(" ", "-", "_")里的字符改成你要忽略的(比如你想忽略逗号和空格,就改成Array(" ", ",")) - 代码里默认对比A列和B列,结果放到C列(A比B多的内容)、D列(B比A多的内容),如果你的列不一样,把代码里的
Range("A" & i)、Range("B" & i)改成对应的列就行
- 把
Sub CompareTextColumns() Dim ws As Worksheet Dim lastRow As Long Dim i As Long Dim textA As String, textB As String Dim cleanA As String, cleanB As String Dim diffA As String, diffB As String Dim ignoreChars As Variant Dim char As Variant ' 设置要忽略的字符,可自定义 ignoreChars = Array(" ", "-", "_") Set ws = ActiveSheet lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row For i = 1 To lastRow textA = ws.Range("A" & i).Value textB = ws.Range("B" & i).Value ' 清理文本:去掉要忽略的字符 cleanA = textA cleanB = textB For Each char In ignoreChars cleanA = Replace(cleanA, char, "") cleanB = Replace(cleanB, char, "") Next char ' 对比内容差异 diffA = GetDifference(cleanA, cleanB) diffB = GetDifference(cleanB, cleanA) ' 写入差异结果 ws.Range("C" & i).Value = diffA ws.Range("D" & i).Value = diffB ' 高亮原单元格中的差异内容(可选) HighlightDifferences ws.Range("A" & i), cleanB, ignoreChars HighlightDifferences ws.Range("B" & i), cleanA, ignoreChars ' 对比格式差异(粗体、下划线、颜色) CompareAndMarkFormatDifferences ws.Range("A" & i), ws.Range("B" & i) Next i MsgBox "对比完成!差异已写入C、D列,原单元格差异内容已高亮~" End Sub ' 辅助函数:获取text1比text2多的内容 Function GetDifference(text1 As String, text2 As String) As String Dim i As Long Dim result As String result = "" For i = 1 To Len(text1) If InStr(text2, Mid(text1, i, 1)) = 0 Then result = result & Mid(text1, i, 1) End If Next i GetDifference = result End Function ' 辅助函数:高亮单元格中与对比文本不同的内容 Sub HighlightDifferences(cell As Range, compareText As String, ignoreChars As Variant) Dim i As Long Dim char As String Dim cleanChar As String cell.Font.ColorIndex = xlAutomatic ' 重置颜色 For i = 1 To Len(cell.Value) char = Mid(cell.Value, i, 1) cleanChar = char ' 忽略指定字符 For Each c In ignoreChars cleanChar = Replace(cleanChar, c, "") Next c If cleanChar <> "" And InStr(compareText, cleanChar) = 0 Then cell.Characters(i, 1).Font.Color = vbRed ' 差异内容标红 End If Next i End Sub ' 辅助函数:对比并标记格式差异 Sub CompareAndMarkFormatDifferences(cell1 As Range, cell2 As Range) ' 对比粗体 If cell1.Font.Bold <> cell2.Font.Bold Then cell1.Font.Bold = Not cell1.Font.Bold ' 切换粗体标记差异,可自定义 cell2.Font.Bold = Not cell2.Font.Bold End If ' 对比下划线 If cell1.Font.Underline <> cell2.Font.Underline Then cell1.Font.Underline = xlUnderlineStyleDouble ' 双下划线标记 cell2.Font.Underline = xlUnderlineStyleDouble End If ' 对比字体颜色 If cell1.Font.Color <> cell2.Font.Color Then cell1.Interior.ColorIndex = 36 ' 浅黄背景标记 cell2.Interior.ColorIndex = 36 End If End Sub
- 回到Excel界面,点击「开发工具」选项卡→「宏」,选择
CompareTextColumns,点击「执行」就可以啦!
如果运行时提示宏被禁用,记得在Excel选项→信任中心→信任中心设置→宏设置里,选择「启用所有宏」(或者「启用无数字签署的宏」),运行完再改回去就行,安全得很。
二、不用VBA?用Excel公式做基础内容对比
如果你对代码有点犯怵,也可以用公式先做基础的差异排查:
- 第一步:批量清理要忽略的字符:比如在C列写公式
=SUBSTITUTE(SUBSTITUTE(A1," ",""),"-",""),把A列的忽略字符都去掉,D列用同样的公式处理B列(把A1换成B1) - 第二步:快速找不同行:在E列写
=EXACT(C1,D1),返回FALSE的行就是内容有差异的,直接筛选出来就行 - 第三步:找具体差异内容:可以用
=TEXTJOIN("",TRUE,FILTERXML("<t><s>"&SUBSTITUTE(C1,"","</s><s>")&"</s></t>","//s[not(contains('"&D1&"',.))]")),这个公式能把C列比D列多的字符提取出来,不过对长文本可能有点慢。
三、小提醒
- 如果你要忽略的字符比较多,公式里要多嵌套几层
SUBSTITUTE,不如VBA里改数组方便 - 格式差异的识别,Excel自带功能做不到,还是得靠VBA才能精准实现
备注:内容来源于stack exchange,提问作者Lancer




