活用IF函數重組所要查詢的範圍~
延續上一篇文章的介紹,在不增加輔助欄,也不異動查詢比對表結構的情況下,要讓VLOOKUP在垂直查詢後能夠自右向左擷取資料的方式,其實不只一種,但勢必要搭配其他函數與VLOOKUP組合運用方能成功。以下就來介紹一下如何利用IF函數結合VLOOKUP完成這類的查詢應用。
首先,就先回顧一下IF函數的語法:
=IF(logical_test, [value_if_true], [value_if_false])
意義上是:
=IF(條件判斷式, 判斷式成立時的值或算式, 判斷式不成立時的值或算式)
例如:
=IF(分數>=60,"及格","不及格")
條件判斷式的結果是一種邏輯值,不是True就是False,通常True是1、False是0,
因此,若寫成以下的IF函數:
因此,若寫成以下的IF函數:
=if(1,"及格","不及格")
所傳回的結果是 「及格」
若寫成以下的IF函數:
=IF(0, "及格","不及格")
所傳回的結果是 「不及格」,這應該都是可以理解的。
如果工作表的資料內容如下:
若將IF裡的算式改成儲存格範圍呢?例如:
若將IF裡的算式改成儲存格範圍呢?例如:
=IF(1, J3:J16,G3:G16)
那麼,應該傳回的是範圍 J3:J16囉!但其實不然,照這樣的公式輸入到儲存格裡,傳回的結果是「#VALUE」:
其實,這也沒錯,因為,在一個儲存格裡怎麼呈現一個傳回的範圍呢?可是,若是在這個傳回的範圍之外,再包上一層統計函數,諸如SUM函數,而改寫成:
=SUM(IF(1, J3:J16,G3:G16))
那不就意味著此公式將傳回J3:J16這個範圍的加總結果了嗎!的確,傳回的結果是「178」,再也不是了「#VALUE」!
因此,將IF裡的算式改成儲存格範圍,寫成:
=IF(1, H3:H16,G3:G16)
傳回的應該是範圍 H3:H16
那麼,寫成:
=IF(0, H3:H16,G3:G16)
傳回的應該是範圍 G3:G16
若再以陣列的角度來看,若是寫成:
=IF({1,0} , H3:H16,G3:G16)
即表示將傳回 H3:H16 與 G3:G16所組合的範圍:
意即左欄是「工號」、右欄是「組別」:
意即左欄是「工號」、右欄是「組別」:
若是寫成:
=IF({0,1} , H3:H16,G3:G16)
即傳回 G3:G16與H3:H16所組合的範圍:
意即左欄是「組別」、右欄是「工號」:
意即左欄是「組別」、右欄是「工號」:
如此,前者的寫法,給我們的意義就蠻大的,因為,這樣左欄「工號」、右欄「組別」的組合,不就可以做為使用VLOOKUP函數查詢功號,往右取得該工號的組別了嗎?
因此,根據上述的作法,使用=IF({1,0} , 範圍1,範圍2)的寫法,便可組合兩個同樣大小的單欄範圍,只要設定範圍1是具有唯一性資料的查詢欄位,譬如:故鄧是工號欄位,而範圍2便可以是任意想要擷取的資料欄位,例如:地區、組別、姓名、年資等等欄位。我們並不是讓VLOOKUP向左擷取資料,而是在不改變比對表的原始資料位置與結構的狀態下,透過IF函數,重新組合所要的查詢比對欄位與資料擷取欄位,那麼再運用VLOOKUP函數就沒什麼問題了!
以此範圍為例,透過適當的範圍名稱之命名:
工號=$H$3:$H$16
地區=$F$3:$F$16
年資=$J$3:$J$16
姓名=$I$3:$I$16
組別=$G$3:$G$16
儲存格B4到B7也分別輸入標題文字:年資、姓名、地區、組別
如此,再藉由INDIRECT來參照範圍,便可以在儲存格C4輸入公式:
=VLOOKUP($C$3,IF({1,0},工號,INDIRECT(B4)),2,FALSE)
最後利用拖曳填滿控點操作,要查詢的年資、姓名、地區、組別等公式就全部達成了!
如此,再藉由INDIRECT來參照範圍,便可以在儲存格C4輸入公式:
=VLOOKUP($C$3,IF({1,0},工號,INDIRECT(B4)),2,FALSE)
最後利用拖曳填滿控點操作,要查詢的年資、姓名、地區、組別等公式就全部達成了!