What Most People Miss About How Many Rows in MS Excel

MS Excel supports exactly 1,048,576 rows per worksheet. But if you assume that’s the ceiling for every real-world task, you’ll hit silent failures in data validation, Power Query imports, and VLOOKUP ranges.

The Setup

Sarah Chen at Acme Corp just received a raw sales export from their ERP system — 982,341 rows of transaction records spanning Q1 2024. She needs to flag duplicates, calculate regional commission tiers, and export a clean summary to PowerPoint. Her laptop runs Excel 365, but her finance team still uses Excel 2010 on shared terminals — and she doesn’t know it yet.

Order ID Customer Region Amount ($) Date
ORD-77291 Ling Zhang APAC $14,820 2024-01-03
ORD-77292 Miguel Rios EMEA $9,350 2024-01-05
ORD-77293 Tasha Okoro AMER $22,100 2024-01-06
ORD-77294 Diego Morales AMER $5,680 2024-01-07
ORD-77295 Anya Petrova EMEA $18,440 2024-01-08
ORD-77296 Kenji Tanaka APAC $31,200 2024-01-09
ORD-77297 Elena Dubois EMEA $7,920 2024-01-10
ORD-77298 Rajiv Mehta APAC $12,650 2024-01-11

The Challenge

Sarah pastes the full dataset into Sheet1 starting at A1. She types =ROWS(A:A) in cell Z1 — it returns 1048576. That feels reassuring. But when she tries to apply an AutoFilter (Ctrl+Shift+L), Excel grays out the filter icons beyond row 1,048,576 — obvious. What’s not obvious is that VLOOKUP(A2,Sheet2!A:B,2,0) will silently return #N/A if Sheet2 has only 65,536 rows (Excel 2003 limit) — and Sarah’s commission table was copied from a legacy .xls file.

The real trap? Row count isn’t just about capacity — it’s about context. Excel treats blank rows *within* your used range as part of the dataset. So if row 500,000 contains a stray space in column Z, Excel counts all rows up to that point as 'used' — bloating memory use and slowing recalculation.

Walking Through It

First, confirm actual used rows: select column A, press Ctrl+Shift+↓, then check the status bar. It says “1,048,576 cells selected” — but that’s misleading. Instead, go to cell A1048576 and press Ctrl+↑. You land on row 982,341 — that’s your true last populated row.

Now fix the used range. Press Ctrl+End. If you land far beyond your data (say, row 1,000,000), Excel thinks those rows are used. To reset: select row 982,342, right-click → Delete → choose Entire row. Repeat until Ctrl+End lands on your last data row.

Before cleanup:
A1:A982341 = real data
A982342:A1048576 = empty but flagged as used

Metric Before After
Used range (A:A) 1,048,576 rows 982,341 rows
File size 14.2 MB 5.7 MB
Recalc time (F9) 2.4 sec 0.6 sec
AutoFilter responsiveness 1.8 sec delay instant

The Result

After cleanup, Sarah’s sheet behaves like a well-tuned engine. Formulas referencing A:A still work — Excel ignores truly blank rows outside the used range. More importantly, her Power Query import now completes in under 8 seconds instead of timing out. And when she shares the file with her colleague using Excel 2010, the commission lookup works because the source table no longer exceeds 65,536 rows.

Row Order ID Customer Amount ($) Date
982,337 ORD-95421 Javier Lopez $8,120 2024-03-15
982,338 ORD-95422 Priya Nair $15,670 2024-03-15
982,339 ORD-95423 Omar Hassan $3,940 2024-03-16
982,340 ORD-95424 Sophie Laurent $21,050 2024-03-16
982,341 ORD-95425 Dmitri Volkov $13,280 2024-03-17

What Could Go Wrong

Mistake #1: Using =COUNTA(A:A) to find last row
It counts non-blank cells — including hidden headers, footers, or a single apostrophe in row 1,000,000. That gives you 1,000,001 instead of 982,341.

Mistake #2: Saving as .xls instead of .xlsx
Excel 2003 format caps at 65,536 rows. If Sarah saves her cleaned 982k-row file as .xls, Excel truncates silently — no warning, no error. She’ll lose 916,840 rows.

Mistake #3: Assuming Ctrl+Shift+End is reliable
In older versions, this shortcut jumps to the last cell Excel *thinks* is used — which could be a formatting artifact in column IV, not real data. Always verify with Ctrl+↑ from the bottom.

Here’s what to do next — copy-paste this into any blank cell to get your true last used row number:

=MAX(ROW(A:A)*(A:A<>""))

Press Ctrl+Shift+Enter (it’s an array formula). It scans column A and returns the highest row number with content — no blanks, no ghosts, no guesswork.

Anna Kim

Anna Kim

Anna specializes in tax forms