DGET : trouver une valeur avec une date comprise entre deux valeurs

Bonjour !

nouveau sur ce forum, j'espère y trouver avec votre bienveillance une aide pour une question qui me turlupine depuis des semaines, oui carrément...

J'ai une base de données de quelques centaines de lignes, avec des calculs pas très compliqués et j'ai résolu mon problème en faisant de multiples appels en cascade à QUERY. Sauf qu'au bout de deux ou trois appels, la routine devient très longue, pour ne pas dire interminable (plusieurs minutes).

J'ai trouvé récemment une fonction DGET qui résoud tous mes problèmes de vitesse, mais je bute sur cette question :

imaginons que j'entre des stocks de bananes et de pommes, à des dates différentes (imaginons le premier de chaque mois) à des prix souvent différents.

Je souhaite retrouver le prix d'une banane le 5 février. Si j'ai fait rentrer des bananes le 1er février, et que j'interroge les données au premier février, facile, j'en obtiens le prix avec un DGET.

Maintenant, pour le 5 février, c'est plus compliqué, puisque je dois récupérer la date d'entrée en stock immédiatement inférieure (1er février) à la date actuelle (5 février), puis ensuite passer mon DGET pour obtenir le prix de la banane au 1er février.

lskr3yd

si j'interroge (tableau de droite en vert) les bananes au 20 janvier, pas de souci évidemment, il n'y a qu'une réponse au DGET
si j'interroge les bananes au 5 février, il y a deux réponses où la date des stocks est inférieure au 5 février (entrée en stock le 1er janvier, puis le 1er février) dont deux réponses possibles, 10€ et 12€. Or DGET n'autorise pas cela. PROBLEME : Donc je dois récupérer la date la plus élevée d'entrée en stock, immédiatement inférieure (1er février) à celle de l'achat (5 février) pour ensuite la passer à mon DGET.

Je sais faire cela avec un QUERY (plus exactement avec deux QUERY en cascade : le QUERY le plus interne récupère la plus grande date immédiatement inférieure (1er fév) à la date désirée (5 fév). Le QUERY le plus "externe" recherche le prix des bananes au 1er février). Dans le cas de ma base de données, ces opérations multiples sont très longues, surtout que je les applique en de multiples endroits en recopiant les formules via un script, parce que ARRAYFORMULA et QUERY ne font pas bon ménage, bref, c'est le bazar.

Voici mon fichier exemple, que j'ai essayé de commenter au mieux, avec les formules, cellules protégées. J'ai laissé en dessous une recopie des cellules pour faire mumuse, au cas où.
https://docs.google.com/spreadsheets/d/1wFwxvPuSa_NlMbXhvqPdxiRaLRYPMfERmS8Cs-MmiQ4/edit#gid=0

En résumé, je souhaite résoudre cette question sans AUCUN QUERY.

Je vous remercie du temps que vous pourrez consacrer à ma demande, qui ne doit pas être si rare, mais pour laquelle je n'ai encore rien trouvé sur les forums, français ou anglophones.

ps : pour ceux qui se poseraient des questions sur ce thème quelques liens bibliographiques issus de mes recherches personnelles - débutant je ne peux pas encore poster de liens, mais aller sur :

  • la base : sheets pratique fonctions recherche
  • pour les débutants en query : sheets pratique query select
  • hyper utile : sheets pratique query date-heure
  • et cette série de videos (en anglais, mais ça vaut le coup d'apprendre la langue rien que pour la qualité des formations gratuites proposées) : youtube LearnGoogleSpreadsheets videos
  • dont une spécifiquement sur DGET dans la liste.

Bonjour,

je poursuivrais personnellement avec query en triant le résultat sur la date (ordre décroissant) et en limitant le résultat à 1

=query(A:C;"select B where A='"&E2&"' and C<=DATE'"&TEXT(F2;"yyyy-MM-dd")&"' order by C desc limit 1";0)

voir onglet mike

image

je vais quand même regarder avec DGET, mais là encore il faut retenir la dernière valeur, donc avec des formules max, index etc. sur le résultat pour n'en retenir qu'un (cela risque d'être plus chronophage !).

query est quand même une fonction assez réputée pour ses performances, peut-être faut-il voir où cela coince dans ta feuille, et parfois utiliser arrayformula et vlookup ... voire des TCD

Autre solution

=index(B2:B5; MATCH(E3&(F3*1); A2:A5&C2:C5 ;1))

à condition d'avoir une base triée sur le produit puis la date

mais avec un danger si le produit n'existe pas (pourrait donner une valeur sur autre produit "juste inférieur")

Autre solution

=INDEX(SORT({filter($C$2:$C$5;$A$2:$A$5=E2;$C$2:$C$5<=F2)\filter($B$2:$B$5;$A$2:$A$5=E2;$C$2:$C$5<=F2)};1;0);1;2)

je constitue ici la base de données date/prix, je trie en ordre inversé sur la date et je retiens le premier prix de la liste

image

Bonjour Mike,

juste un petit message pour dire que j'ai bien vu ta réponse ce matin et que je suis justement depuis entrain de la tester sous ses différentes formes pour voir ce que ça donne comme améliorations en termes de vitesse sur mon vrai fichier, mais merci beaucoup d'ores et déjà ! Ca m'ouvre les yeux sur d'autres façons de faire à partir d'un besoin réel, et ça c'est très pédagogique

C'est super, après plusieurs essais, j'ai utilisé le QUERY avec un classement décroissant limité à la dernière valeur, et je passe de 54 secondes de traitement à 4 secondes environ, une augmentation significative des performances ! je vais mettre le signe "sujet résolu" parce que j'ai vraiment avancé dans la bonne direction grâce à ton aide.
encore merci !

Rechercher des sujets similaires à "dget trouver valeur date comprise entre deux valeurs"