HI,大家好,我是星光。
Excel函數社群裡有一道數據模糊匹配的練習題,如下圖所示:
A:F列是數據源。需要在I2:K5區域編寫函數公式,查詢H列人名相關科目的考試成績。
H列人名可能是簡寫,比如星光,對應A列的人名是看見星光。
這樣的問題,我們通常使用VLOOKUP函數。
打個響指,還記得嗎?VLOOKUP函數支持模糊匹配查詢。
有朋友說,當然記得,把第4參數改成TRUE或者非0的數值就是模糊匹配了:
^.^咱們這說的模糊匹配查詢和VLOOKUP的第4參數沒啥關係。正確解法公式如下:
=VLOOKUP("*"&$H2&"*",$A:$G,5,0)"*"&$H2&"*"部分,*是通配符,可以代替0到多個字符,H2兩邊都帶有通配符,意思也就是包含H2的字符串,以此作為VLOOKUP的查詢值。
但上面這條公式,固定返回數據源第5列,也就是語文成績;如果我們需要動態返回數學、政治等科目的成績,還需要將VLOOKUP的第3參數,修改為MATCH函數:
MATCH函數返回多列 ▼
=VLOOKUP("*"&$H2&"*",$A:$G,MATCH(I$1,$A$1:$G$1,0),0)
MATCH函數查詢J1的科目名稱在數據源標題行的位置,以此作為VLOOKUP的第3參數。
最後再包裝一個IFERROR函數,將查無結果的人名顯示為"查無"即可。
IFERROR屏蔽錯誤值 ▼
=IFERROR(VLOOKUP("*"&$H2&"*",$A:$G,MATCH(I$1,$A$1:$G$1,0),0),"查無")
……
那麼除了VLOOKUP,還有哪些函數也可以解決同樣的問題呢?
INDEX函數▼
代碼看不全可以左右拖動..▼
=IFERROR(INDEX($A:$F,MATCH("*"&$H2&"*",$A:$A,0),MATCH(I$1,$A$1:$F$1,0)),"查無")
利用MATCH函數也支持使用通配符的特點,查詢相關人名和科目的行列位置,再通過INDEX函數按圖索驥。
HLOOKUP函數▼
代碼看不全可以左右拖動..▼
=IFERROR(HLOOKUP(I$1,$A:$F,MATCH("*"&$H2&"*",$A:$A,0),0),"查無")XLOOKUP函數▼
代碼看不全可以左右拖動..▼
=XLOOKUP("*"&$H2&"*",$A$2:$A$22,XLOOKUP(I$1,$A$1:$F$1,$A$2:$F$22),"查無",2)關於XLOOKUP函數的詳細教程可以閱讀:
12個案例!帶你從入門到進階全面解析函數新貴XLOOKUP
FILTER函數▼
=FILTER(FILTER($B$1:$F$22,$B$1:$F$1=I$1),ISNUMBER(SEARCH($H2,$A$1:$A$22)),"查無")關於FILTER函數的詳細教程可以閱讀:
FILTER才是365新函數系列的核心,而不是XLOOKUP……
LOOKUP函數▼
代碼看不全可以左右拖動..▼
=IFERROR(LOOKUP(0,-SEARCH($H2,$A$2:$A$22),OFFSET($A$2:$A$22,0,MATCH(I$1,$B$1:$F$1,0))),"查無")本例中,LOOKUP函數實現模糊匹配的核心是SEARCH函數,而不是通常所使用的FIND函數。這是由於FIND函數區分字母大小寫,而SEARCH並不區分,後者更具有通用性。
那麼為什麼大家往往選擇FIND函數,而不是SEARCH函數呢?看我嚴肅的小眼神,這屬於歷史遺留問題。過去的人們寫函數產生了內卷,以至於對函數字符串的長度產生了嚴重的潔癖——通過函數公式的長度來判斷一個人水平的高低,SEARCH比FIND多出兩個字母,就顯得函數編寫者的逼格不夠高……
關於字母大小寫的區分查詢問題,可以參考往期教程:
=IF("a"="A","對","錯")返回對還是錯?又有什麼作用?
……
最後再給大家留一道練習題,也是關於數據模糊匹配查詢的。
A:F是數據源。需要在G2:I5區域編寫函數,獲取F列人名相關科目的考試成績。F列人名可能包含除了人名以外的信息,比如查找值公眾號Excel星球,對應A列的人名是Excel星球。
沒了,今天給大家分享的內容就這樣,左上角點關注,右下角點個讚,咱們下期再見。
案例文件下載百度網盤..▼
https://pan.baidu.com/s/15Y45iz6aw8VUi2yNRzVacw 需要系統學習Excel,卻找不到優質教程?學習Excel的過程中遇到疑難問題,卻找不到人及時作出解答?加入我的付費社群,和2000+學員共同精進Excel,這一切都不是問題……