VLOOKUP (CERCA.VERT) che restituisce valori errati è uno dei problemi più comuni in Excel, specie quando si lavora tra file diversi. In questa guida pratica vediamo perché accade, come correggerlo nell’immediato e quali alternative moderne usare per rendere la ricerca stabile e a prova di errore.
Panoramica del problema
Scenario reale: un utente imposta una formula VLOOKUP
tra due file Excel per recuperare, da un intervallo di 2 910 righe (A:K
), il valore corrispondente a un codice univoco. Il risultato risulta errato oppure vuoto. Il record cercato esiste, ma la formula non lo intercetta correttamente.
La causa principale è quasi sempre una combinazione di due fattori: ricerca approssimata attivata “di nascosto” e indice di colonna incoerente. Di seguito vediamo in dettaglio come riconoscerli e intervenire.
Perché succede: cause più comuni
Fattore | Descrizione | Effetto |
---|---|---|
4° argomento omesso | Se l’argomento range_lookup non viene specificato, Excel assume TRUE (o 1 ) → ricerca approssimata. Questa modalità presuppone che la prima colonna della tabella sia ordinata in ordine crescente. | Con dati non ordinati, Excel si ferma prima dell’esatta corrispondenza e restituisce il valore “più vicino”, spesso sbagliato. |
Indice di colonna errato | Il valore richiesto si trova in colonna G (7ª colonna), ma l’indice passato alla funzione era 6 o 8 in alcuni tentativi. | VLOOKUP preleva i dati dalla colonna sbagliata oppure restituisce 0 se la cella risultante è vuota. |
Altri fattori che possono generare risultati errati
Tema | Dettaglio | Conseguenza |
---|---|---|
Differenze di formato | Codice cercato come numero nel file A e come testo nel file B (o viceversa). | La corrispondenza esatta fallisce: #N/D o risultato sbagliato. |
Spazi o caratteri invisibili | Spazi iniziali/finali, caratteri non stampabili (es. CHAR(160) NBSP da import web). | Valori apparentemente identici non coincidono. |
Duplicati del codice | La chiave che si presume “univoca” è presente più volte. | VLOOKUP restituisce il primo match; i successivi sono ignorati. |
Colonna di ricerca errata | La chiave non è nella prima colonna del range passato a VLOOKUP . | La funzione non può “cercare a sinistra”; serve ridefinire il range o usare alternative. |
Intervallo non bloccato | Mancano i riferimenti assoluti ($ ) e, copiando la formula, il range “scivola”. | La formula punta a righe/colonne sbagliate e ritorna valori casuali. |
Link esterni instabili | File di origine spostato/rinominato o link non aggiornato. | Dati non aggiornati o errori di collegamento. |
Soluzioni rapide e affidabili
Forzare la ricerca esatta
Impostare il 4° argomento di VLOOKUP
a 0
(o FALSE
) elimina il comportamento “approssimato” e rende l’abbinamento esatto anche se la colonna non è ordinata.
=VLOOKUP(A2,
'[Historical Sales Report 04‑29‑2024 (After Import).xlsx]Sheet1'!$A$1:$K$2910,
7, -- colonna G
0) -- oppure FALSE
Con 0
/FALSE
Excel cerca solo corrispondenze esatte e non richiede l’ordinamento preventivo del dataset.
Controllare e correggere l’indice di colonna
- Contare le colonne a partire dalla prima del range (
table_array
). - Aggiornare il terzo parametro (
colindexnum
) di conseguenza; nel caso illustrato deve essere 7 (colonna G).
Buone pratiche fondamentali
Tema | Spiegazione sintetica |
---|---|
Bloccare intervalli | Usare riferimenti assoluti $A$1:$K$2910 per evitare errori in copia/incolla. |
Gestire errori | Racchiudere la formula in IFERROR() per messaggi più chiari al posto di #N/D . |
Alternative moderne | XLOOKUP() (Office 2021 / Microsoft 365) elimina l’indice di colonna e, per impostazione predefinita, usa la ricerca esatta. |
Dati “sporchi” | Verificare spazi e formati (numero ↔ testo) che impediscono la corrispondenza. |
Checklist di diagnostica passo‑passo
- Conferma del 4° argomento: apri la cella della formula e verifica che il 4° parametro sia
0
/FALSE
. Se manca, aggiungilo. - Indice di colonna: riconta le colonne del range e imposta il terzo argomento su 7 (colonna G) per il tuo caso.
- Range bloccato: verifica la presenza dei
$
in$A$1:$K$2910
. - Chiave nella prima colonna: il codice deve trovarsi nella colonna A del range passato. In caso contrario, ridisegna il range o usa
INDEX/MATCH
oXLOOKUP
. - Formati coerenti: controlla che la chiave in entrambi i file sia tutta numero o tutta testo. Evita commistioni.
- Spazi e caratteri invisibili: usa formule di pulizia (vedi sotto) se il confronto fallisce senza motivo apparente.
- Duplicati: verifica se la chiave è davvero univoca (usa
COUNTIF
oUNIQUE
). - Link esterni: se stai puntando a un altro file, aprilo e assicurati che i collegamenti siano aggiornati.
- Valori vuoti vs zeri: se ottieni
0
al posto di vuoto, gestisci l’output (vedi sezione “Zero vs vuoto”).
Rendere i dati confrontabili: tipi e pulizia
Allineare numeri e testi
Se nel file A il codice è numerico e nel file B è testo (o viceversa), VLOOKUP
con match esatto non troverà nulla. Puoi forzare la coerenza in due modi:
- Forzare a numero (es. in colonna di lookup):
--A2
oppureVALUE(A2)
- Forzare a testo (preservando eventuali zeri iniziali):
TEXT(A2,"0")
o concatenare una stringa vuota:""&A2
Esempio di ricerca esatta con coercizione a numero sul termine da cercare:
=VLOOKUP(--A2, '[Historical...]Sheet1'!$A$1:$K$2910, 7, 0)
Rimuovere spazi e caratteri non stampabili
Gli spazi finali/iniziali o il carattere NBSP (CHAR(160)
) importato dal web sono micidiali. Pulisci la colonna chiave su entrambe le parti con:
=TRIM(CLEAN(SUBSTITUTE(A2,CHAR(160),"")))
Usa la colonna “pulita” come chiave per la ricerca. In alternativa, crea una colonna di appoggio nel file sorgente con la stessa funzione di pulizia e punta a quella.
Gestione degli errori e messaggi chiari
Per evitare che #N/D
o altri errori disturbino l’utente finale, incapsula la formula con IFERROR
(o IFNA
):
=IFERROR(
VLOOKUP(A2, '[Historical...]Sheet1'!$A$1:$K$2910, 7, 0),
"Codice non trovato"
)
Duplicati: cosa restituisce VLOOKUP e come gestirli
VLOOKUP
restituisce la prima occorrenza trovata (scorrendo dall’alto verso il basso). Se sospetti duplicati nella colonna chiave:
- Conta i duplicati:
=COUNTIF(A:A, A2)
- Se vuoi l’ultimo match, con
XLOOKUP
puoi usare[search_mode]
inverso:
=XLOOKUP(A2, Chiavi, Valori, "", 0, -1)
Se invece hai bisogno di tutte le corrispondenze (non solo la prima), in Microsoft 365 puoi usare FILTER
:
=FILTER(Valori, Chiavi=A2, "Nessuna corrispondenza")
Alternative più robuste a VLOOKUP
XLOOKUP (CERCA.X)
XLOOKUP
è la soluzione moderna e consigliata: non richiede l’indice di colonna, effettua di default la ricerca esatta, gestisce se non trovato in un argomento dedicato e può cercare anche “a sinistra”.
=XLOOKUP(
A2,
'[Historical Sales Report 04‑29‑2024 (After Import).xlsx]Sheet1'!$A$1:$A$2910,
'[Historical Sales Report 04‑29‑2024 (After Import).xlsx]Sheet1'!$G$1:$G$2910,
"Codice non trovato", -- se non trovato
0, -- match esatto
1 -- cerca dall'alto
)
Vantaggi:
- Nessun
colindexnum
da calcolare. - Ricerca bidirezionale (anche verso sinistra).
- Gestione elegante dei “non trovati”.
INDEX + MATCH (INDICE + CONFRONTA)
Classico e flessibile, ottimo dove XLOOKUP
non è disponibile:
=INDEX(
'[Historical...]Sheet1'!$G$1:$G$2910,
MATCH(A2, '[Historical...]Sheet1'!$A$1:$A$2910, 0)
)
Con INDEX/MATCH
non dipendi dalla posizione delle colonne e puoi cercare a sinistra senza “trucchi”.
Riferimenti strutturati con Tabelle Excel
Trasforma l’intervallo in una Tabella (Ctrl+T), rinominala (es. tblSales
) e usa riferimenti leggibili:
=XLOOKUP([@Codice], tblSales[Codice], tblSales[ColonnaG], "Non trovato")
Così eviti errori quando il range cresce: le Tabelle si espandono automaticamente e le formule restano stabili.
Quando ti serve un “left lookup” con VLOOKUP
Se vuoi restare su VLOOKUP
ma devi leggere una colonna a sinistra della chiave, puoi costruire un array con CHOOSE
:
=VLOOKUP(A2, CHOOSE({1,2}, RangeChiave, RangeValori), 2, 0)
Attenzione: nelle versioni precedenti a Microsoft 365 questa tecnica poteva richiedere l’immissione come formula matrice (Ctrl+Maiusc+Invio).
Zero vs vuoto: capire l’output
Se la colonna di destinazione contiene celle vuote, VLOOKUP
può restituire 0
(a seconda del formato e del contesto). Per mostrare una stringa vuota al posto di 0:
=IFERROR(
LET(r, VLOOKUP(A2, '[Historical...]Sheet1'!$A$1:$K$2910, 7, 0),
IF(r=0, "", r)
),
"Codice non trovato"
)
Ottimizzazione e performance
- Con 2 910 righe la differenza è minima, ma su dataset grandi
XLOOKUP
eINDEX/MATCH
con match esatto tendono a scalare meglio. - Preferisci Tabelle Excel nominate o Named Range: migliorano leggibilità e riducono i refusi.
- Evita di includere più colonne del necessario: se ti serve solo
A
eG
, limita il range a quelle due colonne.
Debug efficace: come verificare velocemente
- Test di presenza:
=COUNTIF('[Historical...]Sheet1'!$A:$A, A2)
→ se 0, il codice non esiste (o è “sporco”). - Confronto di tipo:
=ISTEXT(A2)
e=ISNUMBER(A2)
sui due file per assicurarti che coincidano. - Verifica spazi:
=LEN(A2)
vs=LEN(TRIM(A2))
. Se la lunghezza si riduce, c’erano spazi. - Individua NBSP:
=CODE(MID(A2,1,1))
o usaSUBSTITUTE(A2,CHAR(160),"")
. - Valuta formula: scheda Formule → Valuta formula per seguire il calcolo passo‑passo.
Esempi pronti per l’uso
VLOOKUP corretto, esatto, con gestione errori
=IFERROR(
VLOOKUP(A2,
'[Historical Sales Report 04‑29‑2024 (After Import).xlsx]Sheet1'!$A$1:$K$2910,
7,
0),
"Codice non trovato"
)
INDEX/MATCH equivalente
=IFERROR(
INDEX('[Historical...]Sheet1'!$G$1:$G$2910,
MATCH(A2, '[Historical...]Sheet1'!$A$1:$A$2910, 0)),
"Codice non trovato"
)
XLOOKUP con “se non trovato”
=XLOOKUP(
A2,
'[Historical...]Sheet1'!$A$1:$A$2910,
'[Historical...]Sheet1'!$G$1:$G$2910,
"Codice non trovato", 0
)
Best practice quando lavori tra file diversi
- Percorsi stabili: evita di spostare/rinominare il file sorgente. Se accade, aggiorna i collegamenti (scheda Dati → Modifica collegamenti).
- File aperti durante la diagnostica: aprire entrambi i file aiuta ad aggiornare i collegamenti e a scoprire subito eventuali discrepanze.
- Coerenza dei nomi dei fogli: assicurati che il riferimento a
Sheet1
sia corretto in ogni formula. - Riduci l’intervallo: se possibile punta solo alle colonne interessate per evitare letture inutili.
Organizzare il dataset per evitare nuovi errori
- Rendi davvero univoca la chiave: se serve, crea una chiave composta (es.
=TEXT(Cod,"000000")&"|"&Anno
) e usa quella per la ricerca. - Convalida dati: imposta Data Validation per i codici inseriti manualmente, così eviti refusi.
- Uniforma i formati alla fonte: se importi da CSV, imposta il tipo colonna corretto (Testo per codici con zeri iniziali).
- Colonne di servizio: mantieni nel file sorgente una colonna “pulita” con
TRIM/CLEAN/SUBSTITUTE
e usa solo quella per le ricerche.
Risultato atteso dopo la correzione
Dopo avere inserito il quarto argomento (range_lookup = 0/FALSE
) e corretto l’indice di colonna a 7, la formula inizia a restituire il valore atteso per ciascun codice senza ulteriori anomalie. In aggiunta, bloccando gli intervalli con $
e gestendo gli errori con IFERROR
, l’operatività diventa stabile e l’utente finale vede risultati puliti.
Quando sostituire VLOOKUP
Per analisi su tabelle molto grandi o non strutturate conviene sostituire VLOOKUP
con INDEX/MATCH
o, meglio ancora, con XLOOKUP
, che sono più flessibili, leggibili e performanti, specialmente in contesti multi‑file e in presenza di evoluzioni del dataset.
FAQ rapide
VLOOKUP funziona solo con dati ordinati?
No, ma devi impostare il 4° argomento a 0/FALSE
. Se lo ometti (default TRUE
), i dati devono essere ordinati e l’esito può essere sbagliato.
Perché vedo uno zero invece del valore?
Probabilmente la cella di destinazione è vuota. Gestisci l’output con IF
o usa XLOOKUP
impostando se non trovato e controlli mirati.
Posso cercare a sinistra con VLOOKUP?
Non nativamente. Usa INDEX/MATCH
, XLOOKUP
o il trucco CHOOSE
mostrato sopra.
VLOOKUP è case‑sensitive?
No. Se ti serve distinzione tra maiuscole/minuscole, combina INDEX
con MATCH(EXACT(...))
o usa funzioni avanzate/dinamiche in 365.
Template riutilizzabili
VLOOKUP robusto tra file
=IFERROR(
VLOOKUP($A2, '[Sorgente.xlsx]Dati'!$A:$G, 7, 0),
"Non trovato"
)
XLOOKUP con pulizia incorporata
=LET(
chiave, TRIM(CLEAN(SUBSTITUTE($A2,CHAR(160),""))),
srcK, TRIM(CLEAN(SUBSTITUTE('[Sorgente.xlsx]Dati'!$A$1:$A$2910,CHAR(160),""))),
srcV, '[Sorgente.xlsx]Dati'!$G$1:$G$2910,
XLOOKUP(chiave, srcK, srcV, "Non trovato", 0)
)
INDEX/MATCH con controllo tipo
=LET(
k, VALUE($A2),
rK, VALUE('[Sorgente.xlsx]Dati'!$A$1:$A$2910),
rV, '[Sorgente.xlsx]Dati'!$G$1:$G$2910,
IFERROR(INDEX(rV, MATCH(k, rK, 0)), "Non trovato")
)
Conclusioni
Il 90% dei “VLOOKUP che sbagliano” deriva da due aspetti: ricerca approssimata involontaria e indice di colonna errato. Impostare esplicitamente il match esatto (0/FALSE
), verificare l’indice corretto (G → 7), bloccare i riferimenti e pulire le chiavi elimina la quasi totalità dei problemi. Per una soluzione di lungo periodo, passa a XLOOKUP
o a INDEX/MATCH
, preferibilmente su Tabelle Excel con riferimenti strutturati: otterrai formule più leggibili, performanti e resistenti ai cambiamenti del dataset.
Risorsa rapida
- Formula pronta:
=IFERROR(VLOOKUP(A2,'[Historical...]Sheet1'!$A$1:$K$2910,7,0),"Codice non trovato")
- Alternativa consigliata:
=XLOOKUP(A2,'[Historical...]Sheet1'!$A$1:$A$2910,'[Historical...]Sheet1'!$G$1:$G$2910,"Codice non trovato",0)
- Pulizia chiavi:
=TRIM(CLEAN(SUBSTITUTE(A2,CHAR(160),"")))