Excel VBA实例(34) - 快速匹配出名称不完全相同的数据,vlookup都做不到

问题背景

Excel中的vlookup函数大家在工作中应该都经常会使用,非常的强大,能够很方便的帮助我们在大量的数据当中匹配到我们想要的内容。

但是使用vlookup()函数需要匹配的数据必须是完全一致的,不一致的话可能会匹配不出来。

如下图,A、C列的数据不是完全一致的,使用vlookup()函数会受限制。

那这些不完全一致的名称,有方法可以进行快速的匹配吗?

答案是肯定的。

解决方案 - 文本相似性判断

这里就涉及到一个“文本相似性”的概念。判断两个文本是否相似的方法有很多,永恒君这里使用的是莱文斯坦距离。

莱文斯坦距离,又称Levenshtein距离,是编辑距离的一种。指两个字串之间,由一个转成另一个所需的最少编辑操作次数。

关于这个问题的理论介绍,感兴趣的可以看看次文《莱文斯坦距离图解》。

通俗来说,文本A和文本B两者的莱文斯坦距离越短,相似程度就越大。

有了莱文斯坦距离之后,就可以计算出文本A和文本B的相似程度,这部分的代码网上能找到很多大神分享的,直接拿过来借鉴一下就好了。

我们假设这个计算相似程度的代码函数为Similarity(参数1,参数2),其中参数1,参数2分别为需要对比的两个文本,默认是只要相似度大于0就有返回值。完全不相似的返回0。

部分代码如下:

下面这张图可以直观的看到,两个不同的文本之间,使用Similarity()函数得到的相似程度。

有了这个函数之后,我们可以再设计一个和vlookup()函数类似的SimilarityRng(参数1,参数2,参数3)函数,其中

参数1为需要查找的文本,

参数2为需要查找的区域,

参数3为返回相对于查找区域位置的文本值。

部分代码如下:

效果演示

借助SimilarityRng()函数挨个查找某个区域内相似度最高所对应的那个数据,整个过程如下:

得到的结果如下:

=SimilarityRng(A2,$C$2:$C$10,0)

=SimilarityRng(A2,$C$2:$C$10,1)

这里需要说明的是,通过这个方法匹配出来的值不可能是100%准确的,只是概率性的相似度最高,有些有可能会有较大的出入,大家需要知晓。

如下图:

A8单元格“深圳市财富广场”就匹配到的内容就不是我们希望看到的。

以上就是关于这个实例的演示,感兴趣的小伙伴可以私信我获取vba文件进行试用,如果觉得实用,分享给更多的朋友吧~~~


欢迎交流!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章