Excel: VLOOKUP restituisce valore sbagliato? Cause, soluzione e alternative (XLOOKUP, INDEX/MATCH)

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.

Indice

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

FattoreDescrizioneEffetto
4° argomento omessoSe 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 erratoIl 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

TemaDettaglioConseguenza
Differenze di formatoCodice 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 invisibiliSpazi iniziali/finali, caratteri non stampabili (es. CHAR(160) NBSP da import web).Valori apparentemente identici non coincidono.
Duplicati del codiceLa chiave che si presume “univoca” è presente più volte.VLOOKUP restituisce il primo match; i successivi sono ignorati.
Colonna di ricerca errataLa 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 bloccatoMancano i riferimenti assoluti ($) e, copiando la formula, il range “scivola”.La formula punta a righe/colonne sbagliate e ritorna valori casuali.
Link esterni instabiliFile 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

TemaSpiegazione sintetica
Bloccare intervalliUsare riferimenti assoluti $A$1:$K$2910 per evitare errori in copia/incolla.
Gestire erroriRacchiudere la formula in IFERROR() per messaggi più chiari al posto di #N/D.
Alternative moderneXLOOKUP() (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

  1. Conferma del 4° argomento: apri la cella della formula e verifica che il 4° parametro sia 0/FALSE. Se manca, aggiungilo.
  2. Indice di colonna: riconta le colonne del range e imposta il terzo argomento su 7 (colonna G) per il tuo caso.
  3. Range bloccato: verifica la presenza dei $ in $A$1:$K$2910.
  4. Chiave nella prima colonna: il codice deve trovarsi nella colonna A del range passato. In caso contrario, ridisegna il range o usa INDEX/MATCH o XLOOKUP.
  5. Formati coerenti: controlla che la chiave in entrambi i file sia tutta numero o tutta testo. Evita commistioni.
  6. Spazi e caratteri invisibili: usa formule di pulizia (vedi sotto) se il confronto fallisce senza motivo apparente.
  7. Duplicati: verifica se la chiave è davvero univoca (usa COUNTIF o UNIQUE).
  8. Link esterni: se stai puntando a un altro file, aprilo e assicurati che i collegamenti siano aggiornati.
  9. 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 oppure VALUE(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 e INDEX/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 e G, limita il range a quelle due colonne.

Debug efficace: come verificare velocemente

  1. Test di presenza: =COUNTIF('[Historical...]Sheet1'!$A:$A, A2) → se 0, il codice non esiste (o è “sporco”).
  2. Confronto di tipo: =ISTEXT(A2) e =ISNUMBER(A2) sui due file per assicurarti che coincidano.
  3. Verifica spazi: =LEN(A2) vs =LEN(TRIM(A2)). Se la lunghezza si riduce, c’erano spazi.
  4. Individua NBSP: =CODE(MID(A2,1,1)) o usa SUBSTITUTE(A2,CHAR(160),"").
  5. Valuta formula: scheda FormuleValuta 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 DatiModifica 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),"")))
Indice