How to return a value if lookup value is in a range
In this article, I will demonstrate four different formulas that allow you to lookup a value that is to be found in a given range and return the corresponding value on the same row. If you need to return multiple values because the ranges overlap then read this article: Return multiple values if in range.
What's on this page
They all have their pros and cons and I will discuss those in great detail, they can be applied to not only numerical ranges but also text ranges and date ranges as well.
I have made a video that explains the LOOKUP function in context to this article, if you are interested.
There is a file for you to get, at the end of this article, which contains all the formula examples in a worksheet each.
You can use the techniques described in this article to calculate discount percentages based on price intervals or linear results based on the lookup value.
Check out the LOOKUP category to find more interesting articles.
The following table shows the differences between the formulas presented in this article.
Formula | Range sorted? | Array formula | Get value from any column? | Two range columns? |
LOOKUP | Yes | No | Yes | No |
INDEX + SUMPRODUCT + ROW | No | No | Yes | Yes |
VLOOKUP | Yes | No | No | No |
INDEX + MATCH | Yes | No | Yes | No |
Some formulas require you to have the lookup range sorted to function properly, the INDEX+SUMPRODUCT+ROW alternative is the only way to go if you can't sort the values.
The disadvantage with the INDEX+SUMPRODUCT+ROW formula is that you need start and end values, the other formulas use the start values also as end range values.
The VLOOKUP function can only search the leftmost column, you must rearrange your table to meet this condition if you are going to use the VLOOKUP function.
1. If value in range then return value - LOOKUP function
To better demonstrate the LOOKUP function I am going to answer the following question.
Hi,
What type of formula could be used if you weren't using a date range and your data was not concatenated?
ie: Input Value 1.78 should return a Value of B as it is between the values in Range1 and Range2
Range1 Range2 Value
1.33 1.66 A
1.67 1.99 B
2.00 2.33 C
The next image shows the table in greater detail.
The picture above shows data in cell range B3:C5, the search value is in C7 and the result is in C9.
Cell range B3:B5 must be sorted in ascending order for the LOOKUP function to work properly.
If an exact match is not found the largest value is returned as long as it is smaller than the lookup value.
The LOOKUP function then returns a value in a column on the same row.
The formula in cell C9:
Example, Search value 1.71 has no exact match, the largest value that is smaller than 1.71 is 1.67. The returning value is found in column C on the same row as 1.67, in this case, B.
If the search value is smaller than the smallest value in the lookup range the function returns #N/A meaning Not Available or does not exist.
Example in the picture to the right, search value is 1 in the and the LOOKUP function returns #N/A.
To solve this problem simply add another number, for example 0. Cell range B3:B6 would then contain 0, 1.33, 1.67, 2.
A search value greater than the largest value in the lookup range matches the largest value. Example in above picture, search value is 3 and the returning value is C.
Watch video below to see how the LOOKUP function works:
Learn more about the LOOKUP function, recommended reading:
Recommended articles
Finds a value in a sorted cell range and returns a value on the same row.
Tip! - You can quickly sort a cell range, follow these steps:
- Press with right mouse button on on a cell in the cell range you want to sort
- Hover with mouse cursor over Sort
- Press with mouse on "Sort Smallest to Largest"
2. If the value is in the range then return value - INDEX + SUMPRODUCT + ROW
The following formula is slightly larger but you don't need to sort cell range B4:B6.
The formula in cell C11:
The ranges don't need to be sorted however you need a start (Range1) and an end value (Range2).
Explaining formula in cell C11
You can easily follow along, go to tab "Formulas" and press with left mouse button on "Evaluate Formula" button. Press with left mouse button on "Evaluate" button to move to next step.
Step 1 - Calculate first condition
The bolded part is the the logical expression I am going to explain in this step.
=INDEX(D4:D6, SUMPRODUCT(--($D$8<=C4:C6), --($D$8>=B4:B6), ROW(A1:A3)))
Logical operators
= equal sign
> less than sign
< greater than sign
The gretaer than sign combined with the equal sign <= means if value in cell D8 is smaller than or equal to the values in cell range C4:C6.
--($D$8<=C4:C6)
becomes
--(1,78<={1,66;1,99;2,33})
becomes
--{1,78<=1,66; 1,78<=1,99; 1,78<=2,33})
becomes
--({FALSE;TRUE;TRUE})
and returns {0;1;1}.
The double minus signs convert the boolean value TRUE or FALSE to the corresponding number 1 or 0 (zero).
Step 2 - Calculate second criterion
=INDEX(D4:D6, SUMPRODUCT(--($D$8<=C4:C6), --($D$8>=B4:B6), ROW(A1:A3)))
--($D$8>=B4:B6)
becomes
--(1,78>={1,33;1,67;2})
becomes
--({TRUE;TRUE;FALSE})
and returns
{1;1;0}
Step 3 - Create row numbers
=INDEX(D4:D6, SUMPRODUCT(--($D$8<=C4:C6), --($D$8>=B4:B6), ROW(A1:A3)))
ROW(A1:A3)
returns
{1;2;3}
Step 4 - Multiply criteria and row numbers and sum values
=INDEX(D4:D6, SUMPRODUCT(--($D$8<=C4:C6), --($D$8>=B4:B6), ROW(A1:A3)))
SUMPRODUCT(--($D$8<=C4:C6), --($D$8>=B4:B6), ROW(A1:A3))
becomes
SUMPRODUCT({0;1;1}, {1;1;0}, {1;2;3})
becomes
SUMPRODUCT({0;2;0})
and returns number 2.
Step 5 - Return a value of the cell at the intersection of a particular row and column
=INDEX(D4:D6, SUMPRODUCT(--($D$8<=C4:C6), --($D$8>=B4:B6), ROW(A1:A3)))
becomes
=INDEX(D4:D6, 2)
becomes
=INDEX({"A";"B";"C"}, 2)
and returns "B".
Functions in this formula: INDEX, SUMPRODUCT, ROW
3. If value in range then return value - VLOOKUP function
The VLOOKUP function requires the table to be sorted based on range1 in an ascending order.
Explaining the VLOOKUP formula in cell C10
The VLOOKUP function looks for a value in the leftmost column of a table and then returns a value in the same row from a column you specify.
VLOOKUP(
lookup_value,
table_array,
col_index_num, [range_lookup]
)
The [range_lookup] argument is important in this case, it determines how the VLOOKUP function matches the lookup_value in the table_array.
The [range_lookup] is optional, it is either TRUE (default) or FALSE. It must be TRUE in our example here so that VLOOKUP returns an approximate match.
In order to do an approximate match the table_array must be sorted in an ascending order based on the first column.
=VLOOKUP($D$8,$B$4:$D$6,3,TRUE)
becomes
=VLOOKUP(1,78,{1,33, 1,66, "A";1,67, 1,99, "B";2, 2,33, "C"},3,TRUE)
1,67 is the next largest value and the VLOOKUP function returns "B".
4. If value in range then return value - INDEX + MATCH
Formula in cell C10:
The lookup range must be sorted, just like the LOOKUP and VLOOKUP functions. Functions in this formula: INDEX and MATCH
Thanks JP!
Explaining INDEX+MATCH in cell D10
=INDEX($D$4:$D$6,MATCH(D8,$B$4:$B$6,1))
Step 1 - Return the relative position of an item in an array
The MATCH function returns the relative position of an item in an array or cell range that matches a specified value
MATCH(
lookup_value,
lookup_array,
[match_type])
)
The [match_type] argument is optional. It can be either -1, 0, or 1. 1 is default value if omitted.
The match_type argument determines how the MATCH function matches the lookup_value with values in lookup_array.
We want it to do an approximate search so I am going to use 1 as the argument.
This will make the MATCH find the largest value that is less than or equal to lookup_value. However, the values in the lookup_array argument must be sorted in an ascending order.
To learn more about the [match_type] argument read the article about the MATCH function.
=INDEX($D$4:$D$6,MATCH(D8,$B$4:$B$6,1))
MATCH(D8,$B$4:$B$6,1)
becomes
MATCH(1.78,{1.33;1.67;2},1)
1.67 is the largest value that is less than or equal to lookup_value. 1.67 is the second value in the array. MATCH function returns 2.
Step 2 - Return a value of the cell at the intersection of a particular row and column
=INDEX($D$4:$D$6,MATCH(D8,$B$4:$B$6,1))
becomes
=INDEX($D$4:$D$6,2)
becomes
=INDEX({"A";"B";"C"},2)
and returns "B".
Back to top
Quickly lookup a value in a numerical range
You can also do lookups in date ranges, dates in Excel are actually numbers.
More than 1300 Excel formulasExcel categories
27 Responses to “How to return a value if lookup value is in a range”
Leave a Reply
How to comment
How to add a formula to your comment
<code>Insert your formula here.</code>
Convert less than and larger than signs
Use html character entities instead of less than and larger than signs.
< becomes < and > becomes >
How to add VBA code to your comment
[vb 1="vbnet" language=","]
Put your VBA code here.
[/vb]
How to add a picture to your comment:
Upload picture to postimage.org or imgur
Paste image link to your comment.
Great post, Oscar. There are simpler formulas to do this, though.
=VLOOKUP($D$8,$B$4:$D$6,3,TRUE)
or
=INDEX($D$4:$D$6,MATCH(D8,$B$4:$B$6,1))
will also return B.
Thumbs up!!
I guess the columns must be sorted ascending in order for the formulas to work properly.
Thanks for your contribution!
[...] Return value if in range in excel, Oscar shows us a formula for returning values in a column based on a number range. Let's review [...]
happened upon this while calulating rating scores for timed surgical evaluation... needed formula to output score based upon time ranges... "formula in cell D10" worked perfectly! Thanks SO much!!!!
~charmain~,
I am happy you found it useful!
I am looking at a way to create a Bring Forward system witht the dates of the calendar.
It would be the first wednesday of the year like 2012-01-04 to 2012-01-18 would return the value of 1, and 2012-01-19 to 2012-02-01 would return the value of 2, etc...
Hi Oscar,
I came across this amazing formula when i was trying get a value return in a range:
INDEX(D4:D6, SUMPRODUCT(--($D$8=B4:B6), ROW(A1:A3))) + ENTER
But could not understand the usage of "--" in the sumproduct and also the logic behind using sumproduct itself.
Could you please help me to understand
Logical function (i.e. =46) you will always get numeric value 0. You can not convert FALSE to anything else other than numeric value 0.
It is not common to use more than two dashes since it can mess up your TRUE result (i.e. =---------------(TRUE) will return numeric value -1)
Logical function (i.e. =4 is less than 6) will return TRUE or FALSE value.
If you add one dash (-) in front of this logical function the result is the opposite (negative) value in numeric form; in this case result is -1
So if you add two dashes (--) in front of this logical function - the result is the opposite of the opposite (negative of the negative) in numeric form; in this case result is 1
The whole point is to easily convert result TRUE to numeric value 1, or convert result FALSE to numeric value 0.
p.s. of course, if you add as many dashes in front of logical function which results FALSE (i.e. =4 is more than 6) you will always get numeric value 0. You can not convert FALSE to anything else other than numeric value 0.
It is not common to use more than two dashes since it can mess up your TRUE result (i.e. =---------------(TRUE) will return numeric value -1)
Brilliant solution
I'm using the first formulation, but it assumes that the value fits between exactly 1 of the ranges. If it fits none, it returns the same value (which is not a big problem). If it fits on several ranges, it returns an error.
How do get it to provide at least one of the possible ranges instead of an error when there are several possible ranges?
Thanks!
Karl,
Array formula:
Attached file:
Return-value-if-in-range-karl.xls
Good day sir.
=INDEX(Calculate!D2:D6,SUMPRODUCT(--(Calculate!$D$9=B2:B6),ROW(Calculate!A1:A5)))
As you can see, I'm trying to put the formula to another sheet. Unfortunately I'm getting #value error.
Please advice, thank you.
Maybe oversimplifying it but wouldn't this solve your vlookup problem?
https://www.excelvlookuphelp.com/how-do-i-use-a-vlookup-where-the-range_lookup-is-true-rather-than-looking-for-an-exact-value-looking-for-a-range/
I have been searching for such formula...
May i know hot to do if value columns are more than one like Value-I, Value-II,Value-III and inputs are number and value type
Data is Range-I|Range-II|Value-I|Value-II|Value-III
Inputs are Number|Value-I
A formula which matches range of numberical input and match value type and copies the intersecting value...
To be simple two way lookup.
Hi
What if I want to use the same formula, but to change the range of the two columns B and C to be date range (07/01/2006 , 06/30/2007), and to change the value of column D to be a percentage (%450)
How can I use this formula please?
Alternatively this formula can also be applied:-
=LOOKUP(2,1/(($A$1:$A$3=F2)),$C$1:$C$3)
The first '2' represents the number of column to be searched for.
the expression '1/' represents the column number in the array.
'*' represents AND command.
The command will check the condition of whether F2 is greater than or equal to the values mentioned in the column 1. and then checks the condition that F2 is less than the value mentioned in the column 2 in the same row. Then displays the value corresponding to the same row in the column C.
Thank you all
It worked
I mean this: "=VLOOKUP($D$8,$B$4:$D$6,3,TRUE)"
I think it was the best solution
Hi All
I need some help to add rows to a spreadsheet based on the input of the user.
I ask the user to input the number of rows they need to add by inputting the value into a cell k6. Ideally I'd like them to press a nacro button which would the add the specified number of rows below row 8, keeping the same formulas in E8, G8, H8 and I8.
Can anyone assist?
ian
Hi Ian,
I made a workbook for you:
https://www.get-digital-help.com/wp-content/uploads/2010/01/Ian-inset-rows.xlsm
I continue to get #NAME? result using the first formula
My formula is:
=INDEX(F77:F80, SUMPRODUCT(--($D$83=D77:D80), ROW(A1:A4))) + ENTER
$D$83 is the Weight of a product, in numerical format.
Where F77:F80 is a list of prices (based on weight breaks)
D77:D80 is the min weight in a weight range
E77:E80 is the max weight in a weight range
As example of what would be in D77:F80
200,000 | 299,999 | 14.05
300,000 | 349,999 | 13.10
400,000 | 449,999 | 15.60
350,000 | 399,999 | 13.50
IF D83 is 330,327.
The result should be 13.10
Any advice?
I'm trying to create a formula in 4 different cells ”G3 – G6”, to search a column “B3 – B32” (ie: 4/1/17 – 4/30/17) filled w/dates and add a value from column “C3 – C32” if the date falls between the specified date range (ie: cell G3 reads column "B" for dates between 4/1-4/7, cell G4 reads column "B" for dates between 4/8-4/14, cell G5 reads column "B" for dates between 4/15-4/21 & cell G6 reads column "B" for dates between 4/22-4/30).
Hi. Can you please help me. I already have the IF formula where i want to generate a specific value from a column if between two dates.
Example:
Column A1 Start Date, Column B1 End Date, Column C1 Headcount
Data in 2nd row: Start date Jan. 1, 2014 up to Jan.31, 2015, headcount of 7.
FOrmula in Column D2:
=IF(AND(D1>=A2, D1 <= B2, C2, "")
The formula is working fine but the problem is when there is blank or no date in End date column, no value is returned. I would like to return the value in C2 whether there is end date or not. I would like to make use of one formula only that will work whether the End date has data or not.
Your help is very much appreciated. Thanks
JD,
Try this formula:
=IF((D1>=A2)*(D1<=B2)+(D1=""), C2, "")
great , this article is and excel file was the exact help i was looking for thanks for this brilliant article
Hi Oscar
I have two columns of numbers one is lower and one is higher. I have a third column with single numbers. I want to see if the third number is within the range of the two columns. If it is I just want it to say true. But I want check all of the ranges not just the ones across from them.
Any help would be very appreciated.