問題背景
Excel中的vlookup函數(shù)大家在工作中應(yīng)該都經(jīng)常會(huì)使用,非常的強(qiáng)大,能夠很方便的幫助我們?cè)诖罅康臄?shù)據(jù)當(dāng)中匹配到我們想要的內(nèi)容。
但是使用vlookup()函數(shù)需要匹配的數(shù)據(jù)必須是完全一致的,不一致的話可能會(huì)匹配不出來。
如下圖,A、C列的數(shù)據(jù)不是完全一致的,使用vlookup()函數(shù)會(huì)受限制。
那這些不完全一致的名稱,有方法可以進(jìn)行快速的匹配嗎?
答案是肯定的。
解決方案 - 文本相似性判斷
這里就涉及到一個(gè)“文本相似性”的概念。判斷兩個(gè)文本是否相似的方法有很多,永恒君這里使用的是萊文斯坦距離。
萊文斯坦距離,又稱Levenshtein距離,是編輯距離的一種。指兩個(gè)字串之間,由一個(gè)轉(zhuǎn)成另一個(gè)所需的最少編輯操作次數(shù)。
關(guān)于這個(gè)問題的理論介紹,感興趣的可以看看次文《萊文斯坦距離圖解》。
通俗來說,文本A和文本B兩者的萊文斯坦距離越短,相似程度就越大。
有了萊文斯坦距離之后,就可以計(jì)算出文本A和文本B的相似程度,這部分的代碼網(wǎng)上能找到很多大神分享的,直接拿過來借鑒一下就好了。
我們假設(shè)這個(gè)計(jì)算相似程度的代碼函數(shù)為Similarity(參數(shù)1,參數(shù)2),其中參數(shù)1,參數(shù)2分別為需要對(duì)比的兩個(gè)文本,默認(rèn)是只要相似度大于0就有返回值。完全不相似的返回0。
部分代碼如下:
下面這張圖可以直觀的看到,兩個(gè)不同的文本之間,使用Similarity()函數(shù)得到的相似程度。
有了這個(gè)函數(shù)之后,我們可以再設(shè)計(jì)一個(gè)和vlookup()函數(shù)類似的SimilarityRng(參數(shù)1,參數(shù)2,參數(shù)3)函數(shù),其中
參數(shù)1為需要查找的文本,
參數(shù)2為需要查找的區(qū)域,
參數(shù)3為返回相對(duì)于查找區(qū)域位置的文本值。
部分代碼如下:
效果演示
借助SimilarityRng()函數(shù)挨個(gè)查找某個(gè)區(qū)域內(nèi)相似度最高所對(duì)應(yīng)的那個(gè)數(shù)據(jù),整個(gè)過程如下:
得到的結(jié)果如下:
=SimilarityRng(A2,$C$2:$C$10,0)
=SimilarityRng(A2,$C$2:$C$10,1)
這里需要說明的是,通過這個(gè)方法匹配出來的值不可能是100%準(zhǔn)確的,只是概率性的相似度最高,有些有可能會(huì)有較大的出入,大家需要知曉。
如下圖:
A8單元格“深圳市財(cái)富廣場(chǎng)”就匹配到的內(nèi)容就不是我們希望看到的。
以上就是關(guān)于這個(gè)實(shí)例的演示,感興趣的小伙伴可以私信我獲取vba文件進(jìn)行試用,如果覺得實(shí)用,分享給更多的朋友吧~~~
歡迎交流!