Vba 在Excel中查找重复的文本
我是Excel/VBA新手,我有一个问题。 是否可以标记Excel中两列之间的部分字符串匹配 假设我有两列,A和B,其中有文本值。我想确定A单元格和B单元格部分匹配的行 下面是一些我正在寻找的“部分匹配”的假设案例 案例1:精确短语匹配(虚构有限公司),但其中一列有额外文本 A2单元:123456789虚拟有限公司 B2单元:虚拟公司 案例2:精确的短语匹配(虚构的有限公司),但两列都有额外的文本 A3单元:123456789虚拟有限公司 B3单元:虚构的有限公司,美国纽约市大街1号,邮编:12345 案例3:部分匹配 A4单元:虚构有限公司 B4单元:虚拟公司 案例4:单词匹配 单元A5:虚拟公司 细胞B5:虚构的 我想指出以上所有这些案例。但是,我不介意运行>1组代码来覆盖所有代码 非常感谢您的帮助 更新:当我第一次创建案例时,我没有意识到我将B列中的第一个单词作为与A列匹配的单词。事实并非如此,有时B列中的第三个单词与A列中的第五个单词匹配。。数据到处都是Vba 在Excel中查找重复的文本,vba,excel,Vba,Excel,我是Excel/VBA新手,我有一个问题。 是否可以标记Excel中两列之间的部分字符串匹配 假设我有两列,A和B,其中有文本值。我想确定A单元格和B单元格部分匹配的行 下面是一些我正在寻找的“部分匹配”的假设案例 案例1:精确短语匹配(虚构有限公司),但其中一列有额外文本 A2单元:123456789虚拟有限公司 B2单元:虚拟公司 案例2:精确的短语匹配(虚构的有限公司),但两列都有额外的文本 A3单元:123456789虚拟有限公司 B3单元:虚构的有限公司,美国纽约市大街1号,邮编:12
*更新2:*还想澄清情况是可逆的-例如,有些行的情况是1,但单元格B比单元格A有更多信息。情况1是可能的,只需截断较长的长度,使其与较短的长度匹配,然后查看它们是否相同。使用LEFT函数将较长的单词修剪为较短单词的长度。(使用LEN函数计算较短单词的长度) 案例2很棘手,但也有可能,因为您实际上需要从较短的字符串中搜索较长的字符串,以查找每个可能的有序单词组合。这是案例3的“稍微简单”版本 案例3非常棘手:它几乎是一个模糊匹配,计算成本很高,需要一种称为标记化的方法才能有效地完成。微软有一个免费的,但它有点糟糕…它返回了许多误报,以至于你需要仔细观察每一个结果,以确保它是一个有效的。这完全违背了目的。我自己也在致力于在该领域推出一款商业产品,它的误报率要低得多,但不能共享代码。可以说,这是一件很难有效完成的事情 案例4很简单:您只需使用搜索公式 如果你在每个列表中都有多个单词,那就再增加一层技巧
以上答案足以为您指明谷歌搜索的正确方向。请注意,您可以通过使用替换公式替换掉诸如“Ltd”和“Limited”以及其他各种术语来简化事情,但您仍然面临着巨大的挑战 此函数返回
Txt1
中的一个单词包含在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
…这一个也做了同样的事情,但也统计了Txt1
中任何地方出现的Txt2
:
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
样本输出:
我很好奇这是否符合你的需要(因为它显然不是真正的“模糊匹配”)
它可以很容易地修改为返回TRUE
/FALSE
(即TRUE
=一个或多个匹配项),或者只查找整个单词匹配项,而不是“任意位置”
如果你有任何问题,请告诉我 所以您总是想检查B列中的第一个单词是否存在于A列中的相邻单元格中?如果这是正确的,它足够简单,甚至不需要VBA…嗨@ashleedawg谢谢你的回复!我没有意识到,我总是举例说明潜在匹配总是B列中的第一个单词。情况并非总是如此,有时是相反的(例如,B列中的第二个单词与A列中的第一个单词匹配)。我也会修改帖子来反映这一点。所以你只需要知道B栏的第一个或第二个单词是否存在于A栏的相邻单元格中?Easy我希望它只是第一个或第二个,但数据到处都是-有时B列中的第三个单词和A列中的第五个单词匹配..好吧-但总是一个完整的单词?(即,word=用空格分隔的文本)如果是这样,简单的enoughHi@jefferyweir谢谢你的回答!我明白你对案例1和案例2的解释。但是,如果每行匹配短语的长度不同,这意味着我必须改变要截断的字符长度,对吗?是的,第三种情况很复杂。对于案例4,请您详细说明一下?通常只有一个单词在两列上匹配。正确,您必须更改。你真的需要提供一个更好的屏幕截图,显示一些真实的样本数据和相关的布局,以帮助我们制定可能的方法。@jeffreyweir——说到模糊匹配——你看到了吗?:)@ashleedawg我还没有真正调查过SoundEx。我正在使用Levenshtein差分法,还做了大量的优化工作,包括在“别名”字典中输入,这些字典将等价的单词或名称相互映射,例如Jeffrey=Jeffrey=Geoffrey=Geoffery=Jeffrey=Geoffery=Geoff。对名字很有用,我已经在一些很酷的生产环境中使用过它,但仍然需要在它周围包装一个用户界面以供一般使用。嗨@ashleedawg,我已经测试过这个脚本,自定义函数工作得非常好!这正是我所需要的。非常感谢你的帮助!你刚刚救了我一命