【前言】
數據透視表有不可承受之重!在EXCEL交流群裏,筆者(E圖表述)為大家解答關於數據處理類問題的時候,往往都會使用函式或者VBA。這時,筆者就會被大家「友善的提(抨)醒(擊)」——有沒有更簡單的方法?因為大家都習慣使用那種信手拈來的方法,例如數據透視表。
不容置疑,數據透視表是EXCEL中一個很重要的版塊,即便現下比較流行的POWERQUERY或者BI,其實也都是在數據透視表上的一個延伸。在合適的時候使用合適的方法,這永遠是我們處理任何問題時應該秉承的原則。
【正文】
您好,這是您的開胃菜:
需求如下:
將A1:B13單元格區域中數據,填寫到D1:I6單元格區域中。
這是一個模擬數據透視表的問題,將一維表轉為二維表,典型的「數透工作內容」,但是這A列的倉庫名稱寫的也太……太太……了。
(PS:這不是為了模擬而模擬的數據,現實工作中確實就有人把數據錄成這樣,這是和自己有多大仇,才能把EXCEL用成這樣啊!)
這樣的數據用數據透視表來做,基本無望了,即使是PQ的清洗數據也是無從下手。那麽大家要麽就收工將A列內容「清洗幹凈」,要麽就只能燒腦想函式或者VBA解決了。
【萬金油函式處理「臟數據」】
在E2單元格輸入函式:
{=IFERROR(INDEX($B$2:$B$13,SMALL(IF(ISERROR(FIND($D2,$A$2:$A$13)),9^9,ROW($1:$12)),COLUMN(A1))),"")}
點選E2單元格後,選擇索引標籤中的「公式求值」,可逐一驗證公式內各巢狀函式分別的結果。
函式解析:
STEP1:
使用ISERROR+FIND函式,判斷A列內容中是否包含了D2單元格的值。在公式求值對話方塊中,可得出這部份的結果,如下圖橫線部份。
在這裏要說明一下,ISERROR函式是判斷是否報錯的函式。如果FIND找到值的時候,ISERROR返回的是FALSE;如果FIND沒找到值,是#VALUE時,反而ISERROR返回TRUE。切記不要弄混!
STEP2:
使用IF函式判斷,如果返回值為TRUE,就返回9^9(9的9次冪,一個絕對大的數,目的是不會在後面的運算中用到);返回值為FALSE時,使用ROW函式返回對應的行號。依然用「公式求值」功能,可知結果如下圖底線部份。
STEP3:
再使用SMALL+COLUMN函式,在數列中「逐個」提取第N小的值吧。例如E2單元格,COLUMN函式參照的是A1(A1單元格的列號),返回值是1,那麽數列中第1小的值是1。如果函式變動位置,那麽列號就會變動,原因是COLUMN函式的相對參照。
STEP4:
使用INDEX函式,結合第三步引出的值,就可以提取B2:B13單元格區域的值了。
STEP5:
使用IFERROR函式將沒有引出內容的錯誤值,容錯為「空值」。
STEP6:
最關鍵的一步,使用CTRL+SHIFT+ENTER組合鍵,將函式轉為陣列函式,及此,整個處理過程完畢。
【標準數據用數據透視表】
上面是一個工作上的例項,雖然筆者給出了解決的辦法,但是真心不希望大家的工作表也是這樣的「臟數據」。
如果是下面的數據,你會如何做呢?
加一列輔助列,同學們就可以使用數據透視表來做了,如下:
STEP1:
在C列做輔助列「入庫批次」
在C2單元格輸入函式=COUNTIF($A$2:A2,A2),下拉至C13單元格填充。
STEP2:
選中A1:C13單元格區域,再在工具列中點選插入——數據透視表。
在彈出的「建立數據透視表」視窗中,「表/區域」的文字域中已經自動添加上了(因為大家此前選中了該單元格區域)。然後,選擇「現有工作表」,位置為F1單元格。最後,點選「確定」按鈕。
STEP3:
在布局視窗中,按下圖拖拽標簽。
及此,大家就得到了一個入庫批次及庫存位置的統計表了,而且還有合計數。
看完教程,還有疑問的夥伴,歡迎群裏交流喲~
寵 粉 福 利
2元領取:全套Excel技巧視訊+200套樣版
點"閱讀原文",學習更多的Excel視訊教程