XL 2019 Première apparition d'une date correspondant à un intervalle de dates dans une liste de dates plus large

terreàterre

XLDnaute Nouveau
Bonjour à tout le monde,
je me lance pour cette première demande d'aide sur ce forum.

Dans une liste de dates non triée, je cherche à récupérer la ligne de la première date inclues elles mème dans une intervalle.

Puisqu'un exemple vaut toujours mille explications, dans le fichier joint, je cherche la ligne de la première apparition d'une date située dans l'intervalle 02/01/20 et 04/02/20

J’espère que certain sauront m'aider, je butte sur la formule depuis un moment maintenant
- j'imagine du INDEX EQUIV mais je n'ai pas trouvé comment y intégrer l'intervalle de dates

Voila pour le petit défi

Merci et bonne journée
 

Pièces jointes

  • Index equiv intervalle.xlsx
    74.3 KB · Affichages: 15
Solution
Bonjour à tous ;),

La fonction Agregat est bien mais difficilement dé-codable à moins d'avoir dans la tête la table des codes fonction dans la tête.

Avec les dates en G4 et H4, deux fonctions matricielles à ne suffiraient elles pas ?
=PETITE.VALEUR(SI((B3:B38>=G4)*(B3:B38<=H4)>0;LIGNE(B3:B38));1) et
=GRANDE.VALEUR(SI((B3:B38>=G4)*(B3:B38<=H4)>0;LIGNE(B3:B38));1)

1591882426291.png

terreàterre

XLDnaute Nouveau
Re-Bonjour et surtout merci à toutes vos solutions, je ne m'attendais pas à autant de réactivité. Vous êtes au top.

Roblochon :
Bien que j'avais déjà entendu parler de la fonction AGREGAT, je ne l'avais encore jamais utilisée. Drôle de fonction "fourre tout" et difficile à cerner surtout lorsque j'ai essayé de comprendre l'option "7" dans la formule (c'est comme un filtre en gros).

Sylvanu et Patricktoulon:
vous m'avez tout de suite perdu :D J'avoue ne pas avoir précisé que je ne maitrise absolument pas le VBA. J'ai tout de même tester vos fonctions qui fonctionnent très bien. Mais ça me demanderait trop d'efforts pour l'incorporer à mon tableau original pour le faire évoluer avec le temps.

Enfin Mapomme:
C'est une formule que j'arrive à comprendre et qui fonctionne très bien dans mon cas. Je n'aurais pas réussi à produire cette formule tout seul " (B3:B38>=$G$5)*(B3:B38<=$H$5)>0 " Il a juste fallu fixer la case G5 et H5 pour que la fonction matricielle fonctionne.

Je pars donc enrichi de vos formules, celle de Mapomme à ma préférence, mais je vais me pencher mieux sur la fonction AGREGAT promis.

Merci, bonne journée et à bientôt qui sait ;p
 

mapomme

XLDnaute Barbatruc
Supporter XLD
(B3:B38>=$G$5)*(B3:B38<=$H$5)>0

En fait, on utilise le fait que la valeur booléenne VRAI est transformée en 1 quand elle est embarquée dans une opération arithmétique (et FAUX est transformé en 0).

Donc quand on veut vérifier que deux conditions sont toutes les deux vérifiées, on fait le produit des résultats des 2 conditions. Si une condition n'est pas vérifiée, alors elle renvoie FAUX (0) et donc le produit est nul. Idem si les deux conditions sont fausses. Le seul cas où se produit n'est pas nul, c'est le cas où les deux conditions sont vérifiées. Dans ce dernier cas, chacune des conditions renvoie VRAI et le produit vaut 1. Donc (A1=11) * (A1=22) vaut 1 que si les deux termes sont VRAI. Dans tous les autres cas, le produit vaut 0.
On peut donc "assimiler" le produit à un AND (ET).

Si on recherche les cas où une seule condition est vrai ou bien les deux, on utilisera le plus (+) :
(A1=11) + (A1=22). Si une des deux condition est VRAI, la somme vaudra 1, si les deux conditions sont VRAI, la somme vaudra 2. Donc ( (A1=11) + (A1=22) ) >0 correspond à un OR (OU).
On peut donc "assimiler" la somme à un OR (OU).

Ça peut être très pratique dans une formule matricielle car dans les formules matricielles le ET et le OU sont inopérants sur la plage de calcul. En effet ET(A1:A2 ; B1;B2) ne renvoie pas une matrice mais simplement le résultat de ET(A1;B1) soit une valeur unique.
Alors que le produit (A1:A2=11) * (B1:B2=22) renvoie bien une matrice à deux éléments :
{ (A1 =11) * ( B1=22) ; (A2 =11) * ( B2=22) }
 

Hasco

XLDnaute Barbatruc
Repose en paix
Bonjour,

@terreàterre : la fonction agregat permet d'appliquer à une plage de cellules, certaines fonctions statistiques sans prendre en compte les lignes masquées et/ou les valeurs d'erreurs et/ou les sous-totaux.

Dans votre cas et sur la base de la même logique énoncée par @mapomme : En fait, on utilise le fait que la valeur booléenne VRAI est transformée en 1 quand elle est embarquée dans une opération arithmétique (et FAUX est transformé en 0). on provoque en interne un tableau de numéros de lignes divisés par 1 (si la condition est vrai) et de #/DIV0 (si la condition est fausse, division par zéro) .
La fonction Petite.Valeur (premier paramètre d'agregat: 15) retournera la première valeur qui ne sera pas en erreur (deuxième paramètre: 7) et ne sera pas cachée, peut-être que 6 (ignorer les valeurs d'erreur) eût été suffisant. J'ai choisi 7 plus par habitude.

LIGNE($B$3:$B$38)/($B$3:$B$38>=DATE(2020;1;2))/($B$3:$B$38<=DATE(2020;1;4))

Cordialement
 

Discussions similaires

Statistiques des forums

Discussions
314 422
Messages
2 109 449
Membres
110 483
dernier inscrit
Laanvy