儀表板做好了,切一下下拉選單,圖表卻變成只剩標題、沒有資料;或是同一個地區冒出好幾根長條,得自己心算加起來。這些怪現象多半不是圖表設定的問題,是圖表接到的資料長得不對。
怎麼插入圖表、挑哪一種類型,圖表完全指南 已經講過,這邊不重複,直接從儀表板會踩的坑開始。我自己做儀表板,第一個檢查的就是「圖表到底框了哪一塊」。
後面的例子都用這張茶飲訂單,放在 A1:D11,金額單位是千元:
| 日期 | 地區 | 品項 | 金額 |
|---|---|---|---|
| 2026/07/04 | 北區 | 蘋果紅茶 | 37 |
| 2026/07/18 | 南區 | 青茶 | 52 |
| 2026/07/25 | 北區 | 鮮奶茶 | 28 |
| 2026/08/06 | 中區 | 蘋果紅茶 | 44 |
| 2026/08/13 | 北區 | 青茶 | 19 |
| 2026/08/22 | 南區 | 蘋果紅茶 | 63 |
| 2026/09/02 | 中區 | 鮮奶茶 | 31 |
| 2026/09/09 | 北區 | 蘋果紅茶 | 58 |
| 2026/09/15 | 南區 | 鮮奶茶 | 22 |
| 2026/09/27 | 中區 | 青茶 | 47 |
為了方便重現,明細和彙總表都放在同一個工作表,彙總表在 F 欄以後。實際做儀表板時,建議把明細、彙總、儀表板拆成三個分頁,拆法在 三層架構 講過。
先決定版面,再決定資料
動手接圖表以前,我會先在紙上畫一張版面:哪裡放 KPI、哪裡放趨勢、哪裡放明細。下面這張就是我最常用的排法。
圖:讀的人從 KPI 開始,往下依序看到趨勢、排名,要查單筆才會看到最底下的明細。
篩選列只放控制項(下拉選單),KPI 只放一個數字加一個變化,趨勢和排名各一張圖,明細表放最底下。我個人會把整頁控制在 4 到 6 個區塊,再多就是在逼讀的人找重點,這樣拆成第二個分頁比較好。
版面定了,每個區塊要的資料也就定了:KPI 要 1 個數字,趨勢要每月 1 列,排名要每個地區 1 列。這些全都不是明細本身,要先彙總。
圖表不要直接接明細
把 A1:D11 整塊丟給圖表,每一列明細會變成一根長條。北區在 7 月有 2 筆、8 月 1 筆、9 月 1 筆,圖上就是 4 根北區的長條。
直接接明細:同一地區分成多根長條
先彙總:北區 142、南區 137、中區 122
圖:同樣的資料,左邊要自己把北區加起來,右邊的長條高度就是答案。
手算北區是 37 + 28 + 19 + 58 = 142。用 QUERY 做成地區彙總,放在 F1:
依地區加總金額,由大到小排序
=QUERY(
A1:D,
"select B, sum(D)" &
" group by B" &
" order by sum(D) desc" &
" label B '地區', sum(D) '金額'"
)來看看結果:
| 地區 | 金額 |
|---|---|
| 北區 | 142 |
| 南區 | 137 |
| 中區 | 122 |
範圍寫 A1:D 而不是 A1:D11,之後明細新增幾列都會自動算進來。圖表只框 F1:G4 這塊,每個地區一根。QUERY 的語法在 QUERY 完整指南 有講,這邊只用到 group by、order by 和 label。
趨勢圖要每月一列,放在 I1:
依年月加總金額,YYYYMM 鍵區分跨年同月;where 排除空列
=QUERY(
A1:D,
"select year(A)*100+month(A)+1, sum(D)" &
" where A is not null" &
" group by year(A)*100+month(A)+1" &
" order by year(A)*100+month(A)+1 label year(A)*100+month(A)+1 '年月', sum(D) '金額'"
)| 年月(YYYYMM) | 金額 |
|---|---|
| 202607 | 117 |
| 202608 | 126 |
| 202609 | 158 |
公式裡的 where A is not null 不能省。開放範圍 A1:D 會把明細下方的空白列也一起交給 QUERY,group by 會多分出一個空白群組,結果變成標題、空白、202607、202608、202609,下面 KPI 卡抓「最後一列」的公式也會跟著抓錯。把空列擋掉,結果才會是上表的 202607、202608、202609 三列。
month() 從 0 起算,所以加 1;再把年份乘 100,組成 YYYYMM 數字鍵,例如 2026 年 10 月是 202610。只按月份號分組會把不同年度的同月合併;這裡按年月分組並排序。2026/12、2027/1、2027/12 分別保留為 202612、202701、202712。建圖時請將年月欄設為分類標籤,金額設為資料系列。
下拉選單切換,要先想沒有資料的狀況
下拉選單連動圖表的做法,圖表完全指南 的動畫已經示範過。這邊補的是兩個容易漏掉的地方:「全部」要怎麼處理,以及選到沒有資料的值會怎樣。
F7 放下拉選單(選項:全部、北區、南區、中區),F9 放品項彙總:
依 F7 的地區加總各品項金額,選「全部」就不加條件
=QUERY(
A1:D,
"select C, sum(D) " &
IF(F7="全部", "", "where B='"&F7&"' ") &
"group by C order by sum(D) desc label sum(D) '金額'"
)F7 選「北區」,手算是蘋果紅茶 37 + 58 = 95、鮮奶茶 28、青茶 19:
| 品項 | 金額 |
|---|---|
| 蘋果紅茶 | 95 |
| 鮮奶茶 | 28 |
| 青茶 | 19 |
切到「南區」,順序會變成蘋果紅茶 63、青茶 52、鮮奶茶 22;「全部」則是蘋果紅茶 202、青茶 118、鮮奶茶 81。我故意讓每個選項的排序都不同,這樣圖表有真的跟著動,一眼就看得出來。
字串裡的單引號要成對:where B=' 之後接 F7,再補上結尾的 '。條件值是文字,一定要用單引號包住,漏掉整條公式會直接報錯。
如果 F7 的值在明細裡找不到,例如手打成「東區」,QUERY 沒有任何符合的列,這時它不會報 #N/A,而是只回傳一列標題(品項、金額),圖表就變成只有標題、沒有資料。所以 IFERROR(QUERY(...), ...) 這種備援不會觸發,因為根本沒有錯誤。要改成判斷結果有幾列,只有標題列就給占位:
結果只有標題列(ROWS 為 1)時,回傳一列「無資料」和 0
=LET(
q, QUERY(
A1:D,
"select C, sum(D) where B='" &
F7 &
"' group by C order by sum(D) desc label sum(D) '金額'"
),
IF(ROWS(q)=1, {"無資料", 0}, q)
)這樣沒資料時 F9:G9 是「無資料、0」,有資料時照常顯示 QUERY 的結果。這個寫法比 IFERROR 精準,公式寫錯時錯誤仍然看得到,不會被吞掉。不過我比較常從源頭擋:F7 用「資料驗證」做成下拉選單,選項取自一份固定清單,根本打不出「東區」。作法在 資料驗證與資料品質 有說。
圖表範圍框到回傳空字串的列
另一個常見的疑問:圖表範圍框到 10 列,資料其實只有 3 列,會不會多出空白類別?
重現方式:H2:H4 打三個地區,I2:I10 全部填上這條公式,往下拉滿 9 列:
H 欄有值才加總,沒有就回傳空字串
=IF(H2="","",SUMIFS($D$2:$D,$B$2:$B,H2))H5:H10 是空的,所以 I5:I10 都回傳 ""。看起來是空格,可是 得到 9,只有 是 3。我把圖表範圍框到 H1:I10 實測,圖表只畫出 3 根長條,沒有出現空白類別。
不過這種每列各放一條公式、靠 "" 撐出來的表,範圍和公式要對得很準,我還是偏好讓資料來源就是 QUERY 的輸出,它只溢出真正有資料的列。
我自己的習慣是:圖表一律接 QUERY 的輸出,不接那種每列各放一條公式的表。
日期是文字,趨勢圖就不會照時間排
從別的系統匯出的日期,常常看起來是 2026/07/04,其實是文字。判斷方式用 ISNUMBER:真正的日期是 TRUE,文字日期是 FALSE。
假設 A2 是文字 2026/07/04, 得到 FALSE。拿它當條件的 SUMIFS 也會算成 0:
得到 0,不會有錯誤。這跟 SUMIFS 進階陷阱 講的是同一件事。
放到圖表上又是另一種現象:X 軸是真正的日期,而且橫軸的「將標籤視為文字」沒有勾,折線圖才會變成時間軸,7/4、7/18、7/25 之間的距離才照實際天數縮放;文字日期只是一個個標籤,每個點等距,順序就是列的順序。細節見 五組資料,五種圖。
文字日期:三個點等距

真正日期:間距反映 14 天與 7 天

圖:左邊是文字日期,點等距;右邊是真日期,間隔跟著天數走。
修法是旁邊加一欄輔助欄 , 就會得到 TRUE,之後拿輔助欄當 X 軸和條件。只改儲存格的數字格式不會讓文字變成日期,細節在 日期與時間基礎。
堆疊圖,容易看錯的是中間那一層
三個地區在 7 到 9 月的金額,整理成這張表(空白的 7 月中區代表沒有訂單,以 0 計):
| 月 | 北區 | 南區 | 中區 |
|---|---|---|---|
| 7 月 | 65 | 52 | 0 |
| 8 月 | 19 | 63 | 44 |
| 9 月 | 58 | 22 | 78 |
北區 9 月的 58 可以這樣算出來:
北區 9 月的金額,結束日用小於下個月 1 號
=SUMIFS(
D2:D,
B2:B, "北區",
A2:A, ">="&DATE(2026, 9, 1),
A2:A, "<"&DATE(2026, 10, 1)
)得到 58。把這張表畫成堆疊柱狀圖,總量看得很清楚:117、126、158 一路上升。但如果有人想問「南區這三個月怎麼走」,就很難回答了。
堆疊直條:南區每月的起點不同,要比較厚度
折線:南區 52 → 63 → 22 的變化直接可見
圖:同一份資料,左邊要比較「厚度」,右邊比較「高度」。
堆疊圖只有最底下那一層共用同一條基準線,其他層都浮在別人上面。南區 52、63、22 這三段,底邊分別在 65、19、58,眼睛得自己扣掉底邊才能比。我的做法是:想看總量加組成,用堆疊,層數不超過 3 層,順序固定;想比各區的走勢,就改成每區一條折線。
配色上,我把北區用 #5B7A52、第二個系列南區用 #6B839E、第三個用暖灰;#A69272 只留給警示,像是「低於目標的那一格」,不拿來當一般系列的顏色。
KPI 卡要跟著新資料走
KPI 卡最常見的毛病是參照寫死。本月金額寫成 =J4,10 月資料進來後,它還是指著 9 月。
先清除前面空字串示範的 H1:I10,再把年月彙總公式放回 I1。彙總表在 I1:J4(年月、金額),本節本月/上月指有資料的最後兩個月份;缺月不會補零,尚未結束月份的部分金額也不能當作完整月來比較。
本月金額:取彙總表最後一列
=INDEX(J2:J, COUNTA(J2:J))得到 158。上月:
上月金額:取彙總表倒數第二列
=INDEX(J2:J, COUNTA(J2:J)-1)得到 126。接著把變化組成一行文字,本月放 L1、上月放 L2:
組合箭頭、金額差與百分比變化
=IF(L1>=L2,"▲ ","▼ ")&ABS(L1-L2)&" ("&TEXT((L1-L2)/L2,"+0.0%;-0.0%")&")"得到 ▲ 32 (+25.4%),算式是 (158 - 126) / 126 = 0.2540。如果明細新增一筆 10 月的資料(北區青茶 20),QUERY 多出一列「202610、20」,本月會自己變成 20,上月變成 158,公式不用動。
圖:把前面的彙總表接上圖表和 KPI 之後的儀表板分頁。
動手練習
找出錯在哪
同事做了下拉選單連動圖表,F7 選「北區」之後,F9 一直沒有資料,她寫的公式是:
請說明原因,並改成能正常運作的公式。
想把圖表連動、篩選器和資料透視表一起做成一份互動報表,可以接著看 互動式報表設計。
先把自己儀表板上的圖表範圍點開來看看吧!我是喜特先生,Mr. Sheet,我們下個教學見!
接下來可以
這篇在技能樹的 Lv.4「進階應用」,模組「用圖表說清楚你的數據」(第 1/1 篇)。
回到技能樹相關文章
查看所有文章留言討論
共 0 則留言

