在Excel中查找文本重复项

时间:2018-04-10 03:26:49

标签: excel vba excel-vba

我是Excel / VBA的新手,我有一个问题。 是否可以在Excel中标记两列之间的部分字符串匹配?

假设我有两个列,A和B,其中包含文本值。我想识别A单元格和B单元格部分匹配的行。

以下是我正在寻找的“部分匹配”的一些假设案例。

案例1:完全匹配的词组匹配(Fictional Company Ltd),但有一列有额外的文字

Cell A2:123456789 Fictional Company Ltd

Cell B2:Fictional Company Ltd

案例2:完全匹配的词组匹配(Fictional Company Ltd)但两列都有额外的文字

Cell A3:123456789 Fictional Company Ltd

Cell B3:Fictional Company Ltd,1 Main Street,City,State 12345

案例3:部分匹配

Cell A4:Fictional Ltd

Cell B4:Fictional Company Ltd

案例4:字匹配

Cell A5:Fictional Company Ltd

细胞B5:虚构

我想确定上述所有案例。但是,我不介意运行> 1组代码来覆盖它们。

非常感谢您的帮助!

更新:当我第一次创建案例时,我没有意识到我将列B中的第一个单词作为匹配单词放在列A中。事实并非如此 - 有时它是B列中的第3个字和A列中匹配的第5个字......数据到处都是!

*更新2:**还想澄清案例是可逆的 - 例如,有些行是案例1,但是单元格B有更多信息而不是单元格A.

2 个答案:

答案 0 :(得分:0)

案例1是可能的,只需截断较长的长度,使其与较短的长度匹配,然后查看它们是否相同。使用LEFT功能将较长的单词修剪为较短的单词的长度。 (使用较短的单词上的LEN函数计算出它的长度。)

案例2很棘手,但可能,因为您实际上需要在较短的字符串中搜索较短字符串中每个可能的有序字组合。这是案例3的“稍微简单”的版本。

案例3非常棘手:它几乎是模糊匹配,计算成本很高,并且需要一些称为令牌化的东西才能有效地完成。微软有一个免费的Fuzzy Match addin,但它有点太糟糕了......它会让许多误报,你需要注意每一个结果以确保它是有效的。这完全违背了目的。我正在努力在这个领域整合一个商业产品,它可以返回更少的误报,但不能共享代码。我只想说这是一件非常困难的事情。

案例4很简单:您只需使用SEARCH公式。

如果每个列表中有多个单词,请添加整个'其他层次的棘手程度。

上述答案足以让您指出Google搜索的正确方向。请注意,您可以通过使用SUBSTITUTE公式替换诸如“Ltd”和“Limited”之类的内容以及其他杂项来简化操作,但您仍然需要掌握一个挑战。

答案 1 :(得分:0)

此函数返回Txt1中<{1}}中{/ 1}}中的某个单词包含(不仅仅是单词)的次数:

Txt2

...而且这个也是一样,但计算Function CountMatches(text1 As String, text2 As String) As Long Dim arr, x As Long arr = Split(text2) For x = 0 To UBound(arr) If text1 Like "*" & arr(x) & "*" Then CountMatches = CountMatches + 1 Next x End Function Txt2内每个Txt1的出现次数:

Function CountMatches2(text1 As String, text2 As String) As Long
    Dim arr, x As Long
    arr = Split(text1)
    For x = 0 To UBound(arr)
        If text2 Like "*" & arr(x) & "*" Then CountMatches2 = CountMatches2 + 1
    Next x
    arr = Split(text2)
    For x = 0 To UBound(arr)
        If text1 Like "*" & arr(x) & "*" Then CountMatches2 = CountMatches2 + 1
    Next x
End Function

两者都容易计算两次相同的比赛,特别是(显然)CountMatches2

样本输出:

img

我很好奇这是否适合你的需求(因为它显然不是真正的“模糊匹配”)......

可以轻松修改它以返回TRUE / FALSE(即,TRUE =一个或多个匹配项)或仅查看 单词匹配而不是“任何地方”。

如果您有任何疑问,请与我联系!