4 votes

La fonction INDEX + MATCH renvoie des valeurs erronées

J'ai une feuille de calcul dans Excel 2013 qui utilise un INDEX y MATCH pour effectuer une recherche sur un intervalle de temps (en I4 ) pour extraire des valeurs de la ligne correspondante où il est apparié (dans la colonne A ). Il fonctionne comme prévu sur toutes les lignes sauf trois - sur ces lignes problématiques, il renvoie en fait la valeur de la cellule ci-dessus.

J'utilise le code :

=INDEX(B:B, (MATCH($I$4, A:A)))

La valeur que j'utilise pour rechercher l'intervalle de temps se trouve dans la cellule I4 (par exemple, 10:00 AM), et la colonne à laquelle elle correspond est A:A . Les valeurs que j'essaie de renvoyer se trouvent à l'adresse suivante B:B .

La colonne de temps d'intervalle s'étend de A2 - A37 (6:00 AM - 11:30 PM, par incréments d'une demi-heure), et les valeurs que je souhaite obtenir vont de B2 - B37 .

L'option TOUTES LES VALEURS donne des résultats corrects, sauf lorsque l'on recherche des valeurs dans le champ A4 , A7 y A10 (7:00 AM, 8:30 AM et 10:00 AM, respectivement), qui affichent les données de la cellule au-dessus de la valeur souhaitée (c'est-à-dire lorsque I4 = 7:00 AM (ce qui équivaut à A4 ), la formule renvoie la valeur de B3 au lieu de B4 , I4 = 8:30 AM ( A7 ) → B6 au lieu de B7 et I4 = 10:00 AM ( A10 ) B9 au lieu de B10 ).

Lorsque j'essaie d'utiliser une correspondance exacte :

=INDEX(B:B, (MATCH($I$4, A:A, 0)))

il renvoie la valeur #N/A pour les lignes problématiques, et des valeurs correctes pour seulement certaines des autres.

Une idée de ce qui se passe ?

4voto

Scott Points 20468

Je pense que @fixer1234 a raison - il s'agit d'une erreur d'arrondi en virgule flottante. sur les valeurs temporelles . Je ne comprends pas très bien ce qui se passe, mais j'ai pu le reproduire sur mon système et j'ai trouvé une solution de contournement : Modifiez votre formule en

=INDEX(B:B, MATCH($I$4+TIME(0,0,1), A:A))

Cela ajoute une seconde ( TIME(0,0,1) ; les arguments sont TIME(_hours_,_minutes_,_seconds_) ) à l'adresse I4 Cela semble être suffisant pour qu'il soit testé comme étant ≥ la valeur de A4 (ou A7 o A10 ). BTW, j'ai essayé TIME(0,0,0.9) mais apparemment TIME() ne respecte pas les fractions de secondes, et il les traite donc comme des TIME(0,0,0) c'est-à-dire tout simplement zéro. Si vous voulez obtenir une milliseconde, vous pouvez utiliser TIME(0,0,1)*0.001 .

P.S. Votre formule comportait une paire de parenthèses inutile ; Je l'ai supprimée, ci-dessus.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X