Recherche de la date la plus ancienne avec critère

Bonjour

Dans mon tableau de la page "Bilan" je souhaiterais qu'il apparaisse sur la ligne "Date du plus ancien des 3 derniers treuillages" la date à laquelle a été effectué le 3ème treuillage de la personne en partant du bas de la liste "Activité".

Exemple:

Pour Fred

16/08/19 10 treuillages

08/10/19 2 treuillages

06/11/19 2 treuillages

Je souhaiterais que pour Fred, il y soit inscrit la date du 08/10/19 car en partant de sa dernière mission du 06/11/19 il a effectué 2 treuillages et lors de sa mission du 08/10/19 il a effectué son 3ème et son 4ème treuillage.

J'ai effectué plusieurs essais:

En utilisant la formule "=MAX(SI(Activité!$G:$G=Bilan!H1;SI(Activité!$F:$F<>"";Activité!$B:$B;0);0))", c'est la date dernière date où Fred a effectué son dernier treuillage.

En utilisant la formule "=MAX(SI(Activité!$G:$G=Bilan!H1;SI(Activité!$F:$F>=3;Activité!$B:$B;0);0))", c'est la date où il a effectué plus de 3 treuillages.

Je ne sais pas comment rajouter la contrainte afin de connaitre la date à laquelle il a cumulé 3 treuillages minimum, car cela peut être sur 1, 2, 3 ou 4 missions.

Il se peut qu'il y ait des missions où il n'y ait aucun treuillage.

Il se peut qu'il y ait plusieurs missions à la même date.

Je vous remercie par avance

2essai-2.xlsx (14.22 Ko)

Bonjour,

Date du plus ancien des 3 derniers treuillages

... cela veut dire le dernier s'il y en a eu plus de 3 ?

Un essai ... tes données étant en tableau il est préférable de restreindre le calcul à la plage utile

=SIERREUR(INDEX(Tableau1[Date];GRANDE.VALEUR(SI(Tableau1[Nom]=B1;LIGNE(Tableau1[Nom])-LIGNE(Tableau1[[#En-têtes];[Nom]]);-1);1));"")
2essai-2.xlsx (14.39 Ko)

Cela ne marche pas car ça donne la date de la dernière mission.

Ce que je souhaiterais c'est que ce soit la date de la mission où il y a le plus ancien des 3 derniers treuillages effectués.

Plusieurs cas possible, pour chaque personne:

- Si lors de la dernière mission, il y a eu 3 treuillages ou plus

c'est cette date qui doit être inscrite.

- Si lors de la dernière mission, il y a eu moins de 3 treuillages, plusieurs cas possibles:

si la somme des treuillages de la dernière et de l'avant dernière mission est supérieur ou égale à 3 alors c'est la date de l'avant dernière mission qui doit être inscrite.

si la somme des treuillages de la dernière et de l'avant dernière mission est inférieur 3, on remonte en arrière pour réaliser la somme des treuillages de la dernière, avant dernière et avant avant dernière mission si la somme est supérieur ou égale à 3 alors c'est la date de l'avant avant dernière mission qui doit être inscrite.

Ainsi de suite...

Je voudrais traduire en formule ou vba le fait que si la dernière mission est supérieure ou égale à 3 c'est la date de la dernière qui doit être inscrite sinon on ajoute à celle-ci la précédente à chaque fois jusqu'à arriver à 3 ou +, et c'est la date de la mission la plus ancienne qui doit être inscrite.

Merci bien

ok, l'explication est maintenant plus complète ... je vais m'y atteler cet après-midi !

Avec une fonction macro car je n'ai pas réussi à finaliser une fonction excel qui devenait bien trop complexe !

Regarde si les résultats sont ceux que tu recherches ...

Function Treuillage(qui As Range, nh As Integer) As Variant
Treuillage = ""
n = 0
nom = qui.Value
With Sheets("Activité").ListObjects(1)
    For i = .ListRows.Count To 1 Step -1
        If .DataBodyRange.Cells(i, 6) = nom Then n = n + .DataBodyRange.Cells(i, 5)
        If n >= nh Then
            Treuillage = .DataBodyRange.Cells(i, 1)
            Exit Function
        End If
    Next
End With
End Function
3essai-2.xlsm (20.53 Ko)

Bonjour

Cela ne fonctionne pas si par exemple il y a 1 treuillages lors des 2 dernières missions.

Je te remercie pour ton aide mais j'ai trouvé avec une formule a rallonge...

=SI(RECHERCHEV(GRANDE.VALEUR(T_Activité[Date]*(T_Activité[USSH]=B$2);1);T_Activité[[Date]:[Nbre]];5;0)>=3;GRANDE.VALEUR(T_Activité[Date]*(T_Activité[USSH]=B$2);1);SI(RECHERCHEV(GRANDE.VALEUR(T_Activité[Date]*(T_Activité[USSH]=B$2);1);T_Activité[[Date]:[Nbre]];5;0)+RECHERCHEV(GRANDE.VALEUR(T_Activité[Date]*(T_Activité[USSH]=B$2);2);T_Activité[[Date]:[Nbre]];5;0)>=3;GRANDE.VALEUR(T_Activité[Date]*(T_Activité[USSH]=B$2);2);GRANDE.VALEUR(T_Activité[Date]*(T_Activité[USSH]=B$2);3)))

Merci encore

Cela ne fonctionne pas si par exemple il y a 1 treuillages lors des 2 dernières missions.

Ah si ! je ne peux pas te laisser dire cela.

Voir cas Vincent (à condition de réactualiser la formule)

Bravo pour ta formule ! tu as ajouté une colonne ?

7essai-2.xlsm (20.53 Ko)

Ça marche

Autant pour moi je croyais que la formule se réactualisait toute seule.

Autant pour moi aussi, j'aurais du ajouter

Application.Volatile

https://docs.microsoft.com/fr-fr/office/vba/api/excel.application.volatile

Mais bravo pour ta formule !

Suite mp ... tes colonnes ont changé dans le tableau car tu as intégré une colonne 1

Function Treuillage(qui As Range, nh As Integer) As Variant
Application.Volatile
Treuillage = ""
n = 0
nom = qui.Value
With Sheets("Activité").ListObjects(1)
    For i = .ListRows.Count To 1 Step -1
        If .DataBodyRange.Cells(i, 7) = nom Then n = n + .DataBodyRange.Cells(i, 6)
        If n >= nh Then
            Treuillage = .DataBodyRange.Cells(i, 2)
            Exit Function
        End If
    Next
End With
End Function

Bonjour

Au final ta proposition de macro est plus intéressante que ma formule qui ne fonctionne pas pour un cas particulier...

J'ai récupéré le code en ajoutant "application.volatile", j'ai renseigné les cellules avec "=Treuillage(B2;2)" mais la case reste vide, rien ne se passe.

J'ai oublié autre chose?

Merci bien

Tu as juste modifié la structure de ton tableau !

Voir plus haut ...

https://forum.excel-pratique.com/viewtopic.php?p=831083#p831083

Super

Merci bien

Rechercher des sujets similaires à "recherche date ancienne critere"