close

396

使用LOOKUP函數實現無序查詢

示範檔

範例檔

結果檔

LOOKUP函數有一個經典的條件查找解法,通常公式基本可以寫為:

LOOKUP(2,1/(條件),查找陣列或範圍)

LOOKUP(1,0/(條件),查找陣列或範圍)

很多初學者對此感覺非常詫異就,主要疑惑有:

1、公式中的210等數字有什麼含義,明明在查找條件與這3個數字根本毫無聯繫,怎麼能得到正確結果?

2、明明LOOKUP函數說明需要「升序」查找,否則可能無法傳回正確的值,上面這種解法又是如何得改變這一說法呢?

3、據說LOOKUP函數的查找順序是「二分法」,並且有流程圖可依循,是否可以結合此範例進行講解?

LOOKUP

查閱與參照

功能:。

語法:LOOKUP(Lookup_value,Lookup_vector,Result_vector)

參數: Lookup_value:為必需要參數,是LOOKUPLookup_ventor中投尋的值,可為數值、文字、邏輯值、或是名稱或某值的參照位址。
Lookup_vector
:為必需要參數,其僅包含單列或單欄文字、數字或邏輯值的範圍並以遞增順序排列。
Result_vector
:為必需要參數,其僅包含單列或單欄文字,大小與Lookup_vector
相同。

注意: Lookup_vector中的值必須以升序排列:...,-2,-1,0,1,2,...,A-Z,FALSE,TRUE。否則,LOOKUP可能無法傳回正確的值。大寫英文文字和小寫英文文字是等同的。
如果LOOKUP函數找不到Lookup_value,則它與Lookup_vector中小於或等於Lookup_value的最大值匹配。
如果Lookup_value小於Lookup_vector中的最小值,則LOOKUP會傳回#N/A
錯誤值。

【釋疑】簡要地說,從邏輯推理來看:

1、首先,條件是一組邏輯判斷的值或邏輯運算得到的由TRUEFALSE組成或者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/(條件),查找陣列或範圍)

 


arrow
arrow

    錦子老師 發表在 痞客邦 留言(0) 人氣()