This tutorial shows how to use INDEX and MATCH in Excel and how it is better than VLOOKUP.
In a couple of recent articles, we made a good effort to explain the basics of VLOOKUP function to beginners and provide more complex VLOOKUP formula examples to power users. And now, I will try if not to talk you out of using VLOOKUP, then at least show you an alternative way to do a vertical lookup in Excel.
"What do I need that for?" you may wonder. Because VLOOKUP has numerous limitations that can prevent you from getting the desired result in many situations. On the other hand, the INDEX MATCH combination is more flexible and has many awesome features that make it superior to VLOOKUP in many respects.
Excel INDEX and MATCH functions - the basics
Since the aim of this tutorial is to demonstrate an alternative way to do a vlookup in Excel by using a combination of INDEX and MATCH functions, we won't dwell much on their syntax and uses. We will cover only the minimum necessary for understanding the general idea and then take an in-depth look at formula examples that reveal all the advantages of using INDEX MATCH instead of VLOOKUP.
INDEX function - syntax and usage
The Excel INDEX function returns a value in an array based on the row and column numbers you specify. The syntax of the INDEX function is straightforward:
Here is a very simple explanation of each parameter:
- array - a range of cells that you want to return a value from.
- row_num - the row number in array from which you want to return a value. If omitted, the column_num is required.
- column_num - the column number in array from which you want to return a value. If omitted, row_num is required.
For more information, please see Excel INDEX function.
And here is an example of the INDEX formula in its simplest form:
=INDEX(A1:C10,2,3)
The formula searches in cells A1 through C10 and returns a value of the cell in the 2nd row and the 3rd column, i.e. cell C2.
Very easy, right? However, when working with real data you would hardly ever know which row and column you want, that's where the MATCH function comes in handy.
MATCH function - syntax and usage
The Excel MATCH function searches for a lookup value in a range of cells and returns the relative position of that value in the range.
The syntax of the MATCH function is as follows:
- lookup_value - the number or text value you are looking for.
- lookup_array - a range of cells being searched.
- match_type - specifies whether to return an exact match or the nearest match:
- 1 or omitted (default) - approximate match (next smaller).
- 0 - exact match. In the INDEX / MATCH combination, you almost always need an exact match, so you set the third argument of your MATCH function to 0.
- -1 - approximate match (next larger).
For example, if the range B1:B3 contains the values "New-York", "Paris", "London", the below formula returns the number 3, because "London" is the third entry in the range:
=MATCH("London",B1:B3,0)
For more information, please see Excel MATCH function.
At first sight, the usefulness of the MATCH function may seem questionable. Who cares about the position of a value in a range? What we do want to know is the value itself.
Let me remind you that the relative position of the lookup value (i.e. row and column numbers) is exactly what you need to supply to the row_num and column_num arguments of the INDEX function. As you remember, Excel INDEX can find the value at the juncture of a given row and column, but it cannot determine which exactly row and column you want.
How to use INDEX MATCH function in Excel
Now that you know the basics, I believe it has already started making sense how MATCH and INDEX work together. In a nutshell, INDEX finds the lookup value by column and row numbers, and MATCH provides those numbers. That's it!
For vertical lookup, you use the MATCH function only to determine the row number and supply the column range directly to INDEX:
Still having difficulties to figure that out? It might be easier to understand from an example. Suppose you have a list of national capitals and their population:
To find the population of a certain capital, say the capital of Japan, use the following INDEX MATCH formula:
=INDEX(C2:C10, MATCH("Japan", A2:A10, 0))
Now, let's analyze what each component of this formula actually does:
- The MATCH function searches for the lookup value "Japan" in the range A2:A10, and returns the number 3, because "Japan" is third in the lookup array.
- The row number goes directly to the row_num argument of INDEX instructing it to return a value from that row.
So, the above formula turns into a simple INDEX(C2:C,3) that says to search in cells C2 through C10 and pull the value from the 3rd cell in that range, i.e. C4 because we start counting from the second row.
Don't want to hardcode the city in the formula? Input it in some cell, say F1, supply the cell reference to MATCH, and you will get a dynamic lookup formula:
=INDEX(C2:C10, MATCH(F1,A2:A10,0))
Important note! The number of rows in the array argument of INDEX should match the number of rows in the lookup_array argument of MATCH, otherwise the formula will produce an incorrect result.
Wait, wait… why don't we simply use the following Vlookup formula? What's the point in wasting time trying to figure out the arcane twists of Excel MATCH INDEX?
=VLOOKUP(F1, A2:C10, 3, FALSE)
In this case, no point at all :) This simple example is for demonstration purposes only, so that you get a feel of how the INDEX and MATCH functions work together. Other examples that follow below will show you the real power of this combination that easily copes with many complex scenarios when VLOOKUP stumbles.
Tips:
- In Excel 365 and Excel 2021, you can use a more modern INDEX XMATCH formula.
- For Google Sheets, see formula examples with INDEX MATCH in this article.
INDEX MATCH vs. VLOOKUP
When deciding which function to use for vertical lookups, most Excel gurus agree that INDEX MATCH is far better than VLOOKUP. However, many people still stay with VLOOKUP, firstly, because it's simpler and, secondly, because they do not fully understand all benefits of using the INDEX MATCH formula in Excel. Without such understanding no one is willing to invest their time to learn a more complex syntax.
Below, I will point out the key advantages of MATCH INDEX over VLOOKUP, and you decide whether it's a worthy addition to your Excel arsenal.
4 main reasons to use INDEX MATCH instead of VLOOKUP
- Right to left lookup. As any educated user knows, VLOOKUP cannot look to its left, meaning your lookup value should always reside in the leftmost column of the table. INDEX MATCH can do left lookup with ease! The following example shows it in action: How to Vlookup a value to the left in Excel.
- Insert or delete columns safely. VLOOKUP formulas get broken or delivers incorrect results when a new column is deleted from or added to a lookup table because VLOOKUP's syntax requires specifying the index number of the column you want to pull the data from. Naturally, when you add or delete columns, the index number changes.
With INDEX MATCH, you specify the return column range, not an index number. As the result, you are free to insert and remove as many columns as you want without worrying about updating every associated formula.
- No limit for a lookup value's size. When using the VLOOKUP function, the total length of your lookup criteria cannot exceed 255 characters, otherwise you will end up having the #VALUE! error. So, if your dataset contains long strings, INDEX MATCH is the only working solution.
- Higher processing speed. If your tables are relatively small, there will hardly be any significant difference in Excel performance. But if your worksheets contain hundreds or thousands of rows, and consequently hundreds or thousands of formulas, MATCH INDEX will work much faster than VLOOKUP because Excel will have to process only the lookup and return columns rather than the entire table array.
VLOOKUP's impact on Excel's performance may be especially noticeable if your workbook contains complex array formulas like VLOOKUP and SUM. The point is that checking each value in the array requires a separate call of the VLOOKUP function. So, the more values your array contains and the more array formulas you have in a workbook, the slower Excel performs.
To discover the nuanced differences between INDEX MATCH and XLOOKUP, explore the in-depth analysis in this guide: Excel XLOOKUP vs INDEX MATCH.
Excel INDEX MATCH - formula examples
Knowing the reasons to learn the MATCH INDEX function, let's get to the most interesting part and see how you can apply the theoretical knowledge in practice.
INDEX MATCH formula to look up from right to left
As already mentioned, VLOOKUP cannot look at its left. So, unless your lookup values are is the leftmost column, there's no chance that a Vlookup formula will bring you the result you want. The INDEX MATCH function in Excel is more versatile and does not really care where the lookup and return columns are located.
For this example, we will add the Rank column to the left of our sample table and try to figure out how the Russian capital, Moscow, ranks in terms of population.
With the lookup value in G1, use the following formula to search in C2:C10 and return a corresponding value from A2:A10:
=INDEX(A2:A10,MATCH(G1,C2:C10,0))
Tip. If you plan to use your INDEX MATCH formula for more than one cell, be sure to lock both ranges with absolute cell references (like $A$2:$A$10 and $C$2:4C$10) so they won't get distorted when copying the formula.
INDEX MATCH MATCH to search in rows and columns
In the above examples, we used INDEX MATCH as the replacement for classic VLOOKUP to return a value from a predefined one-column range. But what if you need to look up in multiple rows and columns? In other words, what if you want to perform the so-called matrix or two-way lookup?
This may sound tricky, but the formula is very similar to the basic Excel INDEX MATCH function, with just one difference. Guess what?
Simply, use two MATCH functions – one to get a row number and the other to get a column number. And I congratulate those of you who have guessed right :)
And now, please take a look at the below table and let's build an INDEX MATCH MATCH formula to find the population (in millions) in a given country for a given year.
With the target country in G1 (vlookup value) and the target year in G2 (hlookup value), the formula takes this shape:
=INDEX(B2:D11, MATCH(G1,A2:A11,0), MATCH(G2,B1:D1,0))
How this formula works
Whenever you need to understand a complex Excel formula, break it down into smaller parts and see what each individual function does:
MATCH(G1,A2:A11,0)
– searches through A2:A11 for the value in cell G1 ("China") and returns its position, which is 2.
MATCH(G2,B1:D1,0))
– searches through B1:D1 to get the position of the value in cell G2 ("2015"), which is 3.
The above row and column numbers go to the corresponding arguments of the INDEX function:
INDEX(B2:D11, 2, 3)
As the result, you get a value at the intersection of the 2nd row and 3rd column in the range B2:D11, which is the value in cell D3. Easy? Yep!
Excel INDEX MATCH to look up multiple criteria
If you had a chance to read our Excel VLOOKUP tutorial, you have probably already tested a formula to Vlookup with multiple criteria. However, a significant limitation of that approach is the necessity to add a helper column. The good news is that Excel's INDEX MATCH function can look up with two or more criteria too, without modifying or restructuring your source data!
Here's the generic INDEX MATCH formula with multiple criteria:
Note. This is an array formula that must be completed with the Ctrl + Shift + Enter shortcut.
In the sample table below, supposing you want to find the amount based on 2 criteria, Customer and Product.
The following INDEX MATCH formula works a treat:
=INDEX(C2:C10, MATCH(1, (F1=A2:A10) * (F2=B2:B10), 0))
Where C2:C10 is the range to return a value from, F1 is criteria1, A2:A10 is the range to compare against criteria1, F2 is criteria 2, and B2:B10 is the range to compare against criteria2.
Remember to enter the formula correctly by pressing Ctrl + Shift + Enter, and Excel will automatically enclose it curly brackets as shown in the screenshot:
If you'd rather not use array formulas in your worksheets, add one more INDEX function to the formula and complete it with a usual Enter hit:
How these formulas work
The formulas use the same approach as the basic INDEX MATCH function that looks through a single column. To evaluate multiple criteria, you create two or more arrays of TRUE and FALSE values that represent matches and non-matches for each individual criterion, and then multiply the corresponding elements of these arrays. The multiplication operation converts TRUE and FALSE into 1 and 0, respectively, and produces an array where 1's correspond to rows that match all the criteria. The MATCH function with a lookup value of 1 finds the first "1" in the array and passes its position to INDEX, which returns a value in this row from the specified column.
The non-array formula relies on the ability of the INDEX function to handle arrays natively. The second INDEX is configured with 0 row_num so that it will pass the entire column array to MATCH.
That is a high-level explanation of the formula's logic. For full details, please see Excel INDEX MATCH with multiple criteria.
Excel INDEX MATCH with AVERAGE, MAX, MIN
Microsoft Excel has special functions to find a minimum, maximum and average value in a range. But what if you need to get a value from another cell that is associated with those values? In this case, use the MAX, MIN or AVERAGE function together with INDEX MATCH.
INDEX MATCH with MAX
To find the largest value in column D and return a value from column C in the same row, use this formula:
=INDEX(C2:C10, MATCH(MAX(D2:D10), D2:D10, 0))
INDEX MATCH with MIN
To locate the smallest value in column D and pull an associated value from column C, use this one:
=INDEX(C2:C10, MATCH(MIN(D2:D10), D2:D10, 0))
INDEX MATCH with AVERAGE
To work out the value closest to the average in D2:D10 and get a corresponding value from column C, this is the formula to use:
=INDEX(C2:C10, MATCH(AVERAGE(D2:D10), D2:D10, -1 ))
Depending on how your data is organized, supply either 1 or -1 to the third argument (match_type) of the MATCH function:
- If your lookup column (column D in our case) is sorted ascending, put 1. The formula will calculate the largest value that is less than or equal to the average value.
- If your lookup column is sorted descending, enter -1. The formula will compute the smallest value that is greater than or equal to the average value.
- If your lookup array contains a value exactly equal to the average, you can enter 0 for exact match. No sorting is required.
In our example, the populations in column D are sorted in descending order, so we use -1 for match type. As the result, we get "Tokyo" since its population (13,189,000) is the closest match that is greater than average (12,269,006).
You may be curious to know that VLOOKUP can perform such calculations too, but as an array formula: VLOOKUP with AVERAGE, MAX, MIN.
Using INDEX MATCH with IFNA / IFERROR
As you have probably noticed, if an INDEX MATCH formula in Excel cannot find a lookup value, it produces an #N/A error. If you wish to replace the standard error notation with something more meaningful, wrap your INDEX MATCH formula in the IFNA function. For example:
=IFNA(INDEX(C2:C10, MATCH(F1,A2:A10,0)), "No match is found")
And now, if someone inputs a lookup table that does not exist in the lookup range, the formula will explicitly inform the user that no match is found:
If you'd like to catch all errors, not only #N/A, use the IFERROR function instead of IFNA:
=IFERROR(INDEX(C2:C10, MATCH(F1,A2:A10,0)), "Oops, something went wrong!")
Please keep in mind that in many situations it might be unwise to disguise all errors because they alert you about possible faults in your formula.
That's how to use INDEX and MATCH in Excel. I hope our formula examples will prove helpful for you and look forward to seeing you on our blog next week!
Practice workbook for download
Excel INDEX MATCH examples (.xlsx file)
614 comments
I have column A2:A10, B2:B10, C2:C10, D2:D10, with random name and few are matching within. Also in same sheet from A13 to A75 have main name table, now I want EXACT MATCH if any name MATCH (priority) 3 times or 2 times within A2:A10, B2:B10, C2:C10, D2:D10 if 3 times match need HIGHLIGHT exact NAME in main table (A13 to A75).
If possible please help me, Thanks in advance.
I am trying to sort a Christmas list i have made on Open Office into my grandkids names. The list I made has 3 main columns..A,B and C with multible columns.... D,E,F,etc.with "x' in them for each person that gets that gift. I would like to write a formula that would copy column A,B & C for the person in say D column(Caitlin) that has an x beside it. I tried writing a formula for say a-1 that says =if(d629="x";+a6290 but it doesn't work. I would also like for it to move to the next row under D if there is no x in d629.
If you could help me out, I would greatly appreciate it.
Thanks and ...HAVE A GREAT DAY and a MERRY CHRISTMAS!!!!!!
I need formula to display the lowest vendor for each row. Can anyone help with this as the Index function uses range which is giving error due to values are located in alternate columns.
Thank you
| Vendor | Discount | Price | Vendor | Discount | Price | Lowest vendor|
Product 1| AAA | 15 | 2000 | BBB | 10 | 2500 | ???formula |
Product 2| CCC | 15 | 1500 | DDD | 20 | 1000 | ???formula |
I have a scenario, I want to pickup data from another sheet where in like following
Name/month/place
A/apr-18/x
A/apr-18/y
How do I lookup the place from this sheet to another using index and match. Conditions are place is unique bit name and month will get repeat so it's a kind of multiple criteria. I have done this through vlookup by added a column but I want to know in this format
I have two columns that are pull down lists and I want to to pull in the required value of the intersections based on the selection from the pull down lists... I have a basic risk register developed that I would like to correlate the correct risk value... For example I have a consequence pulldown list (AK11) and a likelihood pull down list (AL11) and I want to match the correct value into AK12... the table that I am using to reference is a simple 5 x 5...
I cannot seem to get the index table and match formula to work - I either get a 0 or no value?
Would like to ask if there is also an alternative to this if you are looking for cells containing a certain value. The thing with the index-match formula is that it finds for the exact value. it is similar to the vlookup with approximate match. Thing is the data is on the right side so I'm needing a left lookup formula with approximate match, not exact match.
Thank you for those who can answer my query.
I am trying to get a formula to lookup a "itemNo" and search for the lowest 6 bidders in a table as given below. Would greatly appreciate your support.
SEARCH Item_02
No of Bidders 6
Class Bidder Value
1 LISTEC HOLDINGS #VALUE!
2 HEMSONS #VALUE!
3 ANALYTICAL INSTRUMENTS #VALUE!
4 LABORATORY EQUIPMENTS #VALUE!
5 AVON #VALUE!
6 HI FI CENTER PROJECT #VALUE!
SUPPLIERS Item_01 Item_02 Item_03 Item_04
LISTEC HOLDINGS Rs. 225,000 Rs. 29,688 Rs. 83,000 Rs. 68,000
TECHNO INSTRUMENTS N/Q N/Q Rs. 974,370 Rs. 1,583,090
ROTEX N/Q N/Q Rs. 650,000 N/Q
AVON Rs. 518,790 N/Q N/Q N/Q
ATA INTERNATIONAL N/Q Rs. 79,000 Rs. 978,000 Rs. 1,490,000
CAN COM Rs. 140,000 Rs. 6,500 Rs. 1,450,000 Rs. 2,350,000
HI FI CENTER PROJECT Rs. 585,800 Rs. 18,300 Rs. 331,000 Rs. 321,000
HEMSONS Rs. 369,860 Rs. 99,750 N/Q N/Q
ISLAND WIDE SCIENTIFIC N/Q N/Q Rs. 4,136,000 Rs. 2,811,000
CLARION INTERNATIONAL Rs. 1,534,000 N/Q Rs. 970,000 Rs. 1,165,000
SALID ZONE N/Q N/Q Rs. 627,300
RAMATAS GLOBALTRADING N/Q N/Q Rs. 1,440,000 Rs. 1,760,000
Good day Svetlana,
I hope you will be able to help me. I have been going back and fourth between whether to use a macro or formula to solve this problem and am still not sure.
I have two columns from one spreadsheet and 3 columns from another that I first need to line up and match the invoice numbers from each of the two sets of columns and then I need to find the difference between the values of the other two columns from each set. The last column will tell me who VP those differences will be assigned to.
This INDEX/MATCH formula seems like the best (formula) method to attempt, but I have over 7000 rows that I need to line up and find the differences for each all at the same time.
The best (macro) method I have found is from here: http://sites.madrocketscientist.com/jerrybeaucaires-excelassistant/text-functions/line-up-matches and it works almost perfectly, except for the last 400 rows, the macro splits them up in two columns despite the fact that they still match each other.
If you happen to know how I can achieve this through a formula, I would appreciate any and all help on this one.
Thank you very much Svetlana.
Dennis
Hi,
I need to look up for a multiple colums with offset for client invoice # po# amount details etc. Please help.
Regards
Rashmi
Hello,
I am trying to reference a sheet that runs horizontally and use INDEX MATCH to fill in another sheet that runs vertical. But is based on multiple criteria.
IE :
Customer Measure wk 35 wk 36 wk 37 wk 38
Erik Retail $9.99 $9.99 $9.99 $9.99
Erik Cost $4.50 $4.50 $4.50 $4.50
Erik Sellout FCST 100 100 150 100
Erik Channel Inventory 250 150 0 100
I need to look up "Erik", by "sellout FCST" by "wk 37"
I understand INDEX and with MATCH which was a fantastic tutorial. But i am having trouble adding this small example above.
Thank you for any help provided.
E
Hello. I am working on a spreadsheet and trying to figure out the best way. What I need is to find a match from the sheet I am working on which starts on E3. I want to be able to look on the same row on a different sheet that matches the text in E3. It will have a range to match from E3-J3 on the other sheet. However, I do not want it to simply return the value found in that matches, I want it to designate text for each column. Basically if row E3 has the text Cookie in it and it finds a match on the other sheet row 3 in the columns E3-J3 that also contains Cookie, how can I make it return a value based on the column it is found in? Any suggestions would be greatly appreciated.
Hi,
Which formula do I put in D2 to achieve the following?
If A2 contains all the text (consecutively but not an exact match) from any cell from range B2 through B50, then display the corresponding text that's currently located in column C in that corresponding row. So if it finds that A2 contains text (consecutively but not an exact match) that exists say in B47 then it should display the text from C47 in column D2.
Your help would really be appreciated
Hi, My data is A4:J22.
I have column B which contains the category name, used multiple times.
I have column F containing a dollar value amount still to be paid.
In cell K3, I want put the total dollar value (from column F) for specific text "Meal Entertainment" in column B.
Eg:
Column B: Column F:
Meal Entertainment $20.00
Living Expenses $1,000.00
Living Expenses $50.00
Meal Entertainment $100.00
So, in column K3, I want to end up with an amount of $120.00.
Thanks in advance.
Thanks. I will give this a try.
THANK YOU!!!! It works perfectly.
Lee-Anne, could you share the solution? It appears the previous comment has been deleted, but I am running into the same problem!
Please help me to match information in order to return the correct code to Column A.....Column B (desc) contains information to be matched to column C (type) and then return Column D (code) to Column A....Column B is a description column and contains different information to describe type, but is all the same. Thank You for your Help!
Ex.
B C D
1 Motor Truck Sc Motor Truck Sc MTS
2 Truck Sc
3 MTS
Plsss help me, how can I lookup Apple3 & Orange4 value-
Apple1 80
Apple2 100
Apple3 90
Orange1 120
Orange2 220
Orange3 180
Orange4 160
Hi... I am working on pulling information from one tab containing several columns of numbers into a separate tab. I used the index function and it works great, but only for one instance of the "search" box. I'm using it to pull information from various events that have occurred at the arena in which I work. How would I adjust the formula to make it pull all of the events that have the same name? For example, Jimmy Buffett has performed multiple times here, but when I type "jimmy buffett" in my search cell, it only pulls data from one show, when he has has four shows here.
Request your help in below issue. Want to match the cell value in column but unable to do that. Please help me.
Column1 Column2
2133 GMA
2133 MCA
2133 MCA2
6488 USI
6488 GMA
7645 MCA2
7645 USI
6488 NOT
Column4 column5(GMA) Column6(MCA2) Column7(MCA)
2133
6488
7645
Request your help in creating the formula that can match the value against column4 from column2 and column2.
Sheet 1
Line# PO Qty Reciver
2 222000 10 A20535
6 222000 15 A20587
9 222000 20 A20687
Sheet 2
line# PO Receiver
2 222000 A20535 ;A20587;A20687 (Answer)
I need the answer by making formula in Sheet 2 as display above.
Please help
Here is a link to my spreadsheet on google drive - I was not sure how to post it here https://drive.google.com/file/d/1jfoMPEQQhsAA90tyv43K3p9FqF3LAyFv/view?usp=sharing
I have three columns of data that are plotted on a graph. You will see on the graph two arrows, and I would like excel to return the x axis values (frame number) for where these arrows point (heel strike). This should be more accurate and time effective than me doing it manually / visually.
Frame number for heel strike 1 is defined by the GRF data where it first meets or exceeds the threshold displayed in G9. Manually I can see this is frame number 80, but I want excel to return it to me. To find the frame number of heel strike 2 excel will now need to use a velocity threshold. So, based on the previous heel strike velocity value can excel find the next occurrence of this velocity value. Ideally the data point either side of this value should be greater to ensure it is heel strike, and not another point on the graph where the magnitude of velocity is similar. I have tried using the match and index formulas but haven’t got it work. I not sure if there are better functions to use than this.
I have a list of data (numbers). I want to find if any of them are greater than 9 and if so look in all columns to the right of it for values greater than 0 (looking for 2 more). There are 4 outcomes 1) no >9. 2) >9 But no >0. 3) >9 and 1 that is >0. 4) >9 and 2 that are >0. All with more than 2 would return the value if 2 were met.
What group of functions would I use to make this happen.
John:
Can you post a small example of your sheet with some sample data?