Vlookup大叔與一對多查找(Excel函數集團)


所謂一對多查找,就是根據一個條件,把多個符合條件的結果全部找出來。

其實吧,一對多查找不是什么,尤其是O365的Filter函數橫空出世震撼全場之后,簡直就是瞬間把所有傳統的數組解法甩出去七八十來條街……

但是!

這世上有一種人,叫“沒了Vlookup就吃不好睡不香”,但凡和查找搭上半點關系的問題,都必須肯定一定確定要用早已油膩的Vlookup大叔來解決。

Vlookup大叔表示,心累!

比如表格結構如下圖的一個一對多查找問題:

好在V大叔有個特別之處,就是他的參數常常會弄出些意外,比如第一參數¥#¥%@……

再比如第二參數#¥%&¥#……

所以就生出了這么個野路子的公式:

=VLOOKUP(D$2,INDIRECT("a"&SMALL(IF(A$2:A$17=D$2,ROW($2:$17)),ROW(A1))&":b17"),2,)

好吧,這公式就這么一亮相,肯定是支持頭暈模式的,還是一步一步來拆解吧。

首先,當我們遇到這個問題時,如果只需要找第一個“乙”所對應的“B”,V大叔的標准寫法是:

=VLOOKUP(D$2,A2:B17,2,)

其中的A2:B17是查找范圍,直接引用。如果改用間接引用,並不影響公式結果:

=VLOOKUP(D$2,INDIRECT("A2:B17"),2,)

即然用了間接引用,A2:B17就不再是單元格地址,而是變成了字符串,可以各種拆解了,比如拆解成這樣:

=VLOOKUP(D$2,INDIRECT("A"&2&":B17"),2,)

這樣一來,其中的2就被單獨拎了出來,這其中就可以加上一個一對多查找的慣用手法:

=VLOOKUP(D$2,INDIRECT("A"&SMALL(IF(A$2:A$17=D$2,ROW($2:$17)),ROW(A1))&":B17"),2,)

文字解釋一下就是如果A2:A17這些等於D2,也就是符合條件時,返回對應的行號,再用Small函數對返回的結果通過公式向下復制的方式從小到大排列。

所以這公式,就是這么回事了。

那么,為什么V大叔這么用就可以起到一對多查找的效果呢?如果把"A"&SMALL(IF(A$2:A$17=D$2,ROW($2:$17)),ROW(A1))&":B17"部分單獨放在一個單元格里,前面加上等號,公式完成后再向下復制,就會得出A3:B17、A7:B17、A11:B17和A15:B17這樣的結果。

說得再透明點就是,第一個公式是讓V大叔在A3:B17這個范圍內找D2對應的結果;向下復制到第二個公式是讓V大叔在A7:B17這個范圍內找D2對應的結果;繼續向下復制到第三個公式是讓V大叔在A11:B17這個范圍內找D2對應的結果;第四個公式是讓V大叔在A15:B17這個范圍內找D2對應的結果。

所以這結果是正確的、愉快的、大得V大叔忠粉們心的、皆大歡喜的……

可偏偏這公式,是個野路子,因為,選取第二參數后按F9功能鍵,結果是奇特奇異奇怪的。

當然這結果也並非來自地球以外,之所以會這樣,是因為Indirect的結果,是多維引用,而正經路子多維引用都是在外面套用SumIf、Subtotal、DSum這些函數, 且完成以后的公式還可以再在外面套函數,詳參多工作表匯總的相關公式。

而V大叔用在這時,就只能這樣了,想要在外面再套別的函數,那就……沒結果了。

這是不是函數中的一個Bug呢?

但是,不管是真Bug還是假Bug,不管是正路子還是野路子,只要能解決問題,同時大得V大叔忠粉們的心,就是好路子!

最后提示一小下下,如果您的電腦不支持動態數組,公式結束后請按【Ctrl+Shift+Enter】組合鍵,以免樂極生悲。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM