Single-criterion lookups in Excel are easy. You hand VLOOKUP one value, it returns one row. Done. But the real spreadsheets โ the ones that pay your salary โ almost never work like that. You need the salary of someone named "Sarah" who works in the "Marketing" department. You need the price of SKU "AX-220" in the "EU" region.
You need the test score for student "Jordan" on exam "Midterm 2." Two criteria. Sometimes three. Sometimes four. And the moment you add that second filter, VLOOKUP falls apart, INDEX-MATCH starts demanding array formulas, and half the tutorials on the internet contradict each other.
So here is the truth, stripped of the jargon. Excel gives you five reliable ways to do a lookup with multiple criteria, and which one is best depends on three things: what version of Excel you have, whether you need one match or all matches, and whether you are returning text or summing numbers.
This guide walks through every method with the actual formula, the trade-offs, and the gotchas that waste an afternoon if nobody warns you. By the end you will know exactly which formula to reach for and why. The primary keyword we are after โ excel lookup multiple criteria โ covers a wider problem than most people realize, and the tools below solve every flavor of it.
Quick orientation before we dive in. If you are on Excel 365 or 2021, you have xlookup excel and the filter function excel function available โ these are the modern champions. If you are stuck on Excel 2019, 2016, or earlier, you live in excel index match territory, possibly with Ctrl+Shift+Enter. If you only need to sum or count numeric values, excel sumproduct is shockingly elegant. And if you absolutely must use excel vlookup (corporate template lock-in is real), the helper-column trick still works. We will cover all five.
If you are on Excel 365 or 2021, this is where you should start. XLOOKUP was built to fix everything wrong with VLOOKUP โ it looks left, returns arrays, handles missing-value fallbacks, and (most importantly for our problem) accepts concatenated lookup arrays. That last part is the trick. You glue your criteria together with the ampersand operator and search for the combined value in a glued-together lookup range.
The pattern looks like this:
=XLOOKUP(criterion1 & criterion2, range1 & range2, return_range)
Concrete example. You have a table of employees in columns A (name), B (department), C (salary). You want Sarah's salary in the Marketing department. The formula becomes:
=XLOOKUP("Sarah" & "Marketing", A2:A500 & B2:B500, C2:C500)
That's it. No Ctrl+Shift+Enter dance. No helper column. No array formula syntax. Excel evaluates A2:A500 & B2:B500 as a dynamic array of concatenated strings, finds the first row where it equals "SarahMarketing", and returns the matching salary from C. Clean, fast, readable in three months when you come back to it.
A few refinements you'll want in real workbooks. First, wrap the lookup value in IFERROR or use XLOOKUP's fifth argument for a missing-value fallback: =XLOOKUP("Sarah"&"Marketing", A:A&B:B, C:C, "Not Found"). Second, mind your data types โ if column B stores numbers and you concatenate with text criteria, Excel will coerce, but mismatched leading/trailing spaces will silently break the match. A quick TRIM wrapper around your lookup columns saves an hour of debugging.
For three or more criteria, just keep concatenating: =XLOOKUP(name&dept&year, A:A&B:B&C:C, D:D). The pattern scales as far as you need it to, though performance starts to matter past five or six criteria with full-column references.
Before XLOOKUP existed, INDEX-MATCH was the power user's lookup tool. It still is, and on Excel 2019 or earlier it is the most flexible option you have for multi-criteria lookups. The formula reads ugly the first time, but the logic underneath is clean.
The classic multi-criteria INDEX-MATCH uses an array formula:
=INDEX(return_range, MATCH(1, (col1=crit1)*(col2=crit2), 0))
What is happening here? The expression (col1=crit1)*(col2=crit2) evaluates each row to TRUE or FALSE for each criterion, multiplies the booleans together (TRUE * TRUE = 1, anything else = 0), and creates an array of 1s and 0s. MATCH then looks for the first 1 in that array โ the first row where both criteria are satisfied โ and INDEX returns the value from the corresponding row of the return range.
On Excel 2019 and earlier, this is an array formula. You must press Ctrl + Shift + Enter when you finish typing, not just Enter. Excel will wrap the formula in curly braces (you do not type them yourself). Forget the Ctrl+Shift+Enter and you get a single-cell evaluation that almost always returns the wrong row, usually the last match or #N/A.
On Excel 365 and 2021, dynamic arrays make Ctrl+Shift+Enter unnecessary โ just press Enter and the formula spills naturally. Same result, less ceremony. The match function excel and index function excel pages have deeper dives on each piece if the logic still feels fuzzy.
Real-world example. You have a gradebook with students in column A, exam names in column B, and scores in column C. You want Jordan's score on Midterm 2:
=INDEX(C2:C200, MATCH(1, (A2:A200="Jordan")*(B2:B200="Midterm 2"), 0))
If you want approximate or case-sensitive matching, you swap the equality test for EXACT(col1, crit1) โ which is case-sensitive โ or for a comparison operator. For more than two criteria, just keep multiplying: (col1=crit1)*(col2=crit2)*(col3=crit3). The array stays a single dimension because each multiplication is element-wise.
SUMPRODUCT is the dark horse of multi-criteria lookups. It is older than INDEX-MATCH in array form, it works in every version of Excel back to the early 2000s, and it does not require Ctrl+Shift+Enter. The catch: it only works cleanly when you are returning a number, because under the hood it sums the array.
The pattern:
=SUMPRODUCT((col1=crit1)*(col2=crit2)*return_range)
This works because when both criteria match, the product is 1 * 1 * value = value. When either criterion fails, the product is zero. SUMPRODUCT sums everything, so you get back the value from the matching row โ assuming exactly one row matches. If two rows match, you get their sum, which is fine when you want to aggregate but a bug when you wanted a single lookup.
Example. You have monthly sales by product and region. Total Q1 sales for Product X in the EU:
=SUMPRODUCT((Product=B2)*(Region="EU")*(Quarter="Q1")*Sales)
SUMPRODUCT shines in three scenarios. First, when you actually do want a sum across multiple matching rows โ it is shorter than SUMIFS and supports operators SUMIFS does not, like wildcards and ranges. Second, when you are on legacy Excel and want to avoid Ctrl+Shift+Enter. Third, when you need conditional counting โ wrap the criteria without a numeric return range and SUMPRODUCT counts matching rows: =SUMPRODUCT((col1=crit1)*(col2=crit2)).
Where SUMPRODUCT falls down: returning text. If your return column is text, SUMPRODUCT throws #VALUE! because it cannot multiply text by a boolean. For text returns, fall back to INDEX-MATCH or XLOOKUP.
Best for Excel 365/2021 when you need a single match. Concatenate criteria with on both sides. Supports left lookups, fallback values, and approximate match via match_mode=1.
Universal compatibility. Uses multiplied boolean arrays inside MATCH. Requires Ctrl+Shift+Enter on Excel 2019 and earlier; spills naturally on 365.
Numeric returns only. No CSE required. Great for conditional sums and counts. Throws #VALUE! on text return ranges.
Excel 365/2021 only. Returns ALL matching rows as a spilled array, not just the first. Perfect when you need every row that meets the criteria.
The legacy workaround. Build a column that concatenates your criteria, then VLOOKUP normally. Works in every Excel version and survives template lock-in.
For very large datasets or recurring lookups. Multi-key joins handle millions of rows faster than any formula and refresh on demand.
XLOOKUP returns the first match. INDEX-MATCH returns the first match. SUMPRODUCT sums everything. But what if you genuinely need every row that satisfies your criteria โ say, every transaction by customer X in Q2, not just the first one? That is what the filter function excel function was built for, and it is the cleanest answer in Excel 365.
The pattern:
=FILTER(return_range, (col1=crit1)*(col2=crit2))
Same boolean-multiplication trick as INDEX-MATCH, but FILTER returns the entire spilled array of matching rows instead of stopping at the first one. If three rows match, you get three rows back, automatically populating cells below the formula cell. If zero rows match, you can supply a third argument for the fallback: =FILTER(C2:C500, (A2:A500="Sarah")*(B2:B500="Marketing"), "No match").
Real example. You manage a customer support log and want every ticket from customer "ACME Corp" with priority "High":
=FILTER(Tickets, (Customer="ACME Corp")*(Priority="High"))
FILTER spills the entire matching subset of the Tickets range below your formula cell. If new tickets are added later, the spilled range auto-updates the next time the workbook recalculates. This is a game-changer for dashboards โ you build the filter once and every refresh stays current.
FILTER pairs beautifully with other dynamic-array functions. Wrap it in SORT to order the results: =SORT(FILTER(...)). Wrap it in UNIQUE to deduplicate. Wrap it in COUNTA to count matches. The composability is what makes the 365 era of Excel genuinely different from what came before.
Source data in A2:C500 โ column A is Name, B is Department, C is Salary.
=XLOOKUP("Sarah"&"Marketing", A2:A500&B2:B500, C2:C500, "Not Found")
Returns Sarah's salary from the Marketing department, or "Not Found" if no match. No array formula needed โ XLOOKUP handles spilled lookup arrays natively in Excel 365 and 2021.
For Excel 2019 or earlier, write the formula and press Ctrl + Shift + Enter instead of just Enter.
=INDEX(C2:C500, MATCH(1, (A2:A500="Sarah")*(B2:B500="Marketing"), 0))
On Excel 365 the same formula works with just Enter โ dynamic arrays handle the array context automatically.
Source data: Product in column A, Region in B, Quarter in C, Sales in D.
=SUMPRODUCT((A2:A1000="X")*(B2:B1000="EU")*(C2:C1000="Q1")*D2:D1000)
Returns the total sales matching all three criteria. No CSE required, works in Excel 2010 and up.
Source data: ticket log with Customer, Priority, Subject, and Date columns.
=FILTER(A2:D500, (A2:A500="ACME")*(B2:B500="High"), "No tickets")
Spills every High-priority ticket from ACME into the cells below the formula cell. New tickets auto-appear on recalculation.
Sometimes you cannot escape excel vlookup. A corporate template requires it. A coworker maintains a workbook that breaks if you replace the formula. A pivot table downstream depends on a VLOOKUP-shaped column. Fine. There is a clean trick for multi-criteria VLOOKUP, and it has been used for two decades: the helper column.
Step one. Insert a new column at the start of your lookup table โ say, column A becomes the helper and your original columns shift to B, C, D. In the helper, concatenate the criteria columns: =B2&C2. Drag down. You now have a column of unique combined keys like "SarahMarketing", "JordanMidterm 2", "AX-220EU".
Step two. VLOOKUP normally, but concatenate your two criteria in the lookup value too:
=VLOOKUP("Sarah" & "Marketing", A:D, 4, FALSE)
The 4 is the column index of the return value (column D in this example, since the helper shifted everything right). FALSE forces exact match.
This works in every Excel version. It survives template lock-in because the VLOOKUP itself looks normal โ anyone who opens the workbook sees a standard VLOOKUP and only notices the helper column if they go digging. The downside: you maintain an extra column, and if your lookup table is referenced by other formulas (pivot tables, named ranges, charts), inserting a column at the start can break them. The fix is to put the helper at the end of the table instead and use INDEX or build the helper in a separate sheet that pulls the source data.
A subtle pitfall. If your criteria values overlap โ say one column has "ABC" and "123" and the other has "DEF" and "BCD" โ concatenating could produce ambiguous keys ("ABCDEF" and "AB" + "CDEF" collide). The standard fix is to inject a delimiter that cannot appear in your data: =B2 & "|" & C2 in the helper, and "Sarah" & "|" & "Marketing" in the lookup value. The pipe character is a common choice because it rarely appears in business data.
For small datasets โ under 10,000 rows โ every method on this list returns in milliseconds. You will not notice a difference. For larger datasets, the picture changes, and the ordering can surprise people.
XLOOKUP is consistently the fastest for single-value retrieval in Excel 365. Microsoft optimized the underlying binary search and the concatenated-array handling, and on a 100,000-row table with two criteria it typically finishes in 30โ50 milliseconds. INDEX-MATCH with the array-multiplication pattern is slower because it has to evaluate the full criteria arrays for every row before MATCH picks a winner โ expect 200โ400 milliseconds on the same dataset.
SUMPRODUCT is comparable to INDEX-MATCH in speed but uses less memory because it does not build an intermediate array of return values. FILTER, when spilling many rows, can be slower than XLOOKUP for the same lookup because it has to materialize every matching row instead of stopping at the first one โ which is the cost of getting every match instead of just the first.
VLOOKUP with a helper column is fast for the lookup itself but slow to maintain โ every insert, delete, or sort in your source data forces Excel to recalculate the helper, which cascades through every downstream formula. On large tables the helper becomes a bottleneck even when each individual VLOOKUP is fast.
For datasets above 500,000 rows, drop formulas entirely. Use excel power query to do the multi-key merge as a query, load the result to the worksheet, and refresh on demand. Power Query merges run in C++ under the hood, not Excel's formula engine, and they handle millions of rows without breaking a sweat. The excel lookup function reference walks through the formula side; Power Query is the natural next step when formulas hit their limit.
Multi-criteria lookups break in predictable ways. Here is the short list of things that will eat your morning if you don't recognize them.
The #N/A return. Usually means no row matches all your criteria. Check for leading or trailing spaces by wrapping your criteria columns in TRIM. Check for invisible characters (Excel pastes from web pages often include non-breaking spaces) by wrapping in CLEAN. Check for case sensitivity if your criteria came from systems that treat "sarah" and "Sarah" differently. Standard equality in Excel is case-insensitive; use EXACT if you actually need case match.
The wrong-row return. Almost always means you forgot Ctrl+Shift+Enter on an INDEX-MATCH array formula in legacy Excel. The formula evaluates only the first row of the criteria comparison without CSE, finds a coincidental match, and returns the wrong result. Look at the formula bar โ if there are no curly braces around the formula, you missed the CSE.
The #VALUE! error. SUMPRODUCT throws this when your return range contains text. Switch to INDEX-MATCH or XLOOKUP. The same error from XLOOKUP usually means a range-size mismatch โ your lookup array and return array have different lengths.
The #NAME? error. You typed XLOOKUP or FILTER on a version of Excel that does not support it. Either upgrade to 365/2021, or rewrite the formula using INDEX-MATCH or SUMPRODUCT.
Slow recalculation. Full-column references (A:A instead of A2:A1000) on large workbooks with many formulas force Excel to evaluate millions of empty cells. Trim your ranges to the actual data, convert the source to an Excel Table (Ctrl + T), and reference the table by name โ Excel only evaluates the populated rows.
Most multi-criteria lookups are exact-match โ you want Sarah in Marketing, not someone like Sarah in something-like Marketing. But occasionally you need approximate matching, usually with one criterion being a numeric range (like income brackets, date ranges, or score thresholds) combined with an exact-match secondary criterion.
XLOOKUP handles this elegantly through its match_mode argument. The fifth argument, match_mode, accepts 1 (exact or next larger), -1 (exact or next smaller), or 2 (wildcard). For a salary lookup by name and income bracket where the bracket column holds the lower bound of each band:
=XLOOKUP(name&bracket, names&brackets, salary, "Not Found", -1)
For approximate matches on legacy Excel, INDEX-MATCH lets you swap the third MATCH argument to 1 (less than) or -1 (greater than), but the data must be sorted accordingly. Sorted lookups are an order of magnitude faster than exact-match scans on large tables โ Excel uses binary search instead of a linear scan โ so if your reference data is naturally sorted, the approximate-match modes are worth knowing.
One more useful pattern: combining multi-criteria with wildcards. XLOOKUP's match_mode 2 lets you use * and ? in the criteria. So a lookup like "find the employee whose name starts with Sa in the Marketing department" becomes:
=XLOOKUP("Sa*"&"Marketing", names&departments, salaries, , 2)
Useful for messy data where you don't know the exact spelling but you know the prefix.
Here is how I actually choose, in the order I think about it.
First question: what Excel version are you on? If 365 or 2021, the question becomes "one match or all matches?" โ XLOOKUP for one, FILTER for all. If 2019 or earlier, you are in INDEX-MATCH or SUMPRODUCT territory.
Second question: what are you returning? Text only โ use XLOOKUP, INDEX-MATCH, FILTER, or VLOOKUP-helper. A number you want to sum across matches โ use SUMPRODUCT or SUMIFS. A count of matching rows โ SUMPRODUCT or COUNTIFS.
Third question: how big is the data? Under 10,000 rows, any method works. Between 10k and 500k, prefer XLOOKUP or trimmed-range INDEX-MATCH over full-column references. Over 500k, drop formulas and use Power Query merges with multiple key columns โ they are an order of magnitude faster.
Fourth question: how often does the data change? Static or rarely-updated data โ formulas are fine. Frequently-refreshed data (especially from external sources) โ Power Query gives you a refresh button and skips the formula-recalc storm. Dashboard refresh times matter when you are presenting to non-technical stakeholders who lose patience after the first thirty-second recalculation.
Fifth question: who else will maintain this workbook? If you are the only owner, write the most concise formula. If you are handing off to less-technical users, prefer XLOOKUP for readability or a clearly-labeled helper column with VLOOKUP โ both are easier for non-experts to debug than nested INDEX-MATCH arrays.
There is no single best method for excel lookup multiple criteria. There is the right method for your version, your data shape, and your team. The five techniques in this guide cover every realistic scenario, and the decision framework above should make the choice obvious within thirty seconds. Bookmark the formulas. Print the cheat-sheet section. Most importantly, practice on a small test dataset before pointing any of these at the workbook that runs your quarterly board report. Excel forgives a lot, but it does not forgive a multi-criteria lookup that silently returns the wrong row to a CFO.
If you remember nothing else: concatenate criteria with a delimiter, trim your inputs, and test on a known-matching row first. Those three habits prevent ninety percent of the bugs that show up in multi-criteria lookups across every Excel version and every method.