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 SubLe 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,
Et supprime tes foutus guillemets !!!
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.
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 SubDé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
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
que j'aimerai pouvoir adapter à mes Lignes réelles caractérisées par des caractères.boucle externe sur les 2 éléments d'un tableau Lg dans lequel on a consigné les Ligne cherchées
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 !
D'accord je vois!
En tout cas merci beaucoup pour l'énergie dépensée sur mon sujet!