Extraction liste chronologique

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

  • Classeur1.xlsx
    12.7 KB · Affichages: 26

Jocelyn

XLDnaute Barbatruc
Bonjour le Forum,
Bonjour l'ami Efgé :),

Un essai en fichier chronologie des dates les colonnes K et M sont matricielles pas la L

Amicalement

EDIT : Bonjour l'ami CISCO
 

Pièces jointes

  • test efgé.xlsx
    15.9 KB · Affichages: 24

CISCO

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

Efgé

XLDnaute Barbatruc
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 :D

Merci à vous.
A+
Cordialement
 

job75

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

  • Classeur(1).xlsx
    19.6 KB · Affichages: 23

job75

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

  • Classeur(2).xlsx
    19 KB · Affichages: 19

job75

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

  • Classeur VBA(1).xlsm
    24.8 KB · Affichages: 16

job75

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

  • Classeur VBA(2).xlsm
    26.2 KB · Affichages: 21

job75

XLDnaute Barbatruc
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+
 

Discussions similaires

Statistiques des forums

Discussions
311 733
Messages
2 082 015
Membres
101 867
dernier inscrit
XFPRO