Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Extraction liste chronologique

  • Initiateur de la discussion Initiateur de la discussion Efgé
  • 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 !

Efgé

XLDnaute Barbatruc
Bonjour à toutes et tous 🙂

Me revoilà aux prises avec les formules matricielles.....
Je voudrais extraire une liste de noms dont la colonne date est à venir sur les douzes prochains mois.
Il pourrait y avoir des doublons (tant en terme de dates que de noms) qui sont a conserver.
La liste d'origine ne sera jamais triée comme il faut (ce serait trop simple) d'où, je pense, la nécessité d'une matricielle

Dans le fichier joint, l'extraction que j'ai réussi à faire (merci Rachid 😉 )
Evidement je suis incapable de modifier pour retrouver le classement de la date la plus proche à la plus lointaine......

Si vous avez une solution, à votre bon cœur m'sieurs dames.

Cordialement
 

Pièces jointes

Bonjour à tous

Ca y est, Efgé, j'ai compris ta demande... Et puisque que Jocelyn y a répondu... et comme je n'ai pas plus court.
@ Jocelyn : pas mal ta solution, classer les dates d'abord (la colonne de droite donc), et ensuite mettre les noms par rapport à ces dates...

@ plus
 
Bonjour CISCO 🙂 Salut Jocelyn 🙂

Ta version, Jocelyn, est parfaite. Merci (comme d'hab ... )
Cisco, c'est vrai que ma demande n'était peut être pas assez détaillée. merci de t'être penché sur mon cas.

C'est là qu'on est content de pouvoir compter sur les amis 😀

Merci à vous.
A+
Cordialement
 
Bonjour Fred, heureux de te revoir, salut CISCO et Jocelyn,

Une formule matricielle un peu lourde en G4 mais unique pour être propagée sur tout le tableau :
Code:
=SIERREUR(INDEX(Tableau1;EQUIV(PETITE.VALEUR(SI((Tableau1[date]<=DATE(ANNEE(AUJOURDHUI());MOIS(AUJOURDHUI())+13;0))*(Tableau1[date]>AUJOURDHUI());Tableau1[date]+LIGNE(Tableau1)/"1E9");LIGNES($1:1));Tableau1[date]+LIGNE(Tableau1)/"1E9";0);EQUIV(G$3;Tableau1[#En-têtes];0));"")
Fichier joint.

A+
 

Pièces jointes

Re,

Mais l'intérêt d'une formule unique c'est qu'on peut la valider matriciellement en bloc sur toute la plage :
Code:
=SIERREUR(INDEX(Tableau1;EQUIV(PETITE.VALEUR(SI((Tableau1[date]<=DATE(ANNEE(AUJOURDHUI());MOIS(AUJOURDHUI())+13;0))*(Tableau1[date]>AUJOURDHUI());Tableau1[date]+LIGNE(Tableau1)/"1E9");LIGNE(Tableau1)-LIGNE(Tableau1[#En-têtes]));Tableau1[date]+LIGNE(Tableau1)/"1E9";0);EQUIV(G3:I3;Tableau1[#En-têtes];0));"")
Et là c'est bien plus rapide => 0,8 ms.

Fichier (2).

Nota : pour déterminer les durées j'ai utilisé cette macro :
Code:
Sub Durée()
Dim t, i&
t = Timer
For i = 1 To 1000
Calculate
Next
MsgBox Timer - t 'en millisecondes
End Sub
A+
 

Pièces jointes

Re,

Pour finir revenons à nos amours hein Fred, du VBA très classique :
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim t, dat1, dat2, i&, dat, n&
t = [Tableau1].Resize(, 3)
dat1 = Date
dat2 = DateSerial(Year(dat1), Month(dat1) + 13, 0)
For i = 1 To UBound(t)
    dat = t(i, 2)
    If dat > dat1 And dat <= dat2 Then
        n = n + 1
        t(n, 1) = t(i, 1): t(n, 2) = t(i, 3): t(n, 3) = dat
    End If
Next
Application.ScreenUpdating = False
Application.EnableEvents = False
With Range("G4:I" & Rows.Count) 'à adapter
    .ClearContents 'RAZ
    If n Then
        .Resize(n) = t
        .Resize(n).Sort [I4], xlAscending, Header:=xlNo 'tri sur les dates
    End If
End With
Application.EnableEvents = True
End Sub
La macro est très rapide car on utilise un tableau VBA.

Fichier joint.

A+
 

Pièces jointes

Re,

Pour que le tableau soit mis à jour à chaque changement de jour il faut mettre =AUJOURDHUI() (fomule volatile) dans une cellule et utiliser la macro Worksheet_Calculate :
Code:
Private Sub Worksheet_Calculate()
Dim t, dat1, dat2, i&, dat, n&
t = [Tableau1].Resize(, 3)
dat1 = Date
dat2 = DateSerial(Year(dat1), Month(dat1) + 13, 0)
For i = 1 To UBound(t)
    dat = t(i, 2)
    If dat > dat1 And dat <= dat2 Then
        n = n + 1
        t(n, 1) = t(i, 1): t(n, 2) = t(i, 3): t(n, 3) = dat
    End If
Next
Application.ScreenUpdating = False
Application.EnableEvents = False
With Range("G4:I" & Rows.Count) 'à adapter
    .ClearContents 'RAZ
    If n Then
        .Resize(n) = t
        .Resize(n).Sort [I4], xlAscending, Header:=xlNo 'tri sur les dates
    End If
End With
Application.EnableEvents = True
Application.ScreenUpdating = True
End Sub
Fichier (2).

On s'aperçoit que le recalcul prend beaucoup plus de temps que celui des formules => 24 ms.

Mais ici on efface et entre des données, ce n'est pas comparable, il faudrait tester sur un grand tableau.

A+
 

Pièces jointes

Re,

Pour que la comparaison soit valable j'ai donc copié-collé le tableau source sur 10 400 lignes.

Ma formule du post #8 entrée matriciellement sur G4:I2403 se recalcule en 3,9 secondes.

La Worksheet_Calculate du post précédent s'exécute en 0,09 seconde, y a pas photo.

A+
 
Bonjour à tous, Bonjour job75 🙂
Merci job de t'être "beaucoup" penché sur le sujet.
Cette fois ci pas de VBA pour le projet... mais il est toujours intéressant de voir tes propositions

Cordialement
 
- 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
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…