VLookup, Indirect 及 Match的函數組合
 
        Excel 的應用,網路上的教學其實已有很多,但其實很少是針對如何利用函數的組合來完成一個自動化的工作。
這裡,會先介紹如何利用 VLookup, Indirect 及 Match 來達到一個完整的專案,往後也會提到如何用 VBA 來達到更全面的應用。
 
        這裡,我們先來看看函數 VLookup,這是一個應用度非常高的函數 (VLookup 是垂直搜尋,而HLookuo 是水平搜尋), 早期的
VLookup,在功能上有一些限制,我們常需要用 VBA 去補足,但現在基本上已可達到多數應用的需求。現在用一個例子來看它的作用:
 
 
      假設有一個場景,工廠倉庫人員有一張發料單,也也一張退料單。顯然的,某些料號會同時出現在 發料單 跟 退料單 上,那如何讓
發料跟退料的資料同時出現在一張表格上呢?此時,VLookup 就可發揮它的功能。下面是 發料單 與 退料單 的實際例子。
 
                         
 

上圖中,左方是發料單,右方是退料單。我們可以看到,料號 A00001、 A00008 及 A0009 同時出現在兩張表格上。現在,我們用

VLookup 把它們合併成一張表。下面是完整步驟:

1. 找一欄,把所有料號貼上去。(這裡我們選擇 L 欄),如下圖

      

 

2. 首先要處理 "發料量" 的資訊,所以先把游標移動到 M2 位置。在 M2 插入函數,選擇 VLookup,螢幕會彈出下面視窗:

   

    在這裡,我們須輸入 4 個參數,解釋如下:

    Lookup_value:就是要找 L2 (料號 A0001) 的這個料號。

   Table_array:L2 (料號 A0001) 要在哪個範圍裏去找,這裡就是整個 F 欄跟 G 欄,所以範圍為 F:G。

                      當然我們也可把範圍設為:F 欄,但因為我們希望在 F 欄找到 L2 (A0001) 這個料號後,可以傳回 發料量 (G 欄) 的值,

                      所以範圍為設為 F:G。

    Column_index_num:在 Table_array 有提過,我們希望在 F 欄找到料號後,可以傳回 發料量 (G 欄) 的值。此時傳回 F 欄的

                      Column_index_num 是 1,而傳回 G 欄的 Column_index_num 是 2,所以我們輸入 2。因為範圍只有設定 F:G 兩欄,

                      所以不能輸入 3 以上的值。

    Range_lookup:這是一個布林值,只有 True 或 False 兩個選項,如果希望在 F 欄找L2 (A0001) 這個料號時,是完全相等於

                     A0001,那麼就輸入 False;如果只是要找最接近 A0001 的值,那麼就輸入 True。此時我們希望是找到完全符合

                     A0001,所以輸入 False。

 

   在 4 個參數都輸入完成後,按下 "確定" 按鈕完成函數輸入。接下來結果會變成:

   

    M2 的值變成 100,100 這個值是 A0001 在 F 欄中視出現在第 2 列,而我們的 Column_index_num 是 2,所以會回傳 F 欄的下一

    欄 (也就是 G 欄) 的值。這裡回傳的 100 就是 G2 的值。

 

3. 接下來,複製 M2 公式,直接往下拉到 M11。如果以函數公式來看,表格會變成:

   

    如果是以值來看,會如下表所示:

   

4. 接下來,把游標移動到 N2,重複步驟 1 至 3,把退料量的資訊也提出來,填入 N 欄中。如果以函數公式來看,表格會變成:

   

    如果是以值來看,則會是:

   

 

5. 我們看到上表中,如果沒有在搜尋範圍中找到對應料號,則會顯示 "#N/A" 這種錯誤。此時,我們可以在函數中插入 "IF" 及 "ISNA" 這

    兩個函數來處理 "#N/A" 這種錯誤。函數 ISNA 表示,當 ISNA 所括號裡出現的值為 "#N/A" 時,我們要如何處理。在做進一步處理時,

    最好對 IF 函數有一定程度了解,不然會不容易理解。下面是三個函數組合時的介紹。

    我們依然先把游標移動 M2,   目前的公式是:

    =VLOOKUP(L2,F:G,2,FALSE),

   我們在外圍在插入兩個函數,變成:

    =IF(ISNA(VLOOKUP(L2,F:G,2,FALSE)), 0, VLOOKUP(L2,F:G,2,FALSE))

    新的公式,我們把它放大成下圖來解釋。雙底線的 VLOOKUP(L2,F:G,2,FALSE) 就是原來的公式,它的結果會是一個值。

    它會變成是函數 ISNA 的輸入值。如果 VLOOKUP(L2,F:G,2,FALSE) 的值是 "#N/A",那麼 ISNA(VLOOKUP(L2,F:G,2,FALSE))

    的值就會是 TRUE (反之則為 FALSE)。

    下圖 "1"、"2"、"3" 表示函數 IF 的 3 個輸入函數。當 ISNA(VLOOKUP(L2,F:G,2,FALSE)) = TRUE (也就是 "#N/A") 時,函數 IF

    輸出的值是 0 ----- 也就是 "2" 的部分,ISNA(VLOOKUP(L2,F:G,2,FALSE)) = FALSE (也就是不為 "#N/A") 時,函數 IF 輸出的值

    就是原來的 VLOOKUP(L2,F:G,2,FALSE) ----- 也就是 "3" 的部分。

6. 接下來同樣把公式拉一拉,結果就變成:

   

  這樣在後續的處理上,就會相對容易得多。我們在下一次再繼續後面函數的介紹,以及最後會完成設麼樣的專案。