Dynamic Charts in Excel: Build Charts That Update Themselves
Make Excel charts that auto-update as data grows. The modern way uses Tables and dynamic arrays — no OFFSET, no named-range gymnastics.
Dynamic Charts in Excel: Build Charts That Update Themselves
Most Excel charts are frozen the moment you create them. You select a range, insert a chart, and from then on the chart shows exactly those rows — no more, no less. Add a new month of data below and the chart ignores it. Filter your source and the chart still plots everything. This is the single most common complaint about Excel charts, and for two decades the standard fix was a tangle of OFFSET formulas and named ranges that most people copied without understanding and never got working.
That era is over. If you’re on a current version of Excel, you make charts update themselves with two features that were built for exactly this: Excel Tables and dynamic arrays. Both are simpler than the old approach, neither requires a single OFFSET, and both are the methods Microsoft actually intends you to use. This guide leads with those. The legacy OFFSET method is here too, clearly labelled, for anyone stuck on Excel 2019 or earlier — but if you have a choice, you shouldn’t be using it.
What “dynamic” actually means
A dynamic chart is one whose plotted data changes without you touching the chart. There are two distinct things people mean by this, and it’s worth separating them because they call for different tools:
Auto-expanding. The chart grows to include new rows as you add them. You type March’s sales below February’s and the chart picks it up automatically. This is what Tables give you for free.
Auto-filtering. The chart shows only a subset — the top 10, the selected region, the current quarter — and that subset changes based on a formula or a control. This is what dynamic arrays give you, and where the real power lives.
You often want both. The good news is the modern tools handle both cleanly, and they combine.
Method 1: Excel Tables (the everyday answer)
If all you need is a chart that grows with your data, you don’t need formulas at all. You need an Excel Table.
Select your data and press Ctrl+T, or go to Insert > Table. Confirm your headers and click OK. Your range is now a Table — you’ll see the banded rows and the filter dropdowns. Now insert your chart from the Table as normal.
Here’s the payoff: type a new row directly below the Table and it absorbs that row automatically, extending the Table’s boundary. Because the chart is wired to the Table rather than to a fixed range, it extends too. No OFFSET, no named range, no reconfiguring the source. Add data, chart updates. That’s the entire method.
This is why Tables should be your default container for any data you’re going to chart. They’re the foundation that makes almost everything else on this list easier, and they feed PivotCharts and slicer-driven dashboards just as cleanly. If your chart keeps failing to show new rows, converting the source to a Table is very often the whole fix.
The one limitation: a Table auto-expands, but it doesn’t filter what the chart shows. Every row in the Table gets plotted. When you need the chart to show a moving subset — not just everything-plus-new-rows — you move to dynamic arrays.
Method 2: Dynamic arrays (the powerful answer)
Dynamic arrays are the biggest change to Excel’s calculation engine since the product launched, and they turn dynamic charting from a dark art into a two-formula job. The idea: a single formula returns many results that “spill” into a range, and that range resizes automatically as inputs change. Point a chart at the spill range and the chart resizes with it.
Say you want a chart that always shows this month’s records, sorted highest to lowest. You write one formula:
=SORT(FILTER(SalesTable, SalesTable[Month]=SelectedMonth), 2, -1)
FILTER pulls the rows matching your selected month; SORT orders them by the second column, descending. The result spills down as far as it needs to. Change the selected month and the spill redraws — more rows this month, fewer next month — and a chart built on that spill follows along. There’s no manual filtering and no hidden helper columns; the interactive dashboard guide builds this pattern out into a full user-controlled chart.
The one catch: referencing the spill in a chart
There’s a wrinkle worth knowing before you hit it. You’d expect to point the chart series straight at the spill using the # reference — Sheet1!$E$2#. That works in formulas and in data validation, but many Excel builds refuse to accept a raw # reference inside a chart series. So you wrap it in a defined name first.
Go to Formulas > Name Manager > New. Name it something like ChartValues and set it to refer to =Sheet1!$E$2#. Then in your chart, edit the series (Chart Design > Select Data > Edit) and point the series values at the defined name: =Book1.xlsx!ChartValues. Now the chart tracks the spill through the name, and the name tracks the spill through the #. It’s one extra step and then it just works.
This defined-name-around-a-spill pattern is the single most useful thing to learn about modern dynamic charts. Once it clicks, you can build a chart driven by a dropdown, a search box, or a Top-N input in minutes.
Method 3: The legacy OFFSET method (only if you must)
Everything below is for Excel 2019 and earlier, where Tables exist but dynamic arrays don’t. If you’re on Excel 2021, 365, or the web, skip this entirely — you gain nothing from it and inherit its fragility.
The old approach builds a self-resizing range out of a formula and stores it in a named range, which the chart then points to. You create a name (Formulas > Name Manager > New) with a definition like:
=OFFSET(Sheet1!$A$2, 0, 0, COUNTA(Sheet1!$A:$A)-1, 1)
OFFSET starts at A2 and returns a block whose height is however many non-blank cells COUNTA finds in column A. Add a row and COUNTA counts one more, so the range grows. You make one named range for your categories and another for your values, then edit the chart series to reference those names instead of raw cell ranges.
It works. It also breaks in ways that are miserable to debug: OFFSET is volatile, so it recalculates constantly and drags large workbooks; COUNTA miscounts if there are stray entries or blanks in the column; and the whole thing is invisible, so the next person to open your file has no idea why the chart behaves the way it does. This is precisely the machinery that Tables and dynamic arrays were built to retire.
Modern vs legacy at a glance
| Table method | Dynamic-array method | OFFSET named-range method | |
|---|---|---|---|
| Best for | Charts that grow with new rows | Charts that show a changing subset | Nothing, if you have a choice |
| Setup effort | Ctrl+T, insert chart | One FILTER/SORT formula + defined name | Two OFFSET named ranges, careful COUNTA |
| Filters the view? | No — plots everything | Yes | Only with extra formula work |
| Fragility | Very low | Low | High — volatile, invisible, breaks on blanks |
| Performance | Excellent | Excellent | Poor on large files (volatile recalc) |
| Version needed | Excel 2007+ | Excel 2021 / 365 / web | Any version |
| Verdict | Default for auto-expand | Default for auto-filter | Fallback for pre-2021 only |
The pattern across that table is the whole point of this article: the modern methods are less work and more robust. The legacy method’s only advantage is that it runs on old Excel. If that’s your situation, use it — but it’s a reason to upgrade, not a technique to master.
One compatibility note worth planning around: if you build a dynamic-array chart and then send the file to someone on Excel 2019 or earlier, your spill formulas won’t behave — they’ll either show as legacy array formulas or break outright, and the chart will misbehave with them. Dynamic arrays live in Excel 2021, 365, and Excel for the web. Tables, by contrast, work everywhere back to Excel 2007, which is another reason to reach for the Table method first when a chart simply needs to grow with new rows and you can’t guarantee everyone’s on a current version. If you must share a dynamic-array workbook widely, the safe move is to convert the spilled results to static values (copy, then Paste Values) before sending — though that obviously freezes the chart, defeating the point. For genuinely shared, always-current reporting across mixed Excel versions, a Table-fed PivotChart is usually the more portable choice.
A worked example: a Top-N chart driven by one cell
Nothing makes the dynamic-array approach click faster than building the classic version of it: a chart that shows the top N products by revenue, where you change N by typing a single number.
Start with your sales data in a Table called Sales, with a Product column and a Revenue column. In a spare cell — call it N — type 5. Then in the cell where you want your chart data to begin, write:
=SORTBY(Sales[Product], Sales[Revenue], -1)
That spills your products sorted from highest revenue to lowest. In the next column over, pull the matching revenue values with a second spill, or use TAKE on the sorted result. To limit the list to the top N, wrap the whole thing in TAKE:
=TAKE(SORTBY(Sales[Product], Sales[Revenue], -1), N)
| E | F | |
|---|---|---|
| 1 | Top Products | Revenue |
| 2 | Widget Pro | $45,000 |
| 3 | Widget Lite | $38,200 |
| 4 | Super Widget | $29,100 |
| 5 | Widget Max | $22,500 |
| 6 | Widget Mini | $18,400 |
Now the spill only returns the first N rows. Create a defined name pointing at each spill (products and values), point a bar chart’s series at those names, and you’re done. Change N from 5 to 8 and the chart redraws to show eight bars, correctly ranked, instantly. There’s no macro, no manual re-sorting, and no touching the chart — one number controls the whole thing.
This pattern generalizes. Swap the N input for a dropdown that selects a region, and change SORTBY to FILTER on that region, and you have a chart a colleague drives from a menu. It’s the same two ingredients — a spill and a defined name wrapping it — applied to a different question.
Combining the methods
The best dynamic charts use both modern features together. Keep your raw data in a Table so it auto-expands as you add records. Then build your FILTER/SORT formula against that Table, so your spill always works from complete, current data. The Table handles growth; the dynamic array handles the view. A chart built on that spill is fully dynamic in both senses — it never misses new data and it always shows the right slice.
Layer a dropdown or a slicer on top to drive the FILTER criterion and you’ve got a chart a non-technical colleague can operate without touching a formula. That’s the destination the slicer and form-controls guide builds toward, and it’s genuinely the modern standard for an interactive Excel report.
Let Copilot write the formula
If the FILTER and SORT syntax is new to you, this is exactly the kind of task Copilot in Excel handles well. Describe what you want — “chart the top 10 products by revenue for the selected region, and update it when the region changes” — and it will draft the dynamic-array formula and often wire up the chart. It’s not flawless, and you should understand the formula it gives you rather than trusting it blindly, but for getting a dynamic-array pattern started it’s a real shortcut. The Copilot charts guide covers what it does well and where it stumbles.
FAQ
Why won’t my chart show new data even after I add rows? Almost always because your chart is pointed at a fixed range rather than a Table. Convert the source range to a Table with Ctrl+T and rebuild the chart from it, or point the existing series at the Table’s columns. This is the cleanest permanent fix and it takes under a minute.
Do I still need OFFSET and named ranges? Not if you’re on Excel 2021, 365, or Excel for the web. Tables cover auto-expanding and dynamic arrays cover auto-filtering, and both are simpler and more reliable than OFFSET. Keep OFFSET only as a last resort on Excel 2019 and earlier.
Can I reference a spill range directly in a chart with the # symbol?
Sometimes, but many Excel builds reject a raw # reference in a chart series. The reliable approach is to create a defined name pointing to the spill (e.g. =Sheet1!$E$2#) and reference that name in the chart series. It always works and it’s one extra step.
What chart types work with dynamic ranges? All the standard ones — column, bar, line, area, scatter. The dynamic behavior lives in the data source, not the chart type, so anything you can build on a normal range you can build on a Table or a spill. If you’re unsure which type fits your data, the chart chooser covers it.
My dynamic-array chart plots the wrong number of points. What’s wrong?
Usually the defined name is pointing at the anchor cell without the #, so it captures only the first cell instead of the whole spill. Check the name in Name Manager includes the # (e.g. $E$2#, not $E$2). If the spill itself is returning the wrong rows, the problem is in your FILTER criteria, not the chart.
Will these charts update in real time or do I have to refresh? Tables and dynamic arrays update the moment their source data changes, no refresh needed — this is different from PivotCharts, which work from a cached copy and do need a refresh. If your dynamic chart isn’t updating, check that calculation isn’t set to Manual (Formulas > Calculation Options > Automatic).