Excel : VLOOKUP / RECHERCHEV renvoie une mauvaise valeur — causes, solutions, alternatives

Votre RECHERCHEV renvoie une valeur fausse ou zéro ? Voici comment diagnostiquer, expliquer et corriger durablement le problème, avec des exemples concrets, des formules prêtes à copier et des alternatives plus fiables comme RECHERCHEX.

Sommaire

VLOOKUP / RECHERCHEV renvoie une mauvaise valeur

Vue d’ensemble du problème

Un classeur Excel réalise une recherche dans un autre fichier via VLOOKUP (FR : RECHERCHEV). Selon le col_index_num, la formule retournait tour à tour une valeur de la mauvaise colonne ou 0. L’ajout du quatrième argument a tout résolu… sans que la cause soit évidente.

La raison principale : l’argument de correspondance a été omis. Par défaut, VLOOKUP fait une correspondance approximative, ce qui suppose que la première colonne du tableau soit triée. Si le tableau ne l’est pas (ou contient du texte), le résultat peut sembler « aléatoire ».

Cause principale : l’argument de correspondance manquant

L’argument [range_lookup] (quatrième position) indique si l’on veut une correspondance exacte ou approximative :

  • Omis ou VRAI / 1 : correspondance approximative. La table doit être triée croissant par la première colonne. Excel renvoie la dernière valeur inférieure ou égale à la clé.
  • FAUX / 0 : correspondance exacte. Pas besoin de tri.
ParamètreComportementExigenceQuand l’utiliserRisque si mauvais choix
Omis / VRAI / 1Approximation (plancher)Première colonne triéeTranches tarifaires, notes, paliersValeurs fausses si non trié
FAUX / 0ExactAucun tri requisClés uniques, ID, codes#N/A si introuvable (prévisible)

Solution immédiate : forcez la correspondance exacte.

=VLOOKUP(A2, '[Historical Sales Report 04-29-2024 (After Import).xlsx]Sheet1'!$A$1:$K$2910, 7, FALSE)

Version française :

=RECHERCHEV(A2;'[Historical Sales Report 04-29-2024 (After Import).xlsx]Feuil1'!$A$1:$K$2910;7;FAUX)

Choisir le bon index de colonne

L’argument col_index_num est indexé à partir de 1 à l’intérieur du table_array. Ainsi, dans une plage $A:$K :

Lettre colonneIndex pour RECHERCHEVCommentaires
A1La colonne de recherche doit être la première du tableau
F6Ex. col_index_num=6 renvoie la colonne F
G7Ex. col_index_num=7 renvoie la colonne G
H8Ex. col_index_num=8 renvoie la colonne H

Si vous mettez 8 et obtenez 0, deux cas probables :

  • La huitième colonne existe mais la cellule correspondante est vide ou contient 0 → Excel renvoie 0.
  • La huitième colonne contient du texte et la cellule visée est vide, mais le format cible attend un nombre → l’affichage peut donner 0.

Si la huitième colonne n’existait pas dans la plage, vous auriez obtenu #REF!, pas 0.

Exemple minimal reproductible

Supposons cette table :

A (ID)B (Nom)C (Montant)
1001Alpha250
1002Bravo500
1003Charlie

Formule :

=RECHERCHEV(1003;$A$1:$C$3;3;FAUX)  ⟶ 0

La cellule Montant pour 1003 est vide ; RECHERCHEV renvoie 0. Pour afficher une cellule vide plutôt que 0 :

=SI(LONGUEUR(RECHERCHEV(1003;$A$1:$C$3;3;FAUX))=0;"";RECHERCHEV(1003;$A$1:$C$3;3;FAUX))

Bonnes pratiques et corrections durables

Figer la plage et sécuriser la copie

Avant de recopier la formule, absolutisez la plage : $A$1:$K$2910. Sans cela, la plage se décale et la recherche cible la mauvaise colonne/ligne.

Positionner correctement la colonne de recherche

RECHERCHEV ne cherche qu’à droite de la première colonne du table_array. Si la clé se trouve au milieu, deux options :

  • Réarrangez la plage pour que la colonne clé soit la première.
  • Utilisez une alternative qui n’impose pas cette contrainte (voir plus bas).

Nettoyer les clés de recherche

Les écarts viennent souvent d’espaces invisibles, d’accents non standard (espaces insécables), ou d’un mélange texte / numérique (ex. "00123" vs 123). Quelques recettes utiles :

ProblèmeSymptômeCorrection (FR)Remarques
Espaces en tropValeur introuvable, doublons apparents=SUPPRESPACE(A2)Supprime espaces multiples et en début/fin
Espace insécableSUPPRESPACE ne suffit pas=SUPPRESPACE(SUBSTITUE(A2;CAR(160);""))Remplace l’insécable (160) puis nettoie
Caractères invisiblesRecherche échoue=NETTOYER(A2)Supprime caractères non imprimables
Nombre stocké en texte« 123 » ≠ 123=CNUM(A2)Convertit texte en nombre
Texte normaliséClés formatées avec zéros=TEXTE(A2;"00000")Uniformise la clé à 5 chiffres

Appliquez le nettoyage dans la recherche si vous ne pouvez pas modifier les données sources :

=RECHERCHEV(SUPPRESPACE(SUBSTITUE(A2;CAR(160);""));$A:$K;7;FAUX)

Gérer proprement les erreurs et les vides

Évitez d’afficher des erreurs dans un rapport :

=SIERREUR(RECHERCHEV(A2;$A:$K;7;FAUX);"")

Pour distinguer « introuvable » d’une cellule vide renvoyée par RECHERCHEV, capturez les deux :

=SIERREUR(SI(LONGUEUR(RECHERCHEV(A2;$A:$K;7;FAUX))=0;"";RECHERCHEV(A2;$A:$K;7;FAUX));"")

Rendre l’index de colonne dynamique

Évitez les index « magiques » (6, 7, 8) fragiles lors d’insertion/suppression de colonnes. Utilisez EQUIV pour cibler la colonne par son en-tête :

=RECHERCHEV($A2;$A:$K;EQUIV("Montant";$A$1:$K$1;0);FAUX)

Adopter des alternatives plus robustes

  • RECHERCHEX (EN : XLOOKUP) : plus lisible, recherche à gauche ou à droite, gestion native des absences, choix du mode de recherche. =RECHERCHEX(A2;$A:$A;$G:$G;"Non trouvé";0) Variantes utiles :
    • Dernière correspondance (si doublons) : =RECHERCHEX(A2;$A:$A;$G:$G;"Non trouvé";0;-1)
    • Recherche approximative non triée par « plus proche » : mode_de_correspondance= -1 ou 1 selon le besoin.
  • INDEX + EQUIV (EN : INDEX + MATCH) : =INDEX($G:$G;EQUIV(A2;$A:$A;0))
  • FILTRE pour obtenir plusieurs lignes correspondantes : =FILTRE($A:$K;$A:$A=A2)

Quand l’approximation est pertinente

La correspondance approximative n’est pas « mauvaise » ; elle est juste spécifique. Utilisez-la pour affecter une tranche à une valeur triée (ex. prix en fonction d’un seuil) :

SeuilRemise
00 %
10005 %
500010 %

Formule :

=RECHERCHEV(Montant;$A:$B;2;VRAI)

Ici, la première colonne doit rester triée par seuil.

Checklist de diagnostic rapide

  • Le quatrième argument est-il FAUX / 0 ? Si non, corrigez.
  • La colonne de recherche est-elle la première de la plage ? Si non, réorganisez ou passez à RECHERCHEX.
  • Le col_index_num pointe-t-il la bonne colonne ? Vérifiez via EQUIV.
  • La plage est-elle figée avec $ ? Évitez les décalages lors des recopiages.
  • Les clés sont-elles propres (pas d’insécables, types homogènes) ? Nettoyez avec SUPPRESPACE, NETTOYER, CNUM.
  • Y a-t-il des doublons dans la colonne clé ? RECHERCHEV renvoie la première occurrence.
  • La cellule de résultat attend-elle un nombre alors que la source est du texte (ou l’inverse) ? Normalisez.
  • La valeur renvoyée est-elle vide dans la source ? Prévoir la mise en forme pour afficher vide au lieu de 0.

Déboguer pas à pas

  1. Testez la clé isolément : =EQUIV(A2;$A:$A;0). Si #N/A : la clé n’existe pas (ou problème de type/espaces).
  2. Vérifiez la colonne cible : =INDEX($G:$G;EQUIV(A2;$A:$A;0)) pour voir la valeur exacte renvoyée.
  3. Inspectez la cellule source : est-elle vraiment vide ? Essayez =ESTVIDE(…) ou regardez la barre de formule.
  4. Affichez les caractères invisibles : =CODE(DROITE(A2;1)) peut révéler un insécable 160.

Exemples prêts à l’emploi

Recherche exacte entre classeurs :

=RECHERCHEV($A2;'[Données ventes.xlsx]Feuil1'!$A:$K;EQUIV("Montant";'[Données ventes.xlsx]Feuil1'!$A$1:$K$1;0);FAUX)

Masquer erreurs et vides :

=SIERREUR(SI(LONGUEUR(RECHERCHEV($A2;$A:$K;7;FAUX))=0;"";RECHERCHEV($A2;$A:$K;7;FAUX));"")

Remplacer RECHERCHEV par RECHERCHEX :

=RECHERCHEX($A2;$A:$A;$G:$G;"Non trouvé";0)

Rendre l’index insensible aux insertions :

=RECHERCHEV($A2;$A:$K;EQUIV($M$1;$A$1:$K$1;0);FAUX)   // $M$1 contient l’en-tête voulu

Cas particuliers à connaître

  • Doublons dans la clé : RECHERCHEV renvoie la première occurrence de la plage. Pour viser la dernière, utilisez RECHERCHEX avec mode_de_recherche=-1 ou une construction INDEX/AGREGAT.
  • Majuscules/minuscules : RECHERCHEV n’est pas sensible à la casse. Pour une recherche sensible à la casse : =INDEX($G:$G;EQUIV(1;--EXACT($A:$A;A2);0)) Validez la partie --EXACT en tant que formule matricielle selon votre version.
  • Colonnes entières : $A:$K est pratique mais peut être coûteux en calcul. Préférez des Tableaux (Ctrl+T) et des références structurées.
  • Plage non triée avec approximation : le résultat peut paraître cohérent « parfois », puis devenir faux après une insertion de ligne ; c’est typique d’un [range_lookup] omis.

Modèle de données et formules de référence

Petit jeu d’essai pour vos tests

IDClientVilleMontantStatutRemarqueCodeCatégorieCommercialDeviseDate
1001AlphaLyon1200PayéA-01AMartinEUR15/03/2024
1002BravoParis0En attente A-02BSofiaEUR18/03/2024
1003CharlieLilleAnnulé A-03AOlivierEUR21/03/2024

Formules utiles :

  • Montant par ID (exact) : =RECHERCHEV(A2;$A:$K;4;FAUX)
  • Catégorie par ID (exact) : =RECHERCHEV(A2;$A:$K;8;FAUX)
  • Remarque par ID, vide si absent : =SIERREUR(SI(LONGUEUR(RECHERCHEV(A2;$A:$K;6;FAUX))=0;"";RECHERCHEV(A2;$A:$K;6;FAUX));"")

Pourquoi le problème survient si souvent

RECHERCHEV a deux défauts ergonomiques historiques :

  1. Si le quatrième argument est omis, Excel choisit l’approximation (héritage de versions anciennes), alors qu’en pratique la plupart des recherches métiers sont exactes.
  2. Le repérage par index de colonne casse dès qu’on insère/supprime des colonnes.

C’est pour cela que beaucoup d’équipes migrent vers RECHERCHEX, qui impose une syntaxe explicite et robuste : valeur_cherchée, matrice_recherche, matrice_retour, valeur par défaut, mode de correspondance et de recherche.

Guide de migration rapide vers RECHERCHEX

  1. Identifiez la clé : ID, Code, etc.
  2. Remplacez RECHERCHEV(clé;table;index;FAUX) par RECHERCHEX(clé;colonne_cle;colonne_cible;"Non trouvé";0).
  3. Si une « dernière occurrence » est souhaitée en cas de doublons : ajoutez ;-1 comme mode de recherche.
  4. Validez sur un échantillon et comparez les résultats avec un INDEX+EQUIV de contrôle.

Foire aux questions

Pourquoi j’obtiens #N/A avec FAUX mais une valeur « qui semble bonne » avec VRAI ?

Avec FAUX, Excel exige une correspondance exacte ; si la clé n’existe pas (ou est mal nettoyée), c’est #N/A. Avec VRAI, Excel renvoie la meilleure correspondance inférieure ou égale dans une table triée… ce qui, si la table n’est pas triée, peut paraître « juste par hasard » sur certaines lignes et faux sur d’autres.

Pourquoi ma formule renvoie 0 alors que la cellule source est vide ?

C’est le comportement standard : un vide renvoyé par RECHERCHEV s’affiche 0 si la cellule résultat est formatée Nombre. Utilisez un test de longueur (voir plus haut) pour convertir le vide en chaîne vide "".

Comment éviter que l’index change quand j’insère des colonnes ?

Remplacez l’index fixe par EQUIV sur l’en-tête : =RECHERCHEV($A2;$A:$K;EQUIV("Montant";$A$1:$K$1;0);FAUX). Ou passez à RECHERCHEX.

Comment diagnostiquer un mélange texte / numérique ?

Comparez =ESTNUM(A2) et =ESTTEXTE(A2), ou forcez la cohérence : =CNUM(A2) côté clé ou =TEXTE(A2;"000000") côté données.

Modèles à copier-coller

Patron de RECHERCHEV exact et lisible

=SIERREUR(
  RECHERCHEV(
    SUPPRESPACE(SUBSTITUE($A2;CAR(160);""));
    TableauVentes[[ID]:[Date]];
    EQUIV("Montant";TableauVentes[#En-têtes];0);
    FAUX
  );
""
)

Patron RECHERCHEX tout-terrain

=RECHERCHEX(
  SUPPRESPACE(SUBSTITUE($A2;CAR(160);""));
  TableauVentes[ID];
  TableauVentes[Montant];
  "Non trouvé";
  0;
  1
)

Résumé opérationnel

  • Mettez systématiquement le quatrième argument à FAUX / 0 pour une recherche exacte, sauf cas d’usage de tranches.
  • Vérifiez le col_index_num et préférez EQUIV sur l’en-tête pour éviter les erreurs après insertion de colonnes.
  • Nettoyez les clés : SUPPRESPACE, SUBSTITUE avec CAR(160), NETTOYER, CNUM.
  • Gérez élégamment les erreurs et les vides : SIERREUR et test de LONGUEUR.
  • Envisagez RECHERCHEX ou INDEX + EQUIV pour plus de robustesse et de clarté.

Exemples bilingues pour éviter toute ambiguïté

ButFREN
Exact simple=RECHERCHEV(A2;$A:$K;7;FAUX)=VLOOKUP(A2,$A:$K,7,FALSE)
Masquer erreur=SIERREUR(RECHERCHEV(A2;$A:$K;7;FAUX);"")=IFERROR(VLOOKUP(A2,$A:$K,7,FALSE),"")
Index dynamique=RECHERCHEV(A2;$A:$K;EQUIV("Montant";$A$1:$K$1;0);FAUX)=VLOOKUP(A2,$A:$K,MATCH("Amount",$A$1:$K$1,0),FALSE)
Alternative moderne=RECHERCHEX(A2;$A:$A;$G:$G;"Non trouvé";0)=XLOOKUP(A2,$A:$A,$G:$G,"Not found",0)

Erreurs et messages courants

MessageCause probableCorrection
#N/AClé absente, types incohérents, espaces cachésNettoyer la clé, vérifier FAUX, normaliser texte/nombre
#REF!col_index_num dépasse le nombre de colonnesRéduire l’index ou étendre la plage
0Cellule source vide ou 0, cellule résultat formatée nombreTransformer les vides en "" avec LONGUEUR
Valeur erronéeApproximation par défaut sur table non triéeMettre FAUX ou trier la colonne clé

Bonnes pratiques de performance et de maintenance

  • Privilégiez les Tableaux (Ctrl+T) avec références structurées : moins d’erreurs de plage, recalculs plus propres.
  • Évitez les colonnes entières si le classeur est volumineux ; ciblez la plage utile ($A$1:$K$30000).
  • Si plusieurs résultats sont attendus, ne dupliquez pas RECHERCHEV : utilisez FILTRE ou une table de recherche normalisée.
  • Documentez le choix exact vs approximatif dans un commentaire de cellule pour les futurs lecteurs.

Conclusion

Si RECHERCHEV renvoie une valeur incorrecte, c’est presque toujours lié à une correspondance approximative non souhaitée ou à un index de colonne inexact. La correction standard consiste à imposer la correspondance exacte (FAUX), à sécuriser l’index via EQUIV et à nettoyer les clés. Pour plus de robustesse et de lisibilité, passez à RECHERCHEX : vous éviterez la plupart des pièges historiques et gagnerez en clarté.

Rappel express : mettez le quatrième argument à FAUX / 0, validez l’index de colonne, nettoyez les données, et n’hésitez pas à adopter RECHERCHEX ou INDEX+EQUIV selon vos besoins.

Sommaire