XL 2010 Formule date ancienne - récente SVP

  • Initiateur de la discussion Initiateur de la discussion ultra_v
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

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

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
 
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
 
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

Dernière édition:
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+
 
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:
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

Dernière édition:
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
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
20
Affichages
828
Réponses
2
Affichages
796
Réponses
10
Affichages
1 K
Retour