问题背景
如下图,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都做不到