Excel常用公式之LOOKUP

2021-10-03 16:53:03 字數 3866 閱讀 2142

lookup公式用於通過查詢值從乙個表中查詢想要的對應值。例如利用學生的名字從成績單中查詢他對應的分數。

lookup(查詢值,查詢列表,返回列表)

如圖所示ab兩列為省份和其對應的**。在e2位置的公式為=lookup(d2,b2:b33,a2:a33),意思是在b列中查詢和d2相同的值,如果找到了就返回對應的a列的值。在h2位置的公式為=lookup(g2,a2:a33,b2:b33),意思是在a列中查詢g2的值,如果找到了就返回對應的b列的值。

從結果可以看出,這兩個查詢都失敗了,乙個返回了錯誤的結果,乙個不返回結果。這是因為lookup函式的設計十分搞糟,一度導致沒人願意用這個函式,直到有人開發出高階用法。那麼這個函式糟糕在哪呢?

在lookup函式中,查詢列表必須按從小到大的順序排列,那有人說這裡b列是字串怎麼從小到大,實際上字串也是有大小的,字串的大小就是字元在編碼表中的編號,從第乙個字元開始依次比較,直到比出大小。為什麼微軟的程式設計師要做這麼糟糕的設計呢?我的理解是為了提高搜尋效率,據我猜測,他們應該採用的是二分查詢的策略,在二分查詢過程中,返回不大於查詢值的最後乙個被比較大小的值。

二分查詢具體可以看下面這篇文章,有乙個比較好理解的動態圖:二分查詢(binary search)

但這就導致這個函式幾乎沒法使用了,畢竟大部分時候查詢列表都是亂序的。最終這個函式的結果很迷,想具體了解的可以看下面的補充說明。

那麼為什麼h2也查不到結果呢?明明a列已經按從小到大的順序排列了。這是因為g列是數字,而a列是文字,想要查詢就把g列轉為文字吧。把h2的公式改為=lookup(text(g2,0),a2:a33,b2:b33)即可,結果如下:

如果你依舊無法理解lookup函式為什麼會返回錯誤的結果,可以看如下內容:

通過三面的個實驗結果,我基本可以確定lookup這個函式就是採用的二分查詢法。按照二分查詢的原理,這個列表有6個數,那麼圖2對應步驟如下:

比較第3個數,發現是5,比查詢值4更大,由於演算法認為列表是從小到大排列的,因此後續只需要比較第1到第2個數就行。

比較第1個數,發現是1,比查詢值4更小,那麼演算法認為正確的值就是第2個數,於是返回b列對應行的「反」。

圖3對應的步驟如下:

比較第3個數,發現是5,比查詢值4更大,由於演算法認為列表是從小到大排列的,因此後續只需要比較第1到第2個數就行。

比較第1個數,發現是5,比查詢值4更大,由於第1個數前面已經沒有數字了,因此認為找不到結果,返回錯誤。

掌握lookup函式的原理之後,我們就可以調戲一下它,看下面的例子,你能想清楚為什麼會出現這樣的結果嗎?明明有3個正確答案,lookup竟然全都錯過了!

答案如下:

比較第3個數,發現是3,比查詢值4更小,由於演算法認為列表是從小到大排列的,因此後續只需要比較第4到第6個數就行。

比較第5個數,發現是3,比查詢值4更小,因此後續只需比較第6個數。

發現第6個數是5,比4大,按照演算法設定,只返回比查詢值小的最後乙個被比較大小的值,因此退回一步,返回第5個數對應的b列,也就是「設」。

我們再來看乙個有趣的例子,如果所有答案都是正確答案會怎麼樣?

這裡我們發現了lookup函式的另乙個特性,就是將正確結果當作比查詢值小來對待,會繼續向後查詢直到最後乙個符合要求的值。這大概是為了保證演算法的一致性,看來微軟還是動了點腦子。如果不這麼做,那麼列表長度不同,二分查詢時二分的位置不同,都會導致不同的結果,畢竟每個值都是正確結果嘛,那我二分時第乙個比較的值不就成了返回值了嘛,這會造成混亂,所以不如每次都返回最後乙個。

具體查詢步驟如下:

比較第3個數,發現是4,當作比查詢值4更小,由於演算法認為列表是從小到大排列的,因此後續只需要比較第4到第6個數就行。

比較第5個數,發現是4,當作比查詢值4更小,因此後續只需比較第6個數。

發現第6個數是4,當作比查詢值4更小,由於已經是最後一行了,按照演算法設定,只返回比查詢值小的最後乙個被比較大小的值,因此返回第6個數對應的b列,也就是「計」。

lookup(1,0/(查詢條件),返回列表)

上面已經提到了,lookup函式的常規用法幾乎毫無用處,但是有人開發了它的高階用法後,這個函式就成了最強查詢函式,吊打vlookup函式毫無問題。

為什麼說這個lookup函式是最強查詢函式呢?因為這裡的「查詢條件」可以是任意的邏輯判斷語句,不僅僅限於等於判斷。比如這裡我們改一下,我想查詢「上海」對應的編碼怎麼辦,少了個「市」那麼正常情況下就查不到相等的值啊。簡單,用search函式啊,search函式返回的是查詢字串在被查詢字串中首次出現的位置編號,如果查不到則返回出錯。因此只要能查到值分母就不為零,那麼0/(查詢條件)就不出錯,不出錯的結果即是最終查詢到的結果。

如果你無法理解上面的內容,那麼請看下面的補充說明。

我們先看看0/(查詢條件)的結果是什麼,如上圖所示,只有第4行4=4的結果為true,其他幾行結果都是false,而false相當於0,分母為0自然就報了乙個#div/0!的錯誤,意思是「error:divided by 0!」。

然後我們再回顧一下我們的查詢公式:

lookup(1,0/(查詢條件),返回列表)

其中0/(查詢條件)列表只有第4個不報錯,而報錯的都被捨去了,也就是說最後參與和查詢值比較的列表只有這一行的資料,只要查詢值大於等於0/(查詢條件)列表中這一行的值,那麼就會返回返回列表中這一行對應的值。而0/true=0/1=0,所以只要查詢值大於等於0不就可以了,反正你莫得選擇,候選人就這乙個,你愛選不選。

如上面的例子所示,我們用上了高階用法,這裡我們將查詢值設為0是為了更好說明問題,建議大家還是用1保險,以防哪天微軟突然良心發現了修改**。

由於0/(查詢條件)列表中有三行為0,三行為錯誤,錯誤的行會被刪掉,那麼問題相當於轉化為如下圖所示:

上圖的結果我相信大家都知道是怎麼來的吧?3個都對選最後乙個而已。

excel 常用公式

四捨五入 round 數値,位數 向上進製 ceiling 1.771,0.01 1.78 固定列 a4 e 2 查詢個數 countif g12 j12,引用其他sheet頁的單元格 a1 計算i2到i83中內容等於f90的內容,且h2到h83內容為空的個數 countifs i 2 i 83,f...

常用 Excel 公式

注意 當單元格顯示格式為文字時,寫公式是沒有效果的,只是單純的文字。需要設定單元格為文字格式以外的格式時,公式才會生效。有時候,因為誤操作,會在檔案的末尾出現大量的空白行,在拖動滾動條的時候也很麻煩,不能精準的定位。這時候只需要刪除這些空白行,就可以了。方法 選中空白行的起始行 然後 ctrl sh...

EXCEL 常用公式

斷乙個條件是否滿足 如果滿足返回乙個值,如果不滿足則返回另外乙個值 多用於計算簽收率或上網率,排除發貨數為0的情況 如果公式的計算結果錯誤,則返回您指定的值 否則返回公式的結果 多用於計算出平均時效或時效方差為錯誤時 如果表示式解析為 n a,則返回你指定的值 否則返回表示式的結果 多用於vlook...