問題背景
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文件進行試用,如果覺得實用,分享給更多的朋友吧~~~
歡迎交流!