问题背景
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文件进行试用,如果觉得实用,分享给更多的朋友吧~~~
欢迎交流!