Copie de cellule suivant critère de date la plus récente

Bonjour à toutes et tous,

Je me permets de vous solliciter pour une problématique que je n'arrive pas à résoudre du fait de mes compétences en Excel .

Je possède un tableau d'inventaire exporter sous Excel qui contient plusieurs l'ensemble de mes éléments gérés dans un stock.

En colonne B, j'ai le code de mes éléments et en colonne H, la date de mise à jour du tarif de cette éléments.

Je souhaiterai, si possible, lorsque j'ai un code identique, copier la ligne (de A à I) ayant la date de dernière dernière mise à jour la plus récente, soit un peu plus loin dans la feuille existante ou sur une nouvelle feuille

Je laisse un tableau en exemple, ce sera beaucoup plus parlant.

Je vous remercie d'avance pour votre aide

Michel

Bonjour et bienvenu sur le forum

Ci joint ma solution par macro

Les tableaux ont été transformé en tableau structuré

https://excel-pratique.com/fr/astuces/tableau-structure

A+ François

Bonjour à tous !

Une approche via Power Query :

  • Insertion d'un tableau structuré (tSource) pour intégrer vos données initiales.
  • Chargement et retraitement des données dans Power Query (nativement intégré dans Excel depuis 2016).
  • Restitution sous la forme d'une table.

Bonjour,

Comme tu possèdes xl2019, tu peux donc utiliser Power Query (PQ), nativement inclus dans cette version.

J'ai d'abord transformé ta plage de données en Tableau Structuré, nommé "T_Data"

Puis, j'ai fait une requête PQ, et restitué cette requête dans le 2ème onglet (nommé "Export Date Max"). Dans cette requête, on ne conserve que la dernière date de chaque "Code".

Pour mettre à jour, un clic droit dans la requête, "Actualiser", ou dans le ruban "Données", un clic sur "Actualiser tout"

Bonne fin d'apm (voisin?)

Edit, Damned, grillé de quelques secondes (mais pas tout à fait la même procédure)

Re-,

Quelques petites comparaisons :

- Méthode macro de Fanfan : 4.25 secondes

- Méthode Table.FirstN de JFL : 3.52 secondes

- Méthode Table.Max de votre serviteur : 3.52 secondes

Les 2 dernières mesures ont été effectuées après l'ouverture du fichier, soit sans connexion préalable déjà établie.

Si on refait ces requêtes une deuxième fois, on approche les 0.2 s

Bonne soirée à tous et à toutes

Bonsoir à tous !

@cousinhub : Hello !

C'est toujours riche d'enseignements cette comparaison. Merci

Par ailleurs votre Table.Max est une excellente idée puisque cette fonction intègre le tri. C'est étonnant que le temps de réponse soit identique.

Code amendé :

let
    Source = Excel.CurrentWorkbook(){[Name="tSource"]}[Content],
    Types = Table.TransformColumnTypes(Source,{{"Date maj tarif", type date}, {"P.A. Net", type number}}),
    Selection = Table.Group(Types, {"Code"}, {{"All", each Table.MaxN(_,"Date maj tarif",1), type table [Type=text, Code=text, Famille=text, Libellé commercial=text, #"Unité d'achat"=text, Unité de vente=text, P.A. Net=number, Date maj tarif=text, Quantité Stock=number]}}),
    Combine = Table.Combine(Selection[All])
in
    Combine

Hi,

C'est toujours riche d'enseignements cette comparaison. Merci

Par ailleurs votre Table.Max est une excellente idée puisque cette fonction intègre le tri. C'est étonnant que le temps de réponse soit identique.

Je comprends qu'une nouvelle mesure est quémandée????

Eh ben, tout pareil...

Bonjour à tous,

Moi aussi je veux participer

let
    Source = Excel.CurrentWorkbook(){[Name="Tableau1"]}[Content],
    Group = Table.Group(Source, {"Code"}, {{"tbl", each 
        let 
            Tr = Table.TransformColumnTypes(_,{{"Date maj tarif", type date}}),
            Tri = Table.FirstN(Table.Sort(Tr,{{"Date maj tarif", Order.Descending}}),1)
        in
            Tri}}),
    Expand = Table.Combine(Group[tbl])
in
    Expand

Bonsoir à tous de nouveau !

Eh ben, tout pareil...

Ce n'est pas illogique. Puisque que le Table.Max intègre le tri préalable (deux en un )

Je pensais que le double appel de ma requête originelle (Table.Sort + Table.FirstN) pénaliserait la vélocité. Cela ne semble pas être le cas. Comme quoi.....

Hello, bienvenue dans le Game

Bonjour à tous,

Moi aussi je veux participer

Résultat : 3.67 secondes

Bien joué, également

RE,

Merci pour le calcul

J'avais pas regardé vos propositions au départ.

J'ai utilisé les mêmes fonctions que JFL mais l'imbrication let/in fait ralentir ma requête de 0.15 !

Merci à tous pour vos réponses très rapide !!

Je vais regarder avec grande attention, l'idée étant de comprendre vos méthodes, pour éviter de vous solliciter l'année prochaine !!

CousinHub, voisin peut-être, je suis à Quimper :)

Encore merci

Hello,

CousinHub, voisin peut-être, je suis à Quimper :)

Et moi, chez les co-leaders de la Ligue des Champions...

Pour l'année prochaine, si tu fais comme on a dit (-> mettre ta plage de données sous forme de TS, lui donner le même nom qu'on a donné - selon ton choix), pas de soucis à prévoir.

@JB_, peut-être que transformer les types dans le "let..in" est superfétatoire?

Bonne soirée

Bonjour Michel_29 et bienvenue sur XLP ,

Bon, moi aussi je ne veux pas rester tout seul dans mon coin. Je vous en prie, prenez moi dans votre équipe même si c'est juste pour couper les citrons à la mi-temps .

Un autre code VBA relativement rapide (0,15 sec. env. sur ma bécane). Le résultat est transformé en TS nommé "MajTarif".

Le code est dans le module de la feuille "Export Inventaire". Cliquez sur le bouton "Hop".

Sub DerniereMAJ()
Dim t, ref, n&, i&, j&, deb#
   deb = Timer: Application.ScreenUpdating = False
   [k1].CurrentRegion.Clear
   t = Intersect([a1].CurrentRegion, Columns("h:i")).Value
   For i = 2 To UBound(t): t(i, 1) = IIf(Right(t(i, 1), 4) = "1899", CDate("01/01/1900"), CDate(t(i, 1))): Next i
   Range("h1").Resize(UBound(t), UBound(t, 2)) = t
   [k1].CurrentRegion.Clear
   Columns("a:i").Copy Columns("k:k")
   [k1].CurrentRegion.Sort key1:=[L1], order1:=xlAscending, key2:=[r1], order2:=xlDescending, Header:=xlYes, MatchCase:=False
   t = [k1].CurrentRegion
   n = 2: ref = t(2, 2)
   For i = 3 To UBound(t)
      If t(i, 2) <> ref Then: n = n + 1: For j = 1 To UBound(t, 2): t(n, j) = t(i, j): Next: ref = t(i, 2)
   Next i
   [k1].CurrentRegion.Clear
   [k1].Resize(n, UBound(t, 2)) = t
   Me.ListObjects.Add SourceType:=xlSrcRange, Source:=[k1].CurrentRegion, XlListObjectHasHeaders:=xlYes, TableStyleName:="TableStyleMedium26"
   Me.[k1].ListObject.Name = "MajTarif": Me.[k1].ListObject.Range.Borders.LineStyle = xlContinuous
   MsgBox Format(n, "#,##0") & " enregistrements restants en " & Format(Timer - deb, "#,##0.00\ sec.")
End Sub

Bonjour Michel_29 ,

Suite à votre MP, voici le code avec commentaires.

J'ai ajouté une deuxième méthode v2 dont le code est plus court. Les codes des deux versions sont commentés.

Rechercher des sujets similaires à "copie suivant critere date recente"