VLOOKUP Returning the Wrong Value? Here's Why
By ExcelReady TeamUpdated 6 min read
The short answer
VLOOKUP usually returns a wrong value because the fourth argument is missing, so it uses approximate match and grabs the nearest smaller value instead of an exact match. Add FALSE: =VLOOKUP(E2,A2:C7,3,FALSE). Other causes are duplicate lookup values, a wrong or outdated column number, an unlocked table range, and wildcard characters.
Key takeaways
- Leaving out the fourth argument means approximate match, which can return a wrong value with no error.
- With FALSE, a missing value gives #N/A, which is better than a silent wrong answer.
- VLOOKUP always returns the first match, so duplicate IDs hide later rows.
- The column number doesn't change when you insert columns; MATCH or XLOOKUP avoid this.
- Lock the table with $ signs before you fill a VLOOKUP down.
On this page+
- Why VLOOKUP returns a wrong value instead of an error
- Cause 1: the fourth argument is missing
- Cause 2: approximate match on unsorted data
- Cause 3: duplicate lookup values
- Cause 4: the wrong column number
- Cause 5: the table range moved when you copied the formula
- Cause 6: wildcards in the lookup value
- Practise it
VLOOKUP returning a wrong value is worse than an error, because nothing tells you it's wrong. In most cases, the formula is missing its fourth argument, so VLOOKUP does an approximate match and picks a nearby row. This guide explains the six reasons VLOOKUP is returning the wrong value and shows how to fix each one.
Why VLOOKUP returns a wrong value instead of an error#
VLOOKUP has four arguments, and the last one decides how it matches:
=VLOOKUP(lookup_value, table_array, col_index_num, [range_lookup])| range_lookup | Match type | If the value isn't found |
|---|---|---|
| FALSE (or 0) | Exact match | Returns #N/A |
| TRUE (or 1) | Approximate match | Returns the nearest smaller value |
| Left out | Approximate match | Returns the nearest smaller value |
The key point: leaving the fourth argument out is the same as TRUE. Approximate match is meant for tier tables, like tax bands or discount levels. On a list of IDs, it returns a value from a different row instead of telling you the ID is missing.
Check these causes in order:
- The fourth argument is missing or TRUE.
- Approximate match on unsorted data.
- Duplicate lookup values.
- The wrong column number, often after a column was inserted.
- The table range moved when the formula was copied.
- Wildcard characters in the lookup value.
Cause 1: the fourth argument is missing#
Here is a product list sorted by ID. There is no product 104:
| A | B | C | |
|---|---|---|---|
| 1 | ID | Product | Price |
| 2 | 101 | Chair | 120 |
| 3 | 102 | Shelf | 180 |
| 4 | 103 | Mouse | 25 |
| 5 | 105 | Desk | 250 |
| 6 | 106 | Lamp | 45 |
| 7 | 108 | Monitor | 210 |
This formula has no fourth argument:
=VLOOKUP(104,A2:C7,3)It returns 25, the price of the Mouse. VLOOKUP didn't find 104, so it stopped at the largest ID below it, 103, and returned that row's price. No error, wrong answer.
Add FALSE to force an exact match:
=VLOOKUP(104,A2:C7,3,FALSE)Now the result is #N/A, which correctly tells you product 104 doesn't exist. You can then handle it with =IFNA(VLOOKUP(104,A2:C7,3,FALSE),"Not found"). The article on TRUE vs FALSE in VLOOKUP explains the two modes side by side.
Cause 2: approximate match on unsorted data#
Approximate match only works when the first column is sorted from smallest to largest. It doesn't read every row. It jumps through the list, assuming it's in order. On unsorted data, it can stop at the wrong place and return a value from an unrelated row. The answer can even change if someone re-sorts the list.
If you meant to use approximate match, for example for commission tiers, sort the first column in ascending order (Data > Sort A to Z). If you didn't, add FALSE. The guide to VLOOKUP approximate match shows when TRUE is the right choice.
Cause 3: duplicate lookup values#
VLOOKUP returns the first match it finds and ignores the rest. If ID 102 appears twice, once for an old price and once for a new one, VLOOKUP always returns the first row.
Check for duplicates with COUNTIF. In a spare column, type =COUNTIF($A$2:$A$7,A2) and fill down. Any result above 1 is a duplicate. Remove the old rows, or use a more specific key, such as ID plus date. If you really need every match, FILTER can return all of them.
Cause 4: the wrong column number#
The third argument is a plain number that counts columns from the left edge of the table. If you count wrong, you get a value from the next column over. In the table above, Product is column 2 and Price is column 3.
It also goes wrong when someone inserts a column. Say you add a Category column between Product and Price. Excel stretches the range to A2:D7, but the 3 stays a 3, so the formula now returns the category instead of the price.
Make the column number follow the header with MATCH:
=VLOOKUP(E2,$A$2:$D$7,MATCH("Price",$A$1:$D$1,0),FALSE)MATCH finds "Price" in the header row and returns its position, so the formula keeps working after columns move. XLOOKUP and INDEX MATCH avoid column numbers completely. The VLOOKUP function guide lists every argument.
Cause 5: the table range moved when you copied the formula#
If the table range isn't locked, it shifts as you fill the formula down. In F2 you write =VLOOKUP(E2,A2:C7,3,FALSE). In F5, the copied formula reads =VLOOKUP(E5,A5:C10,3,FALSE). The first three products are no longer in the table. With FALSE you'd see #N/A, but with approximate match you'd get wrong values.
Lock the table with $ signs before you copy:
=VLOOKUP(E2,$A$2:$C$7,3,FALSE)Select the range inside the formula and press F4 to add the $ signs (Mac: ⌘T).
Cause 6: wildcards in the lookup value#
With FALSE, VLOOKUP treats * and ? in the lookup value as wildcards. A wildcard stands for other characters: * for any number of characters, ? for exactly one. So looking up the code "A*" matches the first code that starts with A, not the literal text A*.
If your codes really contain * or ?, put a tilde in front to make them literal: look up "A~*" instead. You can do that with a formula: =VLOOKUP(SUBSTITUTE(E2,"*","~*"),$A$2:$C$7,3,FALSE).
If the problem isn't a wrong value but an error like #N/A, see why VLOOKUP is not working for spaces, text numbers and other causes. For job tests, the VLOOKUP interview questions cover these same traps.
Practise it#
Practise approximate and exact match VLOOKUP in a live spreadsheet: you'll see exactly when TRUE is right and when it returns the wrong row. Then fix broken lookups in the lookup errors lesson, where each formula is checked instantly. Or try the exercise on this page first.
Try it yourself
This is a live spreadsheet. Type the formula in the green cell and press Enter.
The ID list in A2:A7 isn't sorted. Click F2 and look up the price for the ID in E2 with VLOOKUP, using FALSE for an exact match. Press Enter.
| A | B | C | D | E | F | G | |
|---|---|---|---|---|---|---|---|
| 1 | Price | Price | |||||
| 2 | |||||||
| 3 | |||||||
| 4 | |||||||
| 5 | |||||||
| 6 | |||||||
| 7 | |||||||
| 8 | |||||||
| 9 | |||||||
| 10 |
Tip: Four parts: what to find, the table, the column number (Price is column 3), and FALSE.
Practise this in a lesson
Frequently asked questions
Why is my VLOOKUP returning the wrong value?
Most often the fourth argument is missing or TRUE, so VLOOKUP uses approximate match. Add FALSE as the fourth argument to force an exact match.
Why does VLOOKUP return a value from the wrong row?
Approximate match on data that isn't sorted, or duplicate lookup values, are the usual reasons. VLOOKUP returns the first match it finds, so check for repeated IDs.
Why does VLOOKUP return the wrong column after inserting a column?
The column number is a fixed number, so it doesn't move when the table changes. Use MATCH to find the column number from the header, or switch to XLOOKUP or INDEX MATCH.
Why does my VLOOKUP work in the first row but not when I copy it down?
The table range wasn't locked, so it shifted down as you copied. Use absolute references like $A$2:$C$7 for the table.