2013-02-24

Excel系列:Lookup函數(上)

近筆者因工作關係,開始主持修建一座規模宏大的Excel數據庫,期間筆者積累了一些心得。接下來的幾篇,筆者將把這些心得寫下來,既可與讀者朋友們分享,亦可供自己日後參考。

說到數據庫,磚家們當然首先想到那些專門的數據庫軟件,如SQL等。筆者原先的設想是用Access的,可是,一來自己技巧不熟練,二來,其他同事(包括老闆)日後查閱時,恐怕亦會無從入手。最終,筆者還是回到熟悉的Excel上。

Excel的功能無疑也是非常強大的,其中最多姿多采的就是宏(又名:巨集/Macro/VBA)。這個東西真是讓人又愛又恨--當你打開一個Excel檔,它卻提醒你“文件可能有病毒”時,你當然有所退縮。筆者當然知道文件無毒,可是其他同事會怎麼想呢?!?所以,筆者修建這座數據庫時,第一條原則就是,盡量不要用宏。(當然,要建立1000多條超連結時,我還是會用宏的。等所有超連結建好後,再另存為一個普通的Excel檔。)

盡量不要用宏,意味着要充分利用函數。今天,我們先來介紹一個實用的函數:Lookup()。

(註:以下所舉例子同上述數據庫完全無關,請讀者們不要胡亂揣測。) 
(聲明:以下例子只為了突顯Lookup()函數的功能,其中的算法不一定是最簡潔的。)


首先來看一張表。下表是澳門特別行政區的職業稅稅率,摘自第2/78/M號法律,第七條:


無論你過往學的是C++,抑或是VB、Java,一定都遇過這樣的經典題目:給你一張階梯累進型的稅率表,讓你寫一個程序,輸入可課稅金額,輸出應繳的稅款。Excel裡面自帶VBA功能,當然可以編一個程序來計算。可是我們說好了,盡量不要用宏,所以我們來看,如何用函數來算這個問題。

有人一看見此題目,立即就會想到If()函數。If()函數確實可以算的,可是公式一定“水蛇春咁長”:
=if(A1<95000,0,if(A1<115000,(A1-95000)*7%,if(A1<135000,20000*7%+(A1-115000)*8%,if(............
這次我來用Lookup()函數。這個方法有一點不好,它一定要先寫一張表,而不能用一個儲存格解決問題。

根據上述的稅率表,我們在Excel中製作如下的表格。設想是在A10格輸入某君一年的總收入,然後在D10格輸出他應繳的職業稅。


其中:
  • A欄是寫給自己看的,為了不讓自己在後面寫公式時混淆。可以像筆者那樣,用數學區間的形式寫出來,也可用文字表達,如“九萬五以下”、“九萬五至十一萬五”......總之要方便自己、一目了然;
  • B欄是寫給電腦看的,所以看不懂也是正常的。簡單而言就是每一“階梯”的分界點,後面說Lookup()函數時會進一步介紹;
  • C欄是根據前面的稅率表抄下來的,收入0~95k為0%,95k~115k為7%......
  • D欄是各種情況下應繳的稅款,這是通過公式計算的。例如D2格,年收入0至95k,稅款為年收入(A10格)乘0%;D3格,收入95k至115k,首95k免稅,多出部份(A10-B3)乘7%;D4格,首95k免稅,之後95k~115k的兩萬元要乘7%,多出部份(A10-B4)乘8%;如此類推......
  • E欄其實就是D欄的計算公式,寫出來供讀者查閱。
以上都還是準備功夫,Lookup()函數尚未粉墨登場。現在,我們在A10格內隨便填個數字,譬如255000,這樣D欄會出現一系列數字,每個都不一樣,其中只有一個是正確的(就是某君應繳的職業稅金額)。我們要用Lookup()函數,找出正確的那個數值。

Lookup,顧名思義就是“查找”之意。Lookup()函數就是從一張表中,找出你需要那條記錄,並輸出你想知道訊息。例如在上表中,我們寫了一張稅款計算表,要根據某君的全年收入,從計算表中查出他應繳的款項。Lookup()函數的語法如下:
LOOKUP(lookup_value,lookup_vector,result_vector)
其中有3個參數:(1) Lookup_value、(2) Lookup_vector以及(3) Result_vector。用文字來表述,就是在(2) Lookup_vector這個範圍裡面,找出最接近、而且小於等於(1) Lookup_value的那個值,並把(3) Result_vector範圍中,對應位置的值輸出。

還是回到職業稅那個例子中。 先在D10格填寫如下公式:
=LOOKUP(A10,B2:B8,D2:D8)
讀者還記得,B欄(B2至B8這幾格)是寫給電腦看的,電腦現在就要看了。我們已經在A10格裡寫了255000這個值,那是某君全年的收入。我們讓電腦在B2至B8的範圍內,查找最接近並小於等於255000的數值(本例中就是B7格),再輸出D2至D8範圍內相應位置(即D7格)的值,即14600,這就是某君應繳的職業稅。如下圖:


如果A10裡面輸入120000,在B欄中找到的便是115000(B4格),輸出的值就是D4格的值1800,如下圖:


關於Lookup()函數的其他例子、以及它的局限性、以及它的兩位近親:VLookup()函數和HLookup()函數,這些內容將在《下篇》裡介紹。下一節,我們先去看看其他內容啦!

<本節完>

沒有留言:

張貼留言