2021-05-12 14:32:11
使用LOOKUP函數實現無序查詢
LOOKUP函數有一個經典的條件查詢解法,通用公式基本可以寫為:
LOOKUP(2,1/(條件),查詢陣列或區域)
或
LOOKUP(1,0/(條件),查詢陣列或區域)
很多初學者對此感覺非常詫異就,主要疑惑有:
1、公式中的2、1、0等數位有什麼含義,明明在查詢條件與這3個數位根本毫無聯絡,怎麼能得到正確結果?
2、明明LOOKUP函數說明需要“升序”查詢,否則可能無法返回正確的值,上面這種解法又是如何得改變這一說法呢?
3、據說LOOKUP函數的查詢順序是“二分法”,並且有流程圖可循,是否可以結合此例進行講解?
【函數幫助資訊摘錄】
語法:LOOKUP(lookup_value, lookup_vector, result_vector)
1、[要點] lookup_vector 中的值必須以升序排列:...,-2, -1, 0, 1, 2, ..., A-Z, FALSE, TRUE。否則,LOOKUP 可能無法返回正確的值。大寫文字和小寫文字是等同的。
2、如果 LOOKUP 函數找不到 lookup_value,則它與 lookup_vector 中小於或等於 lookup_value 的最大值匹配。
3、如果 lookup_value 小於 lookup_vector 中的最小值,則 LOOKUP 會返回 #N/A 錯誤值。
【釋疑】簡要地說,從邏輯推理來看:
1、首先,條件是一組邏輯判斷的值或邏輯運算得到的由TRUE和FALSE組成或者0與非0組成的陣列,因而:1/(條件)的作用是用於構建一個由1或者#DIV!0錯誤組成的值。
2、根據LOOKUP函數說明中的這一條:
如果 LOOKUP 函數找不到 lookup_value (即:2),則它與 lookup_vector 中小於或等於 lookup_value 的最大值(即:1)匹配。
也就是說,要在一個由1和#DIV!0組成的陣列中查詢2,肯定找不到2,因而將返回小於或等於2的最大值(也就是1)匹配。
為什麼要用2來查詢1或用1來查詢0呢?因為如果有多個與第1引數相等的值,則Lookup就不一定返回“最後一個”所對應的記錄,所以必須養成一個良好習慣,
而不要用:LOOKUP(1,1/(條件),……,或LOOKUP(,0/(條件),……
3、如果有多個滿足條件的紀錄,為何只返回最後一個,而不是第一個或其他呢?這個解釋就需要二分法流程圖的模擬了。而對於一般使用者來說,只需要記住“查詢滿足條件的最後一個記錄”可以使用通用公式
LOOKUP(2,1/(條件),查詢陣列或區域)
或
LOOKUP(1,0/(條件),查詢陣列或區域)
相關文章