(Répondre ici comme aucune question distincte pour les données triées.)
Si les données ont été triées, vous pouvez les utiliser VLOOKUP
avec l' range_lookup
argument TRUE
(ou omis, car c'est la valeur par défaut), qui est officiellement décrit pour Excel comme "rechercher une correspondance approximative".
En d'autres termes, pour les données triées:
- définir le dernier argument pour
FALSE
retourner la première valeur, et
- la définition du dernier argument
TRUE
renvoie la dernière valeur.
Ceci est en grande partie non documenté et obscur, mais remonte à VisiCalc (1979), et il existe aujourd'hui au moins dans Microsoft Excel, LibreOffice Calc et Google Sheets. C'est finalement dû à l'implémentation initiale de LOOKUP
dans VisiCalc (et de là VLOOKUP
et HLOOKUP
), quand il n'y avait pas de quatrième paramètre. La valeur est trouvée par recherche binaire , en utilisant la limite gauche et la droite exclusives (une implémentation commune et élégante), ce qui entraîne ce comportement.
Techniquement, cela signifie que l'on commence la recherche avec l'intervalle candidat [0, n)
, où n
est la longueur du tableau, et la condition invariante de la boucle est que A[imin] <= key && key < A[imax]
(la limite de gauche est <= la cible, la limite de droite, qui commence une après la fin, est > la cible; pour valider, soit vérifier les valeurs aux points de terminaison avant, soit vérifier le résultat après), et bissecter et choisir successivement le côté qui préserve cet invariant: par exclusion, un côté le fera, jusqu'à ce que vous arriviez à un intervalle avec 1 terme [k, k+1)
, et le l'algorithme revient ensuite k
. Cela ne doit pas nécessairement être une correspondance exacte (!): C'est juste la correspondance la plus proche d'en bas. En cas de doublons, cela se traduit par le retour de la dernière correspondance, car cela nécessite que la valeur suivante soit supérieureque la clé (ou la fin du tableau). En cas de doublons, vous avez besoin d'un certain comportement, ce qui est raisonnable et facile à mettre en œuvre.
Ce comportement est indiqué explicitement dans cet ancien article de la Base de connaissances Microsoft (non souligné dans l'original): "XL: comment renvoyer la première ou la dernière correspondance dans un tableau" ( Q214069 ):
Vous pouvez utiliser la fonction LOOKUP () pour rechercher une valeur dans un tableau de données triées et renvoyer la valeur correspondante contenue dans cette position dans un autre tableau. Si la valeur de recherche est répétée dans le tableau, elle renvoie la dernière correspondance rencontrée . Ce comportement est vrai pour les fonctions VLOOKUP (), HLOOKUP () et LOOKUP ().
La documentation officielle de certaines feuilles de calcul suit; dans aucun des deux, le comportement de "dernière correspondance" n'est indiqué, mais cela est implicite dans la documentation de Google Sheets:
Microsoft Excel
VRAI suppose que la première colonne du tableau est triée numériquement ou alphabétiquement, puis recherchera la valeur la plus proche .
Google Sheets :
Si is_sorted
est TRUE
ou omis, la correspondance la plus proche ( inférieure ou égale à la clé de recherche) est renvoyée