how INDEX MATCH actually works, why it beats VLOOKUP, and when XLOOKUP makes both obsolete
- INDEX MATCH works in every Excel version ever shipped, including the 2007 file your CFO refuses to upgrade.
- It looks up to the left, to the right, up, down, and in two directions at once. VLOOKUP cannot.
- On a 100,000-row table, INDEX MATCH recalculates noticeably faster than VLOOKUP because it only touches two columns.
- The pattern is always
=INDEX(return_range, MATCH(lookup_value, lookup_range, 0)). Memorize it once, use it forever. - XLOOKUP is cleaner if you have Microsoft 365 or Excel 2021+. INDEX MATCH still wins on legacy files, shared workbooks, and complex two-way grids.
You've used VLOOKUP for years. Then someone showed you INDEX MATCH and you can never go back. The first time it happens, you feel a little betrayed: every time a colleague inserted a column into your source table, every time you needed to look up a name from an ID column that wasn't on the left, every time the file slowed to a crawl on a 50,000-row table, INDEX MATCH would have saved you. The function isn't a function at all. It's two functions stacked together, and that's what gives it the flexibility VLOOKUP never had. Once your fingers know the pattern, you write it as fast as VLOOKUP and it almost never breaks. This guide walks through how it works, where it still beats XLOOKUP in 2026, and the five patterns I use almost every week on real spreadsheets.
Why INDEX MATCH still matters in 2026
XLOOKUP shipped in 2019. It's faster to type, friendlier syntax, and handles errors gracefully. Why are we still talking about INDEX MATCH? Because XLOOKUP doesn't exist in Excel 2019, Excel 2016, or any version older than that, and most of corporate finance lives in those versions. The model your client emails you was built in 2014. The shared workbook your team uses was opened in Excel 2019 last week and the XLOOKUP cells came back as #NAME?. Legacy templates, audit files, regulator submissions, and ERP exports often have to round-trip through old Excel. INDEX MATCH is the universal translator. It also handles two-way lookups (row label and column label at the same time) more cleanly than XLOOKUP nested in XLOOKUP, and on giant datasets it benefits from Excel's smart recalculation because it only references two single columns instead of an entire table block.
How INDEX MATCH actually works
The trick is to read it inside-out. INDEX returns a value from a list when you give it a position number. MATCH finds that position number for you. You write them stacked together. The skeleton looks like this:
=INDEX(return_range, MATCH(lookup_value, lookup_range, 0))
Imagine an employee table. Column A holds names. Column B holds departments. Column C holds salaries. You want to find Maria Petrenko's salary. INDEX needs to know which column to pull the answer from, so you point it at C2:C500 (the salary column). Then MATCH searches for "Maria Petrenko" inside A2:A500 (the name column) and reports back a number, say 47, meaning Maria is the 47th row of that range. INDEX takes that 47 and returns the 47th cell of C2:C500. Filled in:
=INDEX(C2:C500, MATCH("Maria Petrenko", A2:A500, 0))
The third argument of MATCH is the match type. Zero means exact match. That zero is non-negotiable for almost every business lookup, and forgetting it is the single most common reason people's INDEX MATCH formulas return wrong answers silently. We'll come back to it.
Tip. Press F9 after selecting just the MATCH part of your formula in the formula bar. Excel evaluates that fragment in place and shows you the position number. That's how you debug INDEX MATCH in five seconds.
INDEX MATCH vs VLOOKUP
VLOOKUP feels simpler on the surface, one function instead of two. But once you've shipped a few production spreadsheets, the limitations stack up. Here is the comparison that matters:
| Capability | VLOOKUP | INDEX MATCH |
|---|---|---|
| Lookup direction | Left-to-right only. Lookup column must be the leftmost column of the table. | Any direction. Lookup column can be left, right, above, below the return column. |
| Column insert behavior | Breaks. Adding a column inside the table shifts the column index and silently returns wrong data. | Survives. Ranges are explicit, so inserts adjust automatically. |
| Performance on 100k+ rows | Slower. Excel scans the entire table block on every recalc. | Faster. Only the two referenced columns are touched. |
| Syntax complexity | One function, four arguments. Easier to type. | Two functions, six arguments. Slower to type, harder to mistype dangerously. |
| Two-way lookup (row + column) | Requires VLOOKUP wrapped around MATCH for the column number, awkward. | Natural fit: INDEX(grid, MATCH(row), MATCH(column)). |
The "column insert" row is the one that costs companies real money. I've seen a sales-commission VLOOKUP off by a column for three months because someone added a "Region" field to the source table. The numbers stayed plausible. Nobody noticed until the audit. INDEX MATCH would have moved with the inserted column because it references the salary column directly, not by a count.
INDEX MATCH vs XLOOKUP
If you're on Microsoft 365 or Excel 2021+, XLOOKUP is the better choice for most one-dimensional lookups. It reads cleanly, defaults to exact match, and has a built-in "if not found" argument. But it isn't a free upgrade. Here is what changes:
| Capability | XLOOKUP | INDEX MATCH |
|---|---|---|
| Excel version support | Microsoft 365 and Excel 2021 or newer only. | Every Excel version ever, including 2003 and Mac Excel 2008. |
| Syntax | One function, three required arguments. Reads left-to-right. | Two stacked functions. Inside-out reading. |
| Default match type | Exact match. Safe by default. | You must pass 0 to MATCH or it defaults to approximate, which is a footgun. |
| Error handling | Built-in if_not_found argument. | Wrap in IFERROR, more typing. |
| Two-way lookups | XLOOKUP nested in XLOOKUP, gets verbose. | INDEX with two MATCHes is genuinely cleaner here. |
My rule of thumb: XLOOKUP for any new file you're confident will only be opened in modern Excel. INDEX MATCH for anything shared externally, anything financial-model-grade, and any two-dimensional grid lookup. Both belong in your fingers in 2026.
5 INDEX MATCH patterns you'll use weekly
Most of the real-world value of INDEX MATCH lives in five recurring patterns. Once you've typed each of these a dozen times, you've covered roughly 90% of the lookups you'll do all year. Each pattern below is one I've used on actual client spreadsheets in the last twelve months.
Lookup to the left
The pattern that justifies the entire function. Your data has employee IDs in column C and names in column A. You're given an ID and need to return the name, but the name sits to the left of the ID. VLOOKUP can't do this without rearranging the table or adding a helper column. INDEX MATCH doesn't care about direction.
=INDEX(A2:A500, MATCH("EMP-1042", C2:C500, 0))
Two-way lookup (INDEX MATCH MATCH)
You have a grid where the first row is months and the first column is product names, and the body is units sold. You want to find August sales of "Wireless Earbuds." One MATCH locates the product row, a second MATCH locates the August column, and INDEX returns the cell at that intersection. Cleaner than any nested XLOOKUP I've written.
=INDEX(B2:M50, MATCH("Wireless Earbuds", A2:A50, 0), MATCH("Aug", B1:M1, 0))
Approximate match (tax brackets, commission tiers)
For binned lookups (income to tax bracket, revenue to commission rate) you sort the lookup column ascending and pass 1 as the match type. MATCH returns the position of the largest value less than or equal to your input. This is the right tool when "$83,500 falls in the 24% bracket" is what you need.
=INDEX(B2:B8, MATCH(83500, A2:A8, 1))
Wildcard match
You have a list of companies and you need to find any row containing "Solutions" anywhere in the name. MATCH supports * and ? wildcards when match type is 0 and the lookup value is a text string. Combine with "*"&cell&"*" to do partial matching against a cell reference.
=INDEX(B2:B500, MATCH("*Solutions*", A2:A500, 0))
Multiple criteria with concatenation
You want the salary of the person whose first name is in F2 and last name is in G2. Build a virtual key with & on both sides. In Microsoft 365 this works as a normal formula. In older Excel, confirm with Ctrl+Shift+Enter to make it an array formula.
=INDEX(C2:C500, MATCH(F2&G2, A2:A500&B2:B500, 0))
Common errors and how to fix them
Four errors account for nearly every broken INDEX MATCH I've debugged for clients. Each one points to a specific mistake, and once you recognize the pattern you'll fix them in seconds instead of staring at the formula.
#N/A — value not found. MATCH literally cannot find your lookup value in the lookup range. Causes: trailing spaces ("Maria " vs "Maria"), text-vs-number mismatch (the ID column is stored as text but you're looking up a number), or you're searching the wrong range. Fix with =TRIM(A2) on the source, or wrap your lookup value in VALUE() or TEXT() to match the column type.
#REF! — invalid range. INDEX is being asked to return a position that doesn't exist in its return range. Usually because your return range and lookup range have different lengths. Always make sure A2:A500 and C2:C500 have matching row counts. Use named ranges to enforce this.
#VALUE! — type mismatch. Often appears in array formulas in older Excel when you forget Ctrl+Shift+Enter, or when one of your concatenation operands is an error. Check each piece of the formula in isolation by pressing F9 in the formula bar.
The silent killer: forgetting 0 in MATCH. If you write MATCH(value, range) and omit the third argument, it defaults to 1, which means "approximate match, range must be sorted ascending." If your data isn't sorted, you'll get a wrong answer with no error. The formula returns a value, just not the right one. Always pass 0 for exact match unless you specifically want bracketed lookups.
Performance: INDEX MATCH on large data
On small workbooks the performance difference is invisible. On large ones it's the difference between a spreadsheet that opens in two seconds and one that hangs Excel for thirty. The reason is how Excel's recalculation engine handles ranges. VLOOKUP references a rectangular block of cells (the entire table from lookup column to return column). When anything in that block changes, the whole block is part of the dirty calculation chain. INDEX MATCH, by contrast, references only two single-column ranges: the MATCH range and the INDEX range. If the columns between them change, your formula doesn't recalc. On a financial model with 200 worksheets and 100,000 rows of source data, the savings are real and measurable. I've cut model recalc time from 11 seconds to under 2 by converting hundreds of VLOOKUPs. The trade-off: INDEX MATCH formulas are slightly more verbose, so on small spreadsheets the extra typing isn't worth it. Like most performance work, optimize where it matters and leave the rest readable.
Note. If you're doing thousands of lookups against the same key column, MATCH-once-INDEX-many is faster still: store the MATCH result in a helper column, then use INDEX against the helper column. This pattern shines on dashboards where one key drives 30 different return values.
FAQ
Should I still learn INDEX MATCH if I have XLOOKUP?
Yes. Anyone who shares spreadsheets with clients, vendors, regulators, or anyone on an older Excel version will eventually need INDEX MATCH. It's also the cleanest tool for two-way grid lookups, regardless of which Excel version you're on. Treat it as a permanent part of your toolkit, not a legacy skill.
Does INDEX MATCH work in Google Sheets?
Yes, identically. Google Sheets supports both INDEX and MATCH with the same syntax and behavior, including wildcard support and approximate match. The patterns above work without modification. Sheets also has XLOOKUP now, so the same trade-off applies: XLOOKUP for new files, INDEX MATCH for portability and two-way lookups.
What does the third argument of MATCH actually do?
It's the match type. 0 means exact match (any order). 1 means largest value less than or equal to lookup value (range must be sorted ascending), useful for tax brackets and tiers. -1 means smallest value greater than or equal (range must be sorted descending). 0 is what you want about 95% of the time.
How do I write a two-way lookup in INDEX MATCH?
Use INDEX with two MATCH arguments, one for the row position, one for the column position. The skeleton is =INDEX(grid, MATCH(row_value, row_labels, 0), MATCH(column_value, column_labels, 0)). The grid must be a rectangle that matches the row and column label ranges in size.
When should I use INDEX MATCH vs SUMIFS?
INDEX MATCH returns the first matching row's value as-is. SUMIFS adds up all matching rows. If your lookup key is unique (employee ID, transaction ID, SKU), use INDEX MATCH. If you need to aggregate (total sales for region X in month Y), use SUMIFS. They solve different problems even though both involve "find rows that match these criteria."
Can INDEX MATCH return multiple results?
Not directly. By default it returns only the first match. To return all matches you need FILTER (Microsoft 365), an array formula with SMALL and IF in older Excel, or a pivot table. INDEX MATCH is a one-result tool. Reach for FILTER or TEXTJOIN when you need many.
The Bottom Line
INDEX MATCH is the lookup function that survives every Excel version, every column insert, and every shared-workbook handoff. XLOOKUP is friendlier when you control the environment, but INDEX MATCH is what you reach for when you don't. Memorize the skeleton =INDEX(return_range, MATCH(lookup_value, lookup_range, 0)), never forget the 0, and you'll write lookups that just work. The thirty seconds it takes to learn pays off every week for the rest of your spreadsheet career.
- INDEX MATCH stacks two functions: MATCH finds the position, INDEX returns the value at that position.
- The pattern is always
=INDEX(return_range, MATCH(lookup_value, lookup_range, 0)). The0is mandatory for safety. - It works in every Excel version including the old ones your clients still use, unlike XLOOKUP.
- It looks up in any direction, survives column inserts, and recalculates faster on large datasets than VLOOKUP.
- Two-way lookups (INDEX with two MATCHes) are cleaner than nested XLOOKUP for grid-style data.
- Five recurring patterns cover most real work: lookup left, two-way, approximate, wildcard, multi-criteria.
- Most errors trace back to whitespace, text-vs-number, range length mismatch, or a missing
0match type. - Choose XLOOKUP for modern personal files. Choose INDEX MATCH for anything shared, audited, or performance-critical.
Once your spreadsheet skills are sharp, the next step is letting people see your work. Build a one-page hub with your projects, templates, and contact info at unil.ink in under a minute.
