花葉草木深,工作要加薪。最近收到資深粉絲髮來的私信:廖老師,我對於VLOOKUP的逆向查詢中使用IF和數組用法不太理解,您能詳解一下嗎?
當然,所以今天就抽時間來扒一下,隱藏在IF函數和數組用法裡的是什麼樣的原理呢?不過在回答問題之前,我還是先來重溫一下IF函數的基本用法。
01IF函數基本用法
IF函數是Excel比較常用函數之一,有函數中的萬金油之稱。在很多書中,介紹IF函數時,都喜歡用劃分等級的例子來解釋函數的用法,並告訴我們如何嵌套來解決問題,當然微軟也很給力,在Excel 2007版將嵌套的層數增加到67層,這樣我們是不是就能在工作很愉快跟IF函數玩耍了呢?然而現實很骨感,反而在很多大公司的編程規範中,明確規定不得使用IF函數嵌套層數超過3層,而且等級劃分儘量不要使用IF來完成。那麼問題來了,IF函數到底犯了什麼錯,竟會被公司雪藏呢?
因為用IF函數嵌套分級的規律:劃分N個層級需要N-1個if嵌套,若劃分層級太多,就會導致IF函數嵌套邏輯結構複雜,代碼冗長,一旦出現問題,查找原因非常困難,這也是為什麼大公司雪藏它在分級上應用的原因。
不過這些不是本文的重點,再聊重點之前,還是先來了解一下IF的基礎用法吧!
語法結構:IF(條件表達式,為真的結果,為假的結果)
條件表達式:通常為單元格引用+比較運算符+值或函數,不過存在最簡形式,只保留值,這時值除了有2種類型,邏輯值和數字:TURE/非0(真)和FALSE/0(假),還有一種常為0或1的數組形式;為真的結果:條件表達式成立時,顯示的值或方式,可為公式,函數,引用範圍外,還可以是數值,字符串,字符串需要用雙引號包裹;為假的結果:條件表達式不成立時顯示的值或處理方式,值和處理方式同上;注:若不論條件表達式為真或假,不想做任何處理,可以留空,若函數返回參數留空,則函數最終運行結果為0;
IF函數的使用邏輯並不難理解,它其實就是一個最多有2個選項的單選題,比如C2,錄入公式IF(B2>=60,「及格」,」不及格」),同行B列單元格的值大於等於60,及格,否則不及格。了解了IF函數的基本用法,是不是賊簡單,接下來就一起看看數組知識點。
02數組
如果你想精通Excel函數的用法,數組就是你必須要跨過的坎,只有熟悉了數組的一些原理,才能在解決問題的時候,做到遊刃有餘。
當然數組部分包含的知識點也不少,有數組的運算,一維和二維如何互相轉化,函數的數組模式,以及數組分為幾種類型,這些我會在後面的文中重點介紹,而今天我們只用到兩個概念:一維數組和二維數組。
一維數組:在Excel中也是有方向之分:橫向一維和縱向一維;橫向以,逗號為間隔,縱向以分號為間隔,其中每個元素可以為文本,數字,日期,TRUE/FALSE,為文本時,需用雙引號包裹;
二維數組:是指同時包含橫向和縱向,在書寫時,橫向和縱向的原素是有順序的:先縱後橫,體現在符號上,先逗號後分號;其中的元素的數據類型同上,結構如下圖:
雖然概念上很陌生,實際我們所使用的工作表,就是一個固定長度和高度的二維數組,若整個單列或截取一部分就是縱向一維引用數組,比如:A1:A8,同理橫向數組為單行或單行的一部分:C1:H1表格的二維數組則同時包含引用範圍的行和列:C2:D8
03分析IF函數和數組用法原理
我在IF函數中使用數組作為條件表達式,並不是老師教的,也不是在書中看的,只是一時的突發奇想:如果用數組作為IF函數的條件,哪麼函數運行的結果是數組嗎?
於是我就在空白的單元錄入了公式=IF({1,0},TRUE,FALSE),返回結果為TRUE,這不和平常的用法沒區別嗎?不對,是不是我測試的方式不對,趕緊用調試工具【公式求值】來檢查一下公式的運行過程:
選中錄入公式的單元格,點擊【公式】下的【公式求值】按鈕,彈出公式求值窗口,點擊求值;
結果還是TURE,接著我就在旁邊的單元格錄入={1,0},回車結果為1,原來系統會自動讀取數組的第一個值作為最終結果,那麼問題來了,怎麼樣才能讀取公式的其它結果呢?
當然,首選就是能讀取數組的函數INDEX,若能讀出第2個值,也能證明返回的結果就是數組;按照慣例用INDEX函數之前需先簡介一下用法,而在這隻涉及它的一維數組用法:
語法結構:=INDEX(一維數組,位置);功能:讀取數組中對應位置的元素;測試中,條件數組只包含2個元素,所以測試的公式修改為=INDEX(IF({1,0},TRUE,FALSE),2),回車後,返回的結果為FALSE,結果證明返回的確實是數組,雖然到這基本可以推測出數組為:{TRUE,FALSE},不過還是通過【公式求值】按鈕,來驗證一下,具體公式的運行過程如下:
上圖在第1次點擊求值時,可以看到IF函數的執行結果為{TRUE,FALSE},通過跟條件表達式的{1,0}對比就能知道,原來可以用數字1/0順序,來控制真假結果在數組的順序;如果再將公式中的TRUE/FALSE都換成數組,那結果又會是怎麼呢?
不過由於數組有三種類型,而IF函數的參數為3個,若想說明所有的情況,恐怕再有一兩篇文章也寫不完,所以這裡我就只介紹關於逆向查詢有關的2種情況,並將其概括為2個原型:
IF({1,0},一維縱向數組1,一維縱向數組2)IF({1;0},一維橫向數組1,一維橫向數組2)上面原型的運行結果,都會返回一個新的二維數組,數組1和數組2的順序,也可以通過1,0的順序來控制,先來個簡單的例子,近距離了解一下生成的規律:
公式1:IF({0,1},{2;3;5;6},{7;8;9;10}) 生成一個二維數組:{7,2;8,3;9,5;10,6},類似數組合併,結果改變了兩列元素的順序;
公式2:IF({0;1},{2,3,5,6},{7,8,9,10})生成的新二維數組:{7,8,9,10;2,3,5,6},類似數組拼接,結果改變了兩行元素的順序;
如果將上面公式中的結果數組用單元格引用代替,不就能實現單元格引用範圍的重排了嗎?不過在使用的時候,有1點值得注意:
結果的引用範圍必須行數或列數相同且位置對應,否則行數或列數少的會返回部分#N/A或者結果錯誤;使用逆向查詢的函數並非只有VLOOKUP,還有HLOOKUP,下面就來看看逆向查詢是如何實現的。
04逆向查詢的實現
在LOOKUP系查詢家族中,VLOOKUP和HLOOKUP函數要求比較苛刻:
VLOOKUP使用時查找的值必需在引用範圍的第一列;HLOOKUP則是查找的值必須在引用範圍的第一行;由於大部分的表格,數據存儲都是以行為一條數據的結構,所以HLOOKUP按列查詢在使用率上就沒有VLOOKUP高。我就VLOOKUP為例,簡單的示範一下,逆向查詢的實現:
現有一張工資表,數據結構如下:
求根據姓名查詢出工號?
分析:根據VLOOKUP函數要求,姓名必須出現查詢範圍的第一列,上圖可知,工號在A列,姓名在B列,所以要VLOOKUP來查詢,就必須用到上面的公式1,來調整列的順序。不過調整順序的寫法並非只有一種,因為A列,B列的結果的順序有2種組合,條件數組中的1,0的順序也有2種可能,所以可以組合出四種寫法,而我選擇條件數組的種的1對應A列引用,0對應B列引用,其中一種的寫法:IF({0,1},A:A,B:B);在帶入VLOOKUP函數之前,先回顧一下函數用法:
VLOOKUP(查找值,查找引用範圍,返回結果所在列數,查找模式編碼)
之後把編寫的IF公式代替查找引用範圍,返回結果所在列數為2,查找模式編碼為0(精準查找),公式的原料已經備齊,剩下就是步驟了。
操作步驟:
F1:G1錄入「查詢姓名」和「工號」,F2為錄入姓名單元格,G3的公式為=VLOOKUP(F2,IF({0,1},A:A,B:B),2,0)回車;
05總結
雖然IF函數和數組的用法可以實現VLOOKUP和HLOOKUP的逆向查找,但逆向查找用INDEX+MATCH組合不是也是很香的嘛。因為畢竟引用範圍的重排是比較性能的,非必要的情況下,不建議使用。
不過話有說回來,IF函數和數組的結合的玩法還是挺有意思的,也可以作為我們平常練習或開拓思路的一種方法,也未嘗不可。由於文章的篇幅,多維引用範圍的重組沒有說到,如果你想了解,可以留言或私信給我,當留言超過20個,我就會解鎖它們的玩法。
有人說學的深了難,夠用就行,可是在成人的世界裡,不難的事,又有幾個是值錢的。學習無非就是,你的一個想法,然後你去不斷判斷,驗證,總結成你的智慧的過程,只要你念念不忘,必有迴響。
好了,今天的文章就到這兒,希望你可以從中有所收穫,也希望你能把你們遇到的問題私信或在文後留言給我。如果你喜歡我的文章,就關注,轉發加點讚,你的每份支持,都是我創作的動力。花葉草木深,工作爭獎金,欲尋其中路,找我胖廖晨。