今天要來聊聊 FILTER,把表格裡符合條件的列挑出來,放到另一個地方。
它和選單裡的「篩選器」最大的不同是:原本的資料完全不動,原始資料有改,挑出來的結果也會跟著變。
手動篩有多麻煩
我手上還是那張手搖飲的訂單紀錄,一共 10 筆,分成信義和板橋兩間門市:
| A | B | C | |
|---|---|---|---|
| 1 | 品項 | 門市 | 杯數 |
| 2 | 蘋果紅茶 | 信義 | 12 |
| 3 | 烏龍奶茶 | 板橋 | 37 |
| 4 | 蘋果綠茶 | 信義 | 8 |
| 5 | 蘋果紅茶 | 板橋 | 21 |
| 6 | 烏龍奶茶 | 信義 | 5 |
| 7 | 青茶 | 板橋 | 29 |
| 8 | 蘋果綠茶 | 板橋 | 9 |
| 9 | 蘋果紅茶 | 信義 | 12 |
| 10 | 青茶 | 信義 | 17 |
| 11 | 烏龍奶茶 | 板橋 | 37 |
我想只看「板橋」的訂單。手動的話,要一列一列看 B 欄,是板橋的就複製到別的地方,資料每天新增的話,還得每天重做一次,有點太麻煩了吧!這時候就可以請 FILTER 出場。
FILTER
FILTER 會檢查範圍的每一列,只留下符合條件的列,結果放在別處,原本的資料維持原樣。
語法
- 範圍:要篩選的資料。
- 條件1:一欄(或一列)由
TRUE和FALSE組成的值,位置和「範圍」的每一列一一對應,TRUE的那一列會被留下來。 - 條件2, ...:選填,可以接著再加條件,每多一個,就多一個要同時滿足的限制。
官方說明有特別寫,每個條件的長度必須和範圍完全一樣。範圍框 A2:C11 是 10 列,條件也要是 10 列。長度對不上時, 會得到 #N/A(不是 #VALUE!),提示是「FILTER 的範圍大小不符。應該有 10 列 1 欄,實際卻指定了 9 列 1 欄。」。
另外 FILTER 一次只能篩列,或只篩欄,不能同時篩。
單一條件
我想找「門市是板橋」的訂單。條件要寫成一欄 TRUE 和 FALSE,也就是拿 B 欄的每一格去比對是不是「板橋」:B2:B11="板橋"。
如果要用 FILTER 寫,就是:
篩出門市是板橋的整列訂單
=FILTER(A2:C11, B2:B11="板橋")A2:C11:範圍,整張訂單,不含標題列。B2:B11="板橋":條件,B 欄是「板橋」的那幾列會是TRUE。
先手算一下,B 欄是板橋的有第 3、5、7、8、11 列,共 5 筆。在 E2 輸入公式,按下 Enter,結果會從 E2 往下、往右展開成 5 列 3 欄。來看看結果:
| 品項 | 門市 | 杯數 |
|---|---|---|
| 烏龍奶茶 | 板橋 | 37 |
| 蘋果紅茶 | 板橋 | 21 |
| 青茶 | 板橋 | 29 |
| 蘋果綠茶 | 板橋 | 9 |
| 烏龍奶茶 | 板橋 | 37 |
整列都帶過來,順序和原本的資料一樣。
只要其中一欄
範圍不一定要框整張表。我只想要信義門市賣過什麼品項,那範圍就只框 A 欄:
只取品項欄,條件看門市欄
=FILTER(A2:A11, B2:B11="信義")範圍和條件是各自指定的,只要列數一樣就可以。結果是 5 列 1 欄:蘋果紅茶、蘋果綠茶、烏龍奶茶、蘋果紅茶、青茶。
數字條件
條件也可以拿數字比較。我想看杯數大於 15 的訂單:
篩出杯數大於 15 的訂單
=FILTER(A2:C11, C2:C11>15)來看看結果:
| 品項 | 門市 | 杯數 |
|---|---|---|
| 烏龍奶茶 | 板橋 | 37 |
| 蘋果紅茶 | 板橋 | 21 |
| 青茶 | 板橋 | 29 |
| 青茶 | 信義 | 17 |
| 烏龍奶茶 | 板橋 | 37 |
兩個條件
同時滿足(AND)
我想看「板橋門市,而且杯數大於 15」。官方的寫法就是把第二個條件接在後面:
板橋門市且杯數大於 15
=FILTER(A2:C11, B2:B11="板橋", C2:C11>15)每個條件之間用逗號隔開,所有條件都是 TRUE 的列才會留下來。這個逗號寫法是 Sheets 才有的:Excel 的 FILTER 第三個參數是 if_empty,逗號接的條件會被當成「沒有資料時顯示的內容」,Excel 要用 * 把條件乘起來才是且,說明看 FILTER 進階陷阱。來看看結果:
| 品項 | 門市 | 杯數 |
|---|---|---|
| 烏龍奶茶 | 板橋 | 37 |
| 蘋果紅茶 | 板橋 | 21 |
| 青茶 | 板橋 | 29 |
| 烏龍奶茶 | 板橋 | 37 |
和上一個杯數大於 15 的結果比,少了信義的青茶 17 杯。
符合其中一個(OR)
「杯數少於 10 或大於 35」這種任一個成立就好的條件,逗號是做不到的。我常用的寫法是把兩個條件用 + 加起來:
杯數小於 10 或大於 35
=FILTER(A2:C11, (C2:C11<10) + (C2:C11>35))每個比較式會各自得到 TRUE 或 FALSE,加起來只要不是 0,那一列就會被留下來。兩個比較式要各自用括號包起來。來看看結果:
| 品項 | 門市 | 杯數 |
|---|---|---|
| 烏龍奶茶 | 板橋 | 37 |
| 蘋果綠茶 | 信義 | 8 |
| 烏龍奶茶 | 信義 | 5 |
| 蘋果綠茶 | 板橋 | 9 |
| 烏龍奶茶 | 板橋 | 37 |
更多條件怎麼組、條件放在儲存格裡讓別人切換,之後會在實戰那篇再講。
沒有符合的資料
如果我把條件改成 B2:B11="中和",訂單裡根本沒有中和門市:
篩一個不存在的門市
=FILTER(A2:C11, B2:B11="中和")結果會是 #N/A。官方說明也寫找不到符合條件的值時回傳 #N/A,我實測滑鼠移上去的提示是「系統計算 FILTER 時找不到相符項目。」。Excel 的 FILTER 在這種情況回的是 #CALC!,不是 #N/A。
自己看是沒關係,不過要給別人看的報表,一個 #N/A 容易讓人以為壞掉了。我會用 IFNA 包起來,它只處理 #N/A,公式其他地方出了別種錯誤不會被一起蓋掉:
沒有符合時顯示文字
=IFNA(FILTER(A2:C11, B2:B11="中和"), "沒有符合的訂單")這樣儲存格會顯示「沒有符合的訂單」。
注意結果會往旁邊展開
FILTER 的結果會自己往下、往右展開,所以公式下面和右邊要留空。如果展開的路上有別的資料擋住,公式會出現 #REF!。我習慣把 FILTER 放在獨立的工作表,或是一塊空的區域。這類展開的細節,之後會放在 FILTER 的進階陷阱那篇。
練習
信義門市、杯數至少 10 杯
用 A2:C11 的訂單,篩出門市是「信義」,而且杯數大於或等於 10 的整列訂單。要怎麼寫?
小測驗
FILTER 入門
FILTER 找不到任何符合條件的列時,會回傳什麼?
試著用用看吧!篩出來的結果還想排序的話,把 FILTER 放進 SORT 裡面就可以了,可以看 SORT 與 UNIQUE。
接著可以看 FILTER 實戰,做一張用下拉選單切換的報表,或是 FILTER 常見錯誤,整理 #N/A、#REF! 和部分比對。
我是喜特先生,Mr. Sheet,我們下個教學見!
這個步驟如果每週都要重做
- 現在
- 每天把新訂單依門市手動挑出來,再傳給各店負責人
- 自動化後
- 每天自動把各門市的新訂單整理好,寄給各店負責人
接下來可以
這篇在技能樹的 Lv.2「進階分析」,模組「篩選與整理資料」(第 1/2 篇)。
回到技能樹相關文章
查看所有文章留言討論
共 0 則留言
