月底了,台北和台中兩間分店各丟給我一份訂單表,我要做一張「每種茶賣了多少錢」的報表。兩份表欄位一樣,可是有一個品項在其中一份後面多了一格空白,查單價的時候就查不到。
這種事每個月都會來一次,所以我想把「從原始資料到報表」拆成固定的幾步,每一步知道用什麼、出錯時從哪裡回頭。這篇是步驟的地圖,語法不重講,每一步都連到專門的文章。
圖:六步由上往下走,第 5 步檢查到錯就回第 3 步,最後才做彙總。
先把原始資料放著不動
第 1 步其實不用做什麼,重點是不要碰它。各分店的訂單表原樣留著,後面所有步驟都另開分頁用公式處理,原始資料壞不了,公式寫錯了也能重來。這個分層的想法在 三層架構入門 講過。
另外,每份表最好是「一列一筆、一欄一屬性」,不然後面整合會卡住,見 一列一筆、一欄一屬性。
一份小資料走一遍
用最小的資料把六步走一次。台北在 A:B 欄,台中在 D:E 欄,價目表在 G:H 欄。台北那份的「青茶」後面多了一格空白,肉眼看不出來。先是台北的訂單(A1:B4):
| 品項 | 杯數 |
|---|---|
| 蘋果紅茶 | 7 |
| 青茶(尾端有空格) | 12 |
| 烏龍 | 3 |
台中的訂單(D1:E3):
| 品項 | 杯數 |
|---|---|
| 蘋果紅茶 | 5 |
| 青茶 | 9 |
價目表(G1:H4):
| 品項 | 單價 |
|---|---|
| 蘋果紅茶 | 45 |
| 青茶 | 38 |
| 烏龍 | 42 |
整合
先把兩份疊成一張。在 J1 寫:
把台北與台中疊成一張,標題列只留台北那一份
=VSTACK(A1:B4, D2:E3)結果會溢出到 J1:K6,一共 5 筆資料加 1 列標題。分頁在不同工作表的話,把範圍換成 台北訂單!A1:B4 這種寫法就行。語法見 VSTACK、HSTACK、CHOOSEROWS、CHOOSECOLS;來源在別的檔案,就改用 IMPORTRANGE,見 IMPORTRANGE 跨試算表同步。
清理
把合併後的品項整欄去掉多餘空格。M1 寫:
整欄去除多餘空格
=ARRAYFORMULA(TRIM(J1:J6))M2:M6 會是「蘋果紅茶」「青茶」「烏龍」「蘋果紅茶」「青茶」,青茶後面的空格不見了。TRIM 只清得掉半形空格,全形空格要另外處理,這部分見 文字清理函式。
補欄位
在 N2 查單價,O2 算小計:
用清理後的品項查單價
=ARRAYFORMULA(XLOOKUP(M2:M6, $G$2:$G$4, $H$2:$H$4))杯數乘單價
=ARRAYFORMULA(K2:K6*N2:N6)來看看結果:
| 品項 | 杯數 | 單價 | 小計 |
|---|---|---|---|
| 蘋果紅茶 | 7 | 45 | 315 |
| 青茶 | 12 | 38 | 456 |
| 烏龍 | 3 | 42 | 126 |
| 蘋果紅茶 | 5 | 45 | 225 |
| 青茶 | 9 | 38 | 342 |
XLOOKUP 的寫法見 XLOOKUP 入門。
檢查
我在 Q1 放一格最簡單的檢查,數有幾列沒有查到單價:
總列數減去查到單價的列數,0 代表全部查到
=ROWS(M2:M6)-COUNT(N2:N6)結果是 0。COUNT 只數數字,查不到的 #N/A 不會被算進去,所以不是 0 就代表有幾列有問題。反過來,0 只代表單價都查到了,重複列、杯數是文字之類的問題它抓不到,還是要看過資料。
彙總
最後才算報表要的數字。青茶賣了多少:
青茶的小計加總
=SUMIF(M2:M6, "青茶", O2:O6)結果是 798(456 加 342)。如果要的是整張分組報表,換成 QUERY 或 資料透視表。
為什麼清理要排在補欄位前面
假設反過來,先拿合併後的 J 欄去查單價:
沒有清理就直接查單價
=ARRAYFORMULA(XLOOKUP(J2:J6, $G$2:$G$4, $H$2:$H$4))圖:同一個「青茶」,沒清理就查單價得到 #N/A,清理後才查到 38。
結果是 45、#N/A、42、45、38。「青茶 」跟價目表的「青茶」少一格空白,對 XLOOKUP 來說就是不同的字。這時候檢查那一格會變成 1,我就知道要回頭看清理。
這就是流程裡那條回頭箭頭的意思。檢查這一步用來判斷「哪一步出問題」,所以我把它放在彙總前面,彙總的數字有錯時,先看檢查格。
資料每天都會進來的時候
上面用的是固定範圍,台北新增一筆就不會跟著進來。想讓新資料自動跟上,要把範圍改成 A2:B 這種開放式範圍,寫法見 ARRAYFORMULA 入門。
但開放式範圍用 VSTACK 疊起來,台北那一份的空白列會一起被帶進來,夾在兩間分店中間。我的做法是再用 FILTER 把整列空白的濾掉:
疊起來之後濾掉空白列
=FILTER(VSTACK(A2:B, D2:E), VSTACK(A2:A, D2:D)<>"")以上面的資料來說,結果還是同樣 5 筆資料(這個寫法不含標題列)。FILTER 的條件怎麼寫,見 FILTER 入門。
哪一步遇到什麼,看哪一篇
| 遇到的狀況 | 看哪一篇 |
|---|---|
| 來源在別的試算表檔案 | IMPORTRANGE 跨試算表同步 |
| 空格、大小寫、看不見的字元 | 文字清理函式 |
| 電話、編號這類要用規則抽出來 | 正規表示式抽取文字 |
| 髒資料太雜,公式寫不動 | 讓 AI 幫你清理資料 |
| 想在輸入的時候就擋掉錯誤 | 資料驗證完全指南 |
| 最後要排序、去重複 | SORT 與 UNIQUE |
什麼時候不用走這麼多步
如果只是這個月要一次性的數字,資料也只有幾十列,直接複製貼上再手動改,比建六步公式快。我會花時間建這套流程的條件很單純:同樣的事會重複做,而且每次來源的長相差不多。
另外,每一步多一組公式欄,欄位會變多,檔案也會比較難讀。換來的是出錯時能一步一步往回查,我覺得值得,但資料量大到變慢的時候,要回頭看 試算表為什麼越來越慢 的排查順序。
下個月兩份新的訂單表來了,貼進原始資料,報表自己會更新,我只要看一眼檢查格是不是 0。我是喜特先生,Mr. Sheet,我們下個教學見!
接下來可以
這篇在技能樹的 Lv.4「進階應用」,模組「進階資料處理」(第 1/1 篇)。讀完這篇,路線上的下一個模組是「用圖表說清楚你的數據」。
回到技能樹相關文章
查看所有文章VSTACK、HSTACK、CHOOSEROWS、CHOOSECOLS:疊表格與挑欄列
把兩張表上下疊起來的 VSTACK、左右併起來的 HSTACK,以及只留下指定列或欄的 CHOOSEROWS、CHOOSECOLS。附語法、負數索引與欄數不一致時的結果,最後用兩間分店的銷量表串起四個函式。
文字清理函式參考:TRIM、CLEAN、SUBSTITUTE、PROPER 與看不見的空格
整理 TRIM、CLEAN、SUBSTITUTE、REPLACE、UPPER、LOWER、PROPER 的語法與限制,包含 TRIM 清不掉全形空格與 CHAR(160)、CLEAN 只清 ASCII 0 到 31、SUBSTITUTE 第 4 參數只換第 N 次,以及用 UNICODE 找出看不見的字元。
XLOOKUP 入門:用品名查價格,也對照 VLOOKUP
XLOOKUP 的三個必填參數、找不到時自訂顯示的內容,以及可以往左查的寫法,最後和 VLOOKUP 的寫法逐項對照。
留言討論
共 0 則留言
