IFERROR vs IFNA: hide #N/A without hiding real bugs
A lookup miss is #N/A. A deleted reference is #REF!. A zero divisor is #DIV/0!. IFERROR treats those as the same blank. IFNA does not. If you wrap first and read later, a broken index looks like “not found.”
This page is the wrapper comparison. For what #N/A itself means, start at what #N/A means. Do not wrap a miss you have not confirmed.
Recreate it on a blank sheet
Section titled “Recreate it on a blank sheet”- Open a blank spreadsheet. In A1 type
sku, B1name. A2101, B2Widget. D1lookup. D2999— that sku is not in column A. - In E1 type
na. In E2 enter=VLOOKUP(D2,A2:B2,2,FALSE). The cell shows#N/A. That is a real miss. - In F1 type
ref. In F2 enter=VLOOKUP(A2,A2:B2,3,FALSE). The cell shows#REF!. Sku101is on the sheet. Index 3 is past a two-column range. See VLOOKUP bad index. Use a key that exists so this cell cannot be mistaken for#N/A. - In G1 type
div. In G2 type0. In G3 enter=1/G2. The cell shows#DIV/0!. See divide by zero.
You now have three different errors on one sheet. Leave them broken.
IFERROR on all three. In E5 type iferror. In E6 enter =IFERROR(VLOOKUP(D2,A2:B2,2,FALSE),"none"). The cell shows none. In F6 enter =IFERROR(VLOOKUP(A2,A2:B2,3,FALSE),"none"). The cell shows none. In G6 enter =IFERROR(1/G2,"none"). The cell shows none. The miss, the bad index, and the divide all look identical.
IFNA on all three. In E8 type ifna. In E9 enter =IFNA(VLOOKUP(D2,A2:B2,2,FALSE),"none"). The cell shows none. In F9 enter =IFNA(VLOOKUP(A2,A2:B2,3,FALSE),"none"). The cell is still #REF!. In G9 enter =IFNA(1/G2,"none"). The cell is still #DIV/0!. Only the lookup miss became none.
What is actually wrong
Section titled “What is actually wrong”IFERROR(value, fallback)replaces any error with the fallback:#N/A,#REF!,#DIV/0!,#VALUE!,#NAME?,#NUM!, and a parse#ERROR!.IFNA(value, fallback)replaces only#N/A. Every other error stays in the cell.- A dashboard that should say “no sku” used
IFERRORand now also says “no sku” when someone deletes a column, typesVLOKUP, or divides by a blank. That is the bug this page exists for. IFERRORaroundIMPORTRANGEwill hide the Allow access#REF!the same way. That prompt is not a missing row. See IMPORTRANGE access. Click Allow access. Do not wrap that#REF!.
Confirm the miss before you wrap. Type 101 in D2. E2 becomes Widget. Put 999 back. If changing the lookup value makes #N/A come and go, the function is working and the key is absent — or the key does not actually match. Number vs text and a trailing space are still #N/A; those are VLOOKUP no match, not a reason to switch to IFERROR.
#NAME? is a misspelled function. IFERROR would print none for =VLOKUP(...). See unknown function. Fix the name.
Leave E2, F2, and G3 as the raw errors. Leave the IFERROR row in place so you can compare.
Lookups: IFNA. Keep E9: =IFNA(VLOOKUP(D2,A2:B2,2,FALSE),"none") returns none for 999 and still surfaces F9 #REF! if you copy the wrapper onto a bad index. That is the point.
When no match is not a valid result. Do not wrap. Fix the key, the range, or the table. What #N/A means is the confirm-then-fix page.
XLOOKUP already has a miss argument. The fourth argument (missing_value in Sheets; Excel callers know it as if_not_found) returns your fallback on #N/A only, same idea as IFNA. It does not swallow #REF! from a broken range. See XLOOKUP vs VLOOKUP. You do not need IFERROR around that.
Use IFERROR only when every error should look the same. A cell that should be blank whenever the input is unusable — any error, no distinction — is the case for IFERROR. A lookup column is not that case.
Do not wrap first. Read the raw error. If it is #N/A and a miss is allowed, IFNA. If it is anything else, fix that error.