Copie ligne top 3

Bonjour à tous. Je vous sollicite une énième fois car je bloque complétement.

Mon problème est le suivant.

Chaque semaine, une base de donnée semblable à celle présente dans la Feuille1 du fichier que je vous joins est mis à jour. J'essaie de récupérer la ligne correspondant au top 3 en fonction de la colonne durée de la semaine 14 de l'année 2017 ( par exemple ).

J'ai dans un premier temps réussi à récupérer le top 3 :

Sub Top3()
Dim sh1, sh2

Set sh1 = Sheets("Feuil1")
Set sh2 = Sheets("Feuil2")

k = Range("J1").Value

 With sh1.ListObjects("Tableau1")
  .Range.AutoFilter Field:=7, Criteria1:="2017"
  .Range.AutoFilter Field:=6, Criteria1:="k"

 End With

 sh1.Cells.SpecialCells(xlCellTypeVisible).Copy sh2.Range("A1")

For i = 1 To 3
    sh2.Range("I" & i) = "Top " & i
    sh2.Range("J" & i).Formula = "=LARGE(" & Columns(3).Address & "," & i & ")"
Next

End Sub

Le problème étant que je n'arrive pas à sortir le top 3 en fonction de la semaine actuelle ( que je récupère grâce au " k " ), le code fonctionne seulement lorsque j'entre un nombre dans " criteria1 ". Il s'agit surement d'une erreur de syntaxe de ma part.

Ceci étant, après avoir récupéré ce " top 3 ", je ne vois pas comment récupérer la ligne correspondante.

J'espère avoir été assez clair dans mes explications

Si l'un d'entre vous avait une solution, ça m'aiderait beaucoup!

Merci d'avance pour vos réponses.

Bonjour,

Fichier ?

Et supprime tes foutus guillemets !!!

Petit oubli!

Voici le fichier

7top-3-test.xlsm (107.44 Ko)

Un tri permet de mettre dans l'ordre...

Adapté à ton classeur (une feuille), mais tu pourras réadapter...

Sub Top_3()
    Dim T(2, 1), a%, s%, lga%, lgs%
    With [Tableau1]
        .Sort key1:=.Cells(1, 7), order1:=xlAscending, key2:=.Cells(1, 6), order2:=xlAscending, _
         key3:=.Cells(1, 3), order3:=xlDescending, Header:=xlYes
        With .Worksheet
            a = .Range("K1"): s = .Range("L1")
        End With
        lga = WorksheetFunction.Match(a, .Columns(7), 0)
        lgs = WorksheetFunction.Match(s, .Columns(6).Offset(lga - 1), 0)
        lgs = lgs + lga - 1
        For s = 0 To 2
            T(s, 0) = .Cells(lgs + s, 1): T(s, 1) = .Cells(lgs + s, 3)
        Next s
        .Worksheet.Range("K2").Resize(3, 2).Value = T
    End With
End Sub

Merci pour ton aide MFerrand ! Pourrais-tu m'éclairer sur certains points de ton programme pour que je puisse l'adapter à mon fichier initial ? ( ce langage est tout récent pour moi, j'ai parfois quelques difficultés à tout saisir ).

Si j'ai bien compris le .Sort permet de trier en fonction de la colonne durée puis les lga et lgs permettent de récupérer l'année et la semaine correspondantes?

Serait-il possible d'automatiser l'extraction de ces top3 en fonction de la semaine actuelle ? Je m'explique : aujourd'hui nous sommes en semaine 20, j'aimerais que mon programme me sorte le top 3 de la semaine précédente (s19).

En tout cas merci de cette solution, ça me débloque un peu, faut que je potasse dessus!

Re bonjour,

Je vous joins un fichier plus représentatif de mon fichier initial. Malgré mes tentatives, je n'arrive pas à adapter votre code à mon fichier.

Désolé pour mon incompétence. J'apprends sur le tas mais malheureusement il me reste énormément de choses à assimiler.

8top-3-test-v2.xlsm (13.03 Ko)

Bonjour,

Pour adapter aisément, il faut au départ fournir un modèle dont la structure est rigoureusement conforme à l'original !

Le tri est fait sur 3 colonnes : année, semaine, durée. On a ainsi les semaines classées, et dans chaque semaine les durées dans l'ordre, il suffit alors de prendre les 3 premières lignes de chaque semaine.

Une semaine est définie par année-semaine. Tu fais apparaître ces deux éléments, de façon que la macro puisse les prélever.

Tu peux les faire apparaître par formule en fonction de la date...

Tu mets éventuellement un bouton pour lancer...

L'adaptation deviendra vite assez facile.

Tu parle de faire apparaître le top3 de la semaine précédant la semaine en cours. Je ne vois pas à quoi correspondent tes LIGNE3 et LIGNE7 ?

Cordialement.

Oui je pensais simplifier le truc en supprimant des colonnes mais au final pas du tout

les LIGNE3 et LIGNE7 correspondent à ma première colonne, dans mon vrai fichier, j'ai une quinzaine de " LIGNE ", j'ai besoin de sortir les top3 pour deux de celles-ci. Dans le fichier fictif transmis précédemment, cela correspond donc aux données de la première colonne qui vont de 1 à 7. Est-ce assez clair ?

Donc pour récapituler, il faudrait faire un tri sur la LIGNE( 1ère colonne), sur la semaine(14ème colonne), sur l'année(15ème colonne) et les classer en fonction de la durée (11ème colonne) si j'ai bien compris ?

Merci du temps passé sur mon problème!

Désolé, je ne dois pas être très réceptif aujourd'hui, mais ça m'échappe...

Je ne vois pas ce que vient faire la première colonne dont il n'était pas question jusqu'ici.

La question portait sur un top 3 sur la semaine...

Alors si on ajoute d'autres éléments, cela en fait une autre question !

Oui c'est bien ça sauf qu'en plus de la semaine, il me le faut par rapport à la 1ere colonne. Je reprends : il me faut le top 3, pour la semaine précédente et pour 2 " LIGNE " particulière ( données de la premiere colonne ).

Je pensais qu'en posant ma question comme je l'ai fait, je réussirais à adapter les réponses à mon projet mais malheureusement ce n'est pas le cas.

Désolé si j'ai plus compliqué le truc qu'autre chose

C'est un peu plus acrobatique...

Sub Top_3()
    Dim T(), Lg, s%, i%, j%, k%, g%, h%
    With [Tableau1]
        .Sort key1:=.Cells(1, 11), order1:=xlDescending, Header:=xlYes
        .Sort key1:=.Cells(1, 15), order1:=xlDescending, key2:=.Cells(1, 14), _
         order2:=xlDescending, key3:=.Cells(1, 1), order3:=xlAscending, Header:=xlYes
        Application.ScreenUpdating = False
        With .Worksheet
            .Range("S4:U6").ClearContents
            .Range("S11:U13").ClearContents
            Lg = Array(.Range("S2"), .Range("S9")): s = .Range("Q2")
        End With
        Do
            i = i + 1: j = i
            If i > .Rows.Count Then Exit Sub
        Loop While .Cells(i, 14) <> s
        Do While .Cells(j + 1, 14) = s
            j = j + 1
        Loop
        For g = 0 To 1
            ReDim T(2, 2)
            For k = i To j
                If .Cells(k, 1) = Lg(g) Then
                    For h = 0 To 2
                        If .Cells(k + h, 1) = Lg(g) Then
                            T(h, 0) = .Cells(k + h, 5)
                            T(h, 1) = .Cells(k + h, 2)
                            T(h, 2) = .Cells(k + h, 11)
                        Else
                            Exit For
                        End If
                    Next h
                    .Worksheet.Range("S4:U6").Offset(g * 7).Value = T
                    Exit For
                End If
            Next k
        Next g
    End With
End Sub

Début semblable : Tri, mais un peu différent : Année-Semaine (ordre décroissant), Ligne (croissant), Durée (décroissant).

De cette façon, la semaine cherchée, si elle existe sera dans le début du tableau.

Ensuite on cadre les lignes de début et fin de la semaine cherchée (avec les variables i et j).

Enfin, on boucle pour les résultats : boucle externe sur les 2 éléments d'un tableau Lg dans lequel on a consigné les Ligne cherchées. Pour chaque Ligne on boucle sur la zone semaine pour la trouver (boucle utilisant k). A partir de là, on boucle (avec h) pour récupérer les 3 premières lignes de la Ligne, en vérifiant à chaque fois qu'il s'agit bien de la Ligne cherchée. Puis affectation du tableau de résultats constitué.

Bonne soirée.

Merci c'est exactement ce qu'il me faut ! Petite dernière question avant de clôturer le sujet, je crains d'avoir encore fait une étourderie..

Si mes LIGNES ne sont pas seulement des nombres mais des chaines de caractère, est-il possible d'opérer de la même manière ?

Merci également pour tes explications, tout ça va m'aider à progresser !

Bonjour,

Un "simple" TCD faisait l'affaire avec l'utilisation de segments.

Avec un soupcon de VBA pour actualiser ce dernier.

Il aurait été judicieux d'inscrire des dates dans le fichier.

Cdlt.

Bonjour,

A-priori oui ! Il n'y a pas de type de données impératif pour les Lignes...

Salut Jean-Eric...

C'est alors moi qui n'ai pas compris comment tu consignes les LIGNES

boucle externe sur les 2 éléments d'un tableau Lg dans lequel on a consigné les Ligne cherchées

que j'aimerai pouvoir adapter à mes Lignes réelles caractérisées par des caractères.

Je vais m'y plonger dans l'après midi et reviens ici après avoir trouvé !

Bonjour Jean-Eric, j'avais essayé également avec un TCD mais sans vraiment parvenir au résultat souhaité

Merci encore à vous!

Regarde les cellules dans lesquelles tu as indiqué les Lignes ! Je les ai modifiées : les cellules ne contiennent que 3 et 7, la mention "LIGNE N°" est passée en format de cellule. Si tu mets du texte à la place, soit tu ne mets pas "LIGNE N°", soit tu le passes comme ici en format de cellule...

D'accord je vois!

En tout cas merci beaucoup pour l'énergie dépensée sur mon sujet!

Rechercher des sujets similaires à "copie ligne top"