## 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 download, 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.

### 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:

How to use the LOOKUP function

Finds a value in a sorted cell range and returns a value on the same row.

How to use the LOOKUP function

#### Tip! - You can quickly sort a cell range, follow these steps:

- Right-click on a cell in the cell range you want to sort

- Hover with mouse cursor over Sort
- Click on "Sort Smallest to Largest"

### 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 click "Evaluate Formula" button. Click "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

**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.

**Arguments:**

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".

### 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

**Arguments:**

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".

### Download Excel file

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.

5 easy ways to extract Unique Distinct Values

First, let me explain the difference between unique values and unique distinct values, it is important you know the difference […]

Find last matching value in an unsorted list

I read an interesting blog post Find Last Item in Group With Index Match written by Debra Dalgleish. It is about […]

The formula in cell D3 lets you get the last value in column B, it works fine with blank cells […]

Find last matching value in an unsorted table

DonW asks: Ok, you've shown it for regular ranges....how about within tables. I have a table similar to: ID Name […]

How to use VLOOKUP with multiple conditions

I will in this article demonstrate how to use the VLOOKUP function with multiple conditions. The function was not built […]

VLOOKUP of three columns to pull a single record

Question: Does anyone know how to do a VLOOKUP of three columns to pull a single record? Answer: Array formula in […]

Have you ever tried to build a formula to calculate discounts depending on price? The VLOOKUP function is much easier to […]

How to use the VLOOKUP function

The VLOOKUP function lets you search the leftmost column for a value and return another value on the same row […]

### 25 Responses to “How to return a value if lookup value is in a range”

### Leave a Reply to ~charmain~

### 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.

**Contact Oscar**

You can contact me through this contact form

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, "")