微信公众号:yhjbox(永恒君的百宝箱),获取最新文章、资源。

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

Excel VBA 实例 永恒君 2912℃ 0评论

问题背景

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单元格“深圳市财富广场”就匹配到的内容就不是我们希望看到的。

以上就是关于这个实例的演示,感兴趣的小伙伴可以在公号内回复「simi」获取vba文件进行试用,如果觉得实用,分享给更多的朋友吧~~~

 

你可能还会想看:

VBA 实例(33) – 一键提取word中加粗文字
VBA 实例(32) - 批量替换隐藏的神秘字符
VBA 实例(31) - 为VBA代码自定义快捷键
VBA 实例(30) - 为多个sheets创建目录和超链接

 

欢迎交流!

转载请注明:永恒君的百宝箱 » Excel VBA 实例(34) – 快速匹配出名称不完全相同的数据,vlookup都做不到

喜欢 (9)
发表我的评论
取消评论
表情