foldout

An Excel dashboard without pivot tables: SUMIFS, a summary sheet, and bars

A pivot table is a snapshot: add rows to the data and someone has to click Refresh. A dashboard built from SUMIFS never needs refreshing, can be driven by a cell — pick a month, pick a person — and survives the trip to Google Sheets and Numbers. Here is the layout we use for every Pro workbook's dashboard sheet.

Three sheets, one direction

Log — one row per thing that happened: a transaction, a task, a stock movement. Only inputs and the simplest per-row formulas. Setup — the lists: categories, people, the year, the as-of date. Dashboard — nothing but formulas that read the other two.

Data flows one way: Setup → Log → Dashboard. Nothing on the dashboard is typed, so it can’t drift from the log; nothing on the log refers to the dashboard, so you can sort, filter and insert rows without breaking a thing.

The one formula

a dashboard cell
=SUMIFS(Log!$E$6:$E$405,            what to add up
      Log!$C$6:$C$405, $A5,          this row's category (from Setup, so spelling can't differ)
      Log!$A$6:$A$405, ">="&$B$2,    from the date in B2
      Log!$A$6:$A$405, "<="&$B$3)    to the date in B3

That’s most of a dashboard. Categories down column A, one SUMIFS per row; a COUNTIFS beside it for how many; a share = row ÷ total. Bound the ranges ($6:$405) rather than whole columns — Google Sheets stays fast and the formula says where it ends.

Driven by a cell, not a dropdown on a pivot

The pivot’s filter is a cell here. Put the year in B2, the month in B3, or a person picked from a dropdown in B4, and every SUMIFS reads it:

two dates from a month cell
B3:  first of the month, typed or =DATE(B2, B4, 1)
B5:  =EOMONTH(B3, 0)                          last day of that month
… criteria:  dates, ">="&$B$3, dates, "<="&$B$5

or a person:
B6:  dropdown from Setup!people
… criteria:  owners, $B$6

Change the cell and the whole sheet recalculates — no Refresh, no “PivotTable field list”. Our inventory dashboard is filtered by category this way; the project dashboard by owner.

The grid: category × status

A pivot’s row-and-column layout is a COUNTIFS with mixed references:

fill once, copy to the whole grid
       B          C          D
4      Overdue    Today      Soon            ← headers are the status words
5  Work   =COUNTIFS(Tasks!$C$8:$C$157, $A5, Tasks!$G$8:$G$157, B$4)
6  Home   (copied down and across)

$A5 pins the column (the category), B$4 pins the row (the status). One formula, the whole grid. The same shape gives person × month, product × quarter, anything × anything.

Top, bottom, and “which one”

The questions a pivot answers by sorting are one lookup each:

the best and worst row of a summary table
Highest value:     =MAX(C5:C16)
Which category:    =INDEX(A5:A16, MATCH(MAX(C5:C16), C5:C16, 0))
Lowest non-zero:   =SUMPRODUCT(MIN(C5:C16 + (C5:C16=0)*1E9))       skip zeros
Second highest:    =LARGE(C5:C16, 2)
Rank of a row:     =COUNTIF($C$5:$C$16, ">"&C5) + 1

Ties go to the first match with INDEX/MATCH; if that matters, add the row number as a tiebreaker in a helper column.

Distinct counts

“How many customers this month” — the one thing a pivot does that SUMIFS can’t directly. Two portable ways:

distinct values
=SUMPRODUCT((dates>=$B$3)*(dates<=$B$5) / COUNTIFS(customers, customers&"", dates, dates&""))
 each row contributes 1 ÷ (rows sharing its customer and date) — slow past a few thousand rows

or a helper column on the log:
F6: =IF(COUNTIFS($C$6:C6, C6, $A$6:A6, ">="&$B$3)=1, 1, 0)      1 on a customer's first row in range
then =SUM(F6:F405)

The helper column is faster and shows its work. Our workout log counts sessions (distinct dates) the first way because the log is short; a sales dashboard should use the second.

Bars before charts

A data bar on the value column turns the table into a chart without a chart object: Home → Conditional Formatting → Data Bars (Excel) or a colour scale / custom formula in Sheets. Set the minimum to 0 always, and a fixed maximum when the column is a percentage (1) or when two tables must be comparable. For anything else, MAX of the column is fine.

Add one real chart only when the shape matters — a trend over twelve months, income against expenses — and point it at a fixed summary range, never at the log. (There’s a separate guide on charts that update themselves.)

Status tiles

The numbers people read first — total, open, overdue, this month — belong at the top in big type, each one cell:

tiles are just cells with a large font
Open        =COUNTIF(status, "Open")
Overdue     =COUNTIF(status, "Overdue")                        red when >0 via conditional format
This month  =SUMIFS(amount, dates, ">="&$B$3, dates, "<="&$B$5)
Progress    =IF(total=0, 0, done/total)                        with a data bar, max fixed at 1

Guard every division with IF(denominator=0, 0, …); an empty log should show zeros, not #DIV/0! in the tile the boss reads.

Empty rows, zero not blank

Every formula on the dashboard must return a number, even when there’s no data: 0, hidden by the number format 0;-0;;@. A "" looks tidier and breaks the next SUM or AVERAGE that reads the cell. This is the rule every workbook we ship follows, and it’s the reason the dashboards recalculate in LibreOffice and a second engine without a single error cell.

What you give up, and don’t

No drag-and-drop regrouping — the dashboard answers the questions you designed it for. In exchange: it updates the moment a row is typed, it can be filtered by any cell, it’s readable (every number is a formula you can click), it opens identically in Excel 2016, Google Sheets, Numbers and LibreOffice, and the Formulas sheet can explain it in a page.

Tell us what happened

Goes straight to a person. No account, no ticket number.

What is this about?

We keep the message and the page it came from. Nothing else — not your IP, not your browser. Privacy.