Excel VBA實例(34) - 快速匹配出名稱不完全相同的數據,vlookup都做不到

問題背景

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文件進行試用,如果覺得實用,分享給更多的朋友吧~~~


歡迎交流!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章