XL 2010 Formule date ancienne - récente SVP

ultra_v

XLDnaute Occasionnel
bonjour ,
mon tableau se présente comme suite :


REF client Commande Date resultat demandé
2 a 10/12/2015 16/10/2000 Au 01/01/2018
2 b 16/10/2000 16/10/2000 Au 01/01/2018
2 dd 14/01/2017 16/10/2000 Au 01/01/2018
2 b 01/01/2018 16/10/2000 Au 01/01/2018

dans la colonne D je souhaite faire la date la plus ancienne jusqu'à la date la plus récente
d'avance merci
tableau dans la piece jointe
 

Pièces jointes

  • test.xlsx
    8.6 KB · Affichages: 47

JHA

XLDnaute Barbatruc
Bonjour à tous,

A essayer
Code:
=TEXTE(PETITE.VALEUR(SI($A$2:$A$12=$A2;$C$2:$C$12);1);"JJ/MM/AAAA")&" au "&TEXTE(GRANDE.VALEUR(SI($A$2:$A$12=$A2;$C$2:$C$12);1);"JJ/MM/AAAA")
Formule matricielle

JHA
 

Pièces jointes

  • test (2).xlsx
    9.2 KB · Affichages: 23

ultra_v

XLDnaute Occasionnel
bonjour ,
merci pour votre aide
j'ai essayé d'appliquer les mémes formules sur une base de donnée de 20.000 articles mais ça n'a pas marché mes articles comptent des références de 8 chiffres
sur l'exemple ci-attaché j'ai remplacé la référence N°2 par la réfèrence 88977778 ça n'a pas marché je ne sais pas pourquoi merci beaucoup
 

JHA

XLDnaute Barbatruc
Bonjour à tous,
Pour les références, tu mets ce que tu veux, cela n'a pas d'importance. les formules proposées donnent la date mini et la date maxi de la référence.
Par contre ce sont des matricielles donc à valider par Ctrl+Maj+Entrée, après validation par les 3 touches, les accolades se mettent tout seul de part et d'autre de la formule.
Comme le dit notre ami Gosselien:), le temps de calcul risque d'être un peu long pour 20000 lignes.

JHA
 

job75

XLDnaute Barbatruc
Bonjour ultra_v, JHA, Jocelyn, gosselien,

Une solution VBA avec cette macro dans le code de la feuille (clic droit sur l'onglet et Visualiser le code) :
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim t, d As Object, i&, s
t = [A1].CurrentRegion.Resize(, 5)
Set d = CreateObject("Scripting.Dictionary")
For i = 2 To UBound(t)
    If IsDate(t(i, 3)) Then
        If d.exists(t(i, 1)) Then
            s = Split(d(t(i, 1)), " Au ")
            d(t(i, 1)) = IIf(t(i, 3) < CDate(s(0)), t(i, 3), s(0)) & " Au " & IIf(t(i, 3) > CDate(s(1)), t(i, 3), s(1))
        Else
            d(t(i, 1)) = t(i, 3) & " Au " & t(i, 3)
        End If
    End If
Next
For i = 2 To UBound(t)
    If IsDate(t(i, 3)) Then t(i, 4) = d(t(i, 1)) Else t(i, 4) = ""
Next
'---restitution---
If FilterMode Then ShowAllData 'si la feuille est filtrée
Application.EnableEvents = False
[D1].Resize(i - 1) = Application.Index(t, , 4)
Application.EnableEvents = True
End Sub
Fichier .xlsm joint.

Edit : testé sur 20 000 lignes, l'exécution se fait chez moi en 0,52 seconde.

A+
 

Pièces jointes

  • test(1).xlsm
    22.8 KB · Affichages: 40
Dernière édition:

job75

XLDnaute Barbatruc
Bonjour gosselien,

C'est la 1ère fois qu'on me fait cette remarque.

Normalement quand on est dans le code de la feuille il est inutile de préciser la feuille (Me).

Si le code est dans un module standard il faut bien sûr la préciser :
Code:
If ActiveSheet.FilterMode Then ActiveSheet.ShowAllData 'si la feuille active est filtrée
A+
 

job75

XLDnaute Barbatruc
Re,

Pour obtenir un temps de calcul plus acceptable sur 20 000 lignes il faut :

- trier le tableau sur la colonne A (REF client)

- entrer en D2 la formule (normale) :
Code:
=SI(LIGNE()>EQUIV(A2;A:A;0);RECHERCHEV(A2;A$2:D$20000;4;0);TEXTE(MIN(DECALER(C$1;EQUIV(A2;A$2:A$20000;0);;NB.SI(A$2:A$20000;A2)));"jj/mm/aaaa")&" au "&TEXTE(MAX(DECALER(C$1;EQUIV(A2;A$2:A$20000;0);;NB.SI(A$2:A$20000;A2)));"jj/mm/aaaa"))
Durée des calculs chez moi :

4 références client uniques => 2,6 secondes
1000 références client uniques => 5,5 secondes
5000 références client uniques => 13,3 secondes
10000 références client uniques => 23,4 secondes
19999 références client uniques => 43 secondes

A+
 
Dernière édition:

job75

XLDnaute Barbatruc
Bonsoir à tous,

Cette solution par formule est rapide :

- trier le tableau sur la colonne A (REF client) puis sur la colonne C (Date) en ordre croissant

- entrer en D2 la formule (normale) :
Code:
=SI(A1=A2;D1;TEXTE(RECHERCHEV(A2;A$2:C$20000;3;0);"jj/mm/aaaa")&" au "&TEXTE(RECHERCHEV(A2;A$2:C$20000;3);"jj/mm/aaaa"))
Fichier joint.

Sur 20 000 lignes :

- 4 références client uniques => 0,15 seconde
- 19999 références client uniques => 1,6 seconde.

A+
 

Pièces jointes

  • test formule(1).xlsx
    15.5 KB · Affichages: 28
Dernière édition:

eriiic

XLDnaute Barbatruc
Bonjour,

celle-ci est un peu plus lente, mais ne nécessite qu'un tri des REF client comme fait actuellement :
Code:
=TEXTE(MIN(DECALER($C$1;EQUIV(A2;A:A;0)-1;;NB.SI(A:A;A2)));"jj/mm/aaaa")&" au"&TEXTE(MAX(DECALER($C$1;EQUIV(A2;A:A;0)-1;;NB.SI(A:A;A2)));"jj/mm/aaaa")
eric
 

Discussions similaires

Réponses
2
Affichages
512

Statistiques des forums

Discussions
312 164
Messages
2 085 877
Membres
103 009
dernier inscrit
dede972