Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 在Excel中查找重复的文本_Vba_Excel - Fatal编程技术网

Vba 在Excel中查找重复的文本

Vba 在Excel中查找重复的文本,vba,excel,Vba,Excel,我是Excel/VBA新手,我有一个问题。 是否可以标记Excel中两列之间的部分字符串匹配 假设我有两列,A和B,其中有文本值。我想确定A单元格和B单元格部分匹配的行 下面是一些我正在寻找的“部分匹配”的假设案例 案例1:精确短语匹配(虚构有限公司),但其中一列有额外文本 A2单元:123456789虚拟有限公司 B2单元:虚拟公司 案例2:精确的短语匹配(虚构的有限公司),但两列都有额外的文本 A3单元:123456789虚拟有限公司 B3单元:虚构的有限公司,美国纽约市大街1号,邮编:12

我是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列中的第五个单词匹配。。数据到处都是


*更新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,我已经测试过这个脚本,自定义函数工作得非常好!这正是我所需要的。非常感谢你的帮助!你刚刚救了我一命