Monsieur Excel
Pour tout savoir faire sur Excel !

21 février 2011

Tutorial sur la fonction recherche()

Nous avions déjà présenté la fonction recherche() dans une série d’articles débutant le 18 mars 2006, donc dans les six premiers mois de ce blog. C’est dire l’importance de cette fonction, qui était une des 32 fonctions de Visicalc (contre environ 347 pour Excel 2007), l’ancêtre de tous les tableurs, né en 1979.

Il est temps de vous proposer un nouveau tutorial pour cette fonction fondamentale. Nous reprenons le même exemple, actualisé au tarif postal actuel. Vous devez poster une lettre de 116 grammes, en utilisant le tarif en A2:B10.

Certes, vous pourriez utiliser en B13 la formule suivante :

Cela peut fonctionner, mais cette solution présente trois inconvénients :

● on ne peut pas imbriquer plus de 7 fonctions ;

● si l’on crée une nouvelle catégorie, par exemple pour 160 grammes, la formule doit être modifiée : elle n’est donc pas flexible ;

● une formule comme cela est particulièrement indigeste : elle est donc difficilement auditable.

La solution est d’utiliser la formule affichée en commentaire de la cellule A13. Mais on peut aussi utiliser la formule en A14 qui, elle, fait référence au tableau transposé en A16:B17. La syntaxe de la fonction recherche() est donc : =recherche(valeur;matrice). Nous verrons, dans un autre article, qu’une seconde syntaxe – ajoutée des années plus tard – est aussi possible.

L’algorithme de la fonction recherche()

L’algorithme utilisé par la fonction recherche() est illustré par le tracé en traits fléchés, en bleu. Excel compare 116 gr. à 0 gr., puis à 20 gr., puis à 50 gr., jusqu’à buter sur une valeur supérieure à la valeur de référence (dans notre cas, nous butons sur 250 gr.). Quand elle trouve cette première valeur supérieure, elle remonte d’une ligne puis par complètement à droite dans cette ligne, jusqu’à la fin de la matrice de référence.

Si la matrice est horizontale, Excel va vers la droite jusqu’à rencontrer la première valeur supérieure à la valeur de référence puis revient alors une colonne à gauche et descend jusqu’en bas de la matrice pour trouver le résultat.

Remarque 1 – Si la matrice est carrée, elle est considérée comme « verticale ».

Remarque 2 – Cet algorithme suppose que la première colonne (matrice verticale) ou la première ligne (matrice horizontale) est constituée de valeurs croissantes.

Remarque 3 – Attention ! Si vous insérez des colonnes à l'intérieur de la matrice, une matrice « verticale » peut devenir « horizontale », auquel cas les formules de recherche ne donneront plus les bons résultats...

2 Commentaire(s):

  • Vous êtes sûr que RECHERCHE utilise cet algorithme purement séquentiel ? ce n'est pas très efficace quand les données sont classées en ordre croissant (ou décroissant).
    Si vous avez n valeurs dans votre liste, vous aurez, en moyenne, n/2 comparaisons à effectuer.
    Je suppose quand même que MS connait la dichotomie qui consiste à diviser par 2 la tranche de recherche à chaque test, ce qui donne à peu près log2(n) comparaisons soit par exemple pour une liste de 1000 valeurs, 10 comparaisons au lieu de 500.

    By Anonymous cduigou, sur 4:52 PM  

  • Je ne suis pas sûr que c'est précisément cet algorithme qui est utilisé, mais le résultat obtenu lui correspond bien...

    Si l'on veut utiliser proprement la fonction recherche(), cet algorithme est bien plus simple à comprendre que les algorithmes dichotomiques, à la fois plus performants et moins limpides, auxquels vous faites allusion...

    By Blogger Hervé Thiriez, sur 6:36 PM  

Enregistrer un commentaire

<< Accueil